2020-06-12 19:47:00 by scott
web开发今天主要讲述怎么在web开发中使用redis,特别是异步框架sanic中。
一般为了加快接口响应速度,服务端会加一层缓存层,即使用redis缓存数据。
实现思路:
当前接收到请求后,现在从redis中获取数据,如果获取不到再从原始数据源获取,比如MySQL、Druid等等。
然后把得到的结果再反写redis。对有时效性的数据,同时设置过期时间。
由于普通的redis框架是同步的,比如redis-py。在Sanic中无法使用,幸好已经前人开发了响应的包。
可用的包有:
pip install asyncio-redis
pip install aioredis
pip install aredis
这里使用的是aredis,具体方法如下:
在使用这个包的时候还踩了坑:由于我这是redis集群,建立连接后,设置值的时候无法设置过期时间,后来终于找到方法。
最终解决方案如下,注意cache_client方法,它返回的连接是可以设置过期时间的。
#!/usr/bin/env python
"""
FileName: pub_redis
Author: deepinwst
Email: wanshitao@donews.com
Date: 2020/6/12 11:16:31
"""
import asyncio
from aredis import StrictRedisCluster
from aredis.cache import Cache
from sanic.log import logger
from config import REDIS_NODES
class RedisApi(object):
@classmethod
def redis_conn(cls, startup_nodes=REDIS_NODES, max_connections=1000):
redisObject = None
try:
redisObject = StrictRedisCluster(startup_nodes=startup_nodes, max_connections=max_connections)
except Exception as e:
logger.error("redis conn error : %s" % e)
return redisObject
@classmethod
def cache_client(cls):
conn = cls.redis_conn()
client = Cache(conn)
return client
async def main():
conn = RedisApi.redis_conn()
val = await conn.delete("di-test:xxx")
print(val)
conn_cluster = RedisApi.cache_client()
res = await conn_cluster.set("di-test:xxx", "hello", expire_time=60)
print(res)
return val
if __name__ == "__main__":
asyncio.get_event_loop().run_until_complete(main())
至于在代码怎么实现缓存,每个项目都不一样。如果别的问题,欢迎留言!