mirror of
https://github.com/django/django.git
synced 2025-10-23 21:59:11 +00:00
Fixed #28977 -- Changed local-memory cache to use LRU culling.
LRU culling turns every read into a kind of write to the cache: cache keys are moved to the first position in the OrderedDict when they are retrieved. The RWLock which permitted multiple readers while prioritizing a single writer is obsolete since all accesses are now writes.
This commit is contained in:
50
tests/cache/tests.py
vendored
50
tests/cache/tests.py
vendored
@@ -1084,11 +1084,16 @@ class PicklingSideEffect:
|
||||
self.locked = False
|
||||
|
||||
def __getstate__(self):
|
||||
if self.cache._lock.active_writers:
|
||||
self.locked = True
|
||||
self.locked = self.cache._lock.locked()
|
||||
return {}
|
||||
|
||||
|
||||
limit_locmem_entries = override_settings(CACHES=caches_setting_for_tests(
|
||||
BACKEND='django.core.cache.backends.locmem.LocMemCache',
|
||||
OPTIONS={'MAX_ENTRIES': 9},
|
||||
))
|
||||
|
||||
|
||||
@override_settings(CACHES=caches_setting_for_tests(
|
||||
BACKEND='django.core.cache.backends.locmem.LocMemCache',
|
||||
))
|
||||
@@ -1144,6 +1149,47 @@ class LocMemCacheTests(BaseCacheTests, TestCase):
|
||||
cache.decr(key)
|
||||
self.assertEqual(expire, cache._expire_info[_key])
|
||||
|
||||
@limit_locmem_entries
|
||||
def test_lru_get(self):
|
||||
"""get() moves cache keys."""
|
||||
for key in range(9):
|
||||
cache.set(key, key, timeout=None)
|
||||
for key in range(6):
|
||||
self.assertEqual(cache.get(key), key)
|
||||
cache.set(9, 9, timeout=None)
|
||||
for key in range(6):
|
||||
self.assertEqual(cache.get(key), key)
|
||||
for key in range(6, 9):
|
||||
self.assertIsNone(cache.get(key))
|
||||
self.assertEqual(cache.get(9), 9)
|
||||
|
||||
@limit_locmem_entries
|
||||
def test_lru_set(self):
|
||||
"""set() moves cache keys."""
|
||||
for key in range(9):
|
||||
cache.set(key, key, timeout=None)
|
||||
for key in range(3, 9):
|
||||
cache.set(key, key, timeout=None)
|
||||
cache.set(9, 9, timeout=None)
|
||||
for key in range(3, 10):
|
||||
self.assertEqual(cache.get(key), key)
|
||||
for key in range(3):
|
||||
self.assertIsNone(cache.get(key))
|
||||
|
||||
@limit_locmem_entries
|
||||
def test_lru_incr(self):
|
||||
"""incr() moves cache keys."""
|
||||
for key in range(9):
|
||||
cache.set(key, key, timeout=None)
|
||||
for key in range(6):
|
||||
cache.incr(key)
|
||||
cache.set(9, 9, timeout=None)
|
||||
for key in range(6):
|
||||
self.assertEqual(cache.get(key), key + 1)
|
||||
for key in range(6, 9):
|
||||
self.assertIsNone(cache.get(key))
|
||||
self.assertEqual(cache.get(9), 9)
|
||||
|
||||
|
||||
# memcached backend isn't guaranteed to be available.
|
||||
# To check the memcached backend, the test settings file will
|
||||
|
||||
Reference in New Issue
Block a user