Redis 服务器用途非常广泛,例如我们可以基于 Redis 服务器实现缓存系统。缓存系统可以缓解客户端访问压力,当缓存有效时只需直接将缓存结果返回给客户端而不用执行真正的后端逻辑。尝试在 Python 中实现一个简单的缓存系统。
要求条件:
- 假设缓存的结果都是 Python 字典,通过 json 进行序列化和反序列化
- 确保实验环境的 Redis 服务器已经启动
cache.py 文件中实现一个缓存系统类,类名称为 RedisCache ,可以通过 RedisCache.cache
方法装饰一个函数并缓存函数的执行结果
参考代码:
import json
from functools import wraps
# 该类用于生成针对某个 Redis 服务器的实例
# 实例的 cache 方法的返回值为装饰器
class RedisCache:
def __init__(self, redis_client):
self._redis = redis_client
def cache(self, timeout=0):
def decorator(func):
@wraps(func)
def wrap(*args, **kw):
if timeout <= 0:
return func(*args, **kw)
key = func.__name__
raw = self._redis.get(key)
if not raw:
value = func(*args, **kw)
self._redis.setex(key, timeout, json.dumps(value))
return value
return json.loads(raw.decode())
return wrap
return decorator
RedisCache 的使用示例如下:
cache = RedisCache(r)
@cache.cache(timeout=10)
def execute():
pass
初始化 RedisCache 后,可以通过 cache.cache(timeout=10)
方式装饰函数 execute
,意思是说首次执行 execute 函数时其结果会被缓存 10 秒,10 秒内访问都直接返回缓存结果,10 秒后再访问时 execute 函数将重新执行。
-
Redis 中可以指定一个 key 的生存时间,生存时间结束 key 就会被删除
- 缓存和获取缓存时,需要进行序列化和反序列化处理