缓存可以有效的提高关键数据获取的速度,使得不必每次都查询数据库,避免了数据库被击穿。在获得这些好处的同时,也要考虑缓存的更新问题。假设你所缓存的数据,是有一定时效性的,比如7天,7天之后这份数据就失效了,你应该重新获取数据。
那么,7天以后,你应该怎样去更新缓存数据呢?有两个简单的思路,一个是主动更新,一个是被动更新。
先来说主动更新,你需要知道这份数据的失效时间点,然后在那个时间点到来时重新获取数据,可能是查询数据库,也可能是访问第三方接口,在获得数据之后,更新redis中的缓存。
被动更新,你的程序每次都去redis获取数据,但对这份数据设置了一个失效时间,7天失效后,无法从redis获取到数据的情况下,通过查询数据库或者访问第三方接口重新获得数据,并更新redis里的缓存,最后,设置数据过期时间为7天。
相比较而言,被动更新是更为稳妥可靠简单的方法,主动更新要求你知道每一条数据的具体过期时间,在即将过期之间去更新缓存,这样做无疑增加了服务的复杂程度,你可能需要一个单独的进程来完成这个过程。而被动更新只需要在代码里对reids缓存失效做一下更新处理就可以,大部分时间里它都是有效的,直到数据过期,你的更新缓存的代码才会被执行。
设置redis的key的过期时间有两种方式,一种方式是指定多少秒以后过期,另一种方式是在指定时间过期,先来看第一种方式的例子
from redis.client import Redis
r = Redis(host='127.0.0.1', port=6379, db=0, password='密码')
r.set('foo', 'ok')
r.expire('foo', 3)
time.sleep(2)
print(r.get('foo'))
time.sleep(1.5)
print(r.get('foo'))
设置foo 3秒钟以后过期,程序sleep2秒后可以从redis中获取数据,又一次sleep1.5后,显然已经超过了3秒的时间,key已经过期,查不到任何数据。
设置指定的过期时间
import time
from datetime import datetime, timedelta
from redis.client import Redis
r = Redis(host='127.0.0.1', port=6379, db=0, password='198671724zds')
r.set('foo', 'ok')
r.expireat('foo', datetime.now() + timedelta(seconds=5))
time.sleep(4)
print(r.get('foo'))
time.sleep(1.5)
print(r.get('foo'))
我设置了一个具体的过期时间,为了方便,我用当前时间加5秒作为指定的过期时间,第二个参数的数据类型必须为datetime。
QQ交流群: 211426309