fix cache

This commit is contained in:
xuyue committed 2026-05-07 19:56:16 -06:00
1 parent fb18fdb369
commit 47d6456ebc
2 files changed
+59

No files matched your search

+9
View File
@@ -11,6 +11,15 @@ class MyRedisClient(DefaultClient):
client = self.get_client(write=True)
return getattr(client, item)
def hget(self, name, key, version=None, client=None):
if client is None:
client = self.get_client(write=True)
nkey = self.make_key(key, version=version)
value = client.hget(name, nkey)
if value is None:
return None
return self.decode(value)
def redis_incr(self, key, count=1):
"""
django 默认的 incr 在 key 不存在时候会抛异常
+50
View File
@@ -0,0 +1,50 @@
from types import SimpleNamespace
from unittest import TestCase
from django.conf import settings
if not settings.configured:
settings.configure(
DJANGO_REDIS_CONNECTION_FACTORY="django_redis.pool.ConnectionFactory",
)
from utils.cache import MyRedisClient
from utils.throttling import TokenBucket
class FakeRedis:
def __init__(self):
self.hashes = {}
def hset(self, name, key, value):
self.hashes.setdefault(str(name), {})[str(key)] = value
return 1
def hget(self, name, key):
return self.hashes.get(str(name), {}).get(str(key))
def make_client():
backend = SimpleNamespace(
key_prefix="",
version=1,
key_func=lambda key, key_prefix, version: key,
)
client = MyRedisClient("redis://localhost:6379/0", {}, backend)
fake_redis = FakeRedis()
client.get_client = lambda write=True: fake_redis
return client
class TokenBucketCacheTests(TestCase):
def test_token_bucket_reads_values_written_through_django_redis_hash_api(self):
bucket = TokenBucket(
key="submission:user:1",
capacity=2,
fill_rate=0.1,
default_capacity=2,
redis_conn=make_client(),
)
self.assertEqual(bucket.consume(), (True, 0))
self.assertEqual(bucket.consume(), (True, 0))