1.Redis的key中为什么要设置时间?
在Redis的命名中,通常会在当日有效的key中,从业务方会在key中加上日期时间等;例如
HELLOWORLD_190707
表示这是今天有效的。然后为了防止Redis集体过期,当日过期时间通常是凌晨12点加上一个随机数。
这里就涉及到雪崩效应。
什么是缓存的雪崩效应?
正常逻辑下,当用户查找缓存中数据key没有找到时候,会去数据库查找数据。如果当大量本应该到缓存的请求被放到数据库中,例如缓存集体过期,缓存未存入等,会给数据库和CPU带来大量的压力,进一步会造成数据库崩溃,系统崩溃。
也就是说的一个缓存穿透现象——请求没有经过缓存,直接请求到数据库。
解决方法:
1.不同的key设置不同的过期时间,让失效时间均匀分布。
2.至于限流,服务器降级,熔断处理等,都可以作为补充使用。
2.如何避免缓存穿透?
缓存穿透现象:请求没有经过缓存,直接请求到数据库。通常,公司内部系统这些是可以不考虑的,这里就指外部系统。
业务场景:用户获取了一个key,通过这个key请求缓存,如果缓存中存在就返回给用户,如果不缓存中不存在就查找数据库,数据库中存在就返回给用户并写入缓存;数据库中不存在最后返回空值。
BUT...这种设计场景有漏洞。
a) 场景一
如果恶意用户伪造了一个虚假的key值,那么通过大量的虚假key就可以达到不断请求数据库的效果,从而导致雪崩现象。
解决方法:
针对查找缓存的key值做限定算法,规定只有符合特定规则的key才可以查找缓存。
b)场景二
如果恶意用户伪造出来的key恰好符合规则呢,那么从数据库角度,如果在数据库中查找不到这个key值,就往redis中新建一个这个key值,并且写入不存在的数据。当恶意用户下次调用这个key的查找请求之后,会直接到缓存中查找,也就是阻断数据库和用户的交互。
3.缓存版本
之前有遇到一个问题。产品在测试环境中是好的但是到了线上环境是有bug的。
测试环境和线上环境的环境配置不一样也是其中一个因素。
例如测试环境中缓存的版本较高,线上环境使用的第三方服务的缓存版本较低,导致高版本的方法在低版本不匹配。