redis应用场景--缓存过期时间
缓存可以有效的提高关键数据的获取速度,使得不必要每次查询数据库,避免了数据库被击穿。
主动更新:
需要知道这份数据的实效时间点,然后在那个时间点到来时重新更新数据,可能是查询数据库,也可能是访问第三接口,在获得数据之后,更新redis缓存。
被动更新:
程序每次都去redis获取数据,但对这份数据设置了一个实效时间,X时间失效后,无从从redis获取到数据的情况下,通过查询数据库或者访问第三方接口重新获得数据,并更新redis缓存,最后,设置数据过期时间为X
相比较而言,被动更新是更为稳妥可靠简单的方法,主动更新要求你知道每一条数据的具体过期时间,在即将过期之间去更新缓存,这样做无疑增加了服务的复杂程度,你可能需要一个单独的进程来完成这个过程。而被动更新只需要在代码里对reids缓存失效做一下更新处理就可以,大部分时间里它都是有效的,直到数据过期,你的更新缓存的代码才会被执行。
设置redis的key的过期时间有两种方式,一种方式是制定多少秒以后过期,另一种方式是在指定时间过期。下面我将分别采用golang和python分别实现这两种方式
Python:
from redis.client import Redis import time conn = Redis(host="0.0.0.0",port=6379,db=0,password="") conn.set("key1","value1") conn.expire("key1",5) print(conn.get("key1")) time.sleep(3) print(conn.get("key1").decode(encoding="utf-8")) time.sleep(3) if conn.get("key1") != None: print(conn.get("key1").decode(encoding="utf-8")) else: print("key1 已过期")
输出结果:
b'value1'
value1
key1 已过期
第二种方式:
conn.set("test_key","test_value") conn.expireat("test_key",datetime.now()+timedelta(seconds=5)) time.sleep(4) print("数据有效:",conn.get("test_key").decode(encoding="utf-8")) time.sleep(2) if conn.get("test_key") != None: print(conn.get("test_key").decode(encoding="utf-8")) else: print("数据过期") 输出结果: 数据有效: test_value 数据过期