Redis代替session需要注意:
1.选择合适的数据结构
2.选择合适的key
3.选择合适的存储粒度
Redis缓存策略一般采用先更新数据库后删除缓存,原因是无论先删除缓存还是后删除缓存都有线程安全的风险,但是后删除缓存的发生风险的概率小到可以忽略不计,
因为缓存的更新是微秒级的,理论上首先在缓存要突然失效时,A线程查询数据库获取到旧数据,并缓存更新的时间段内,
B线程将新的数据在数据库里面更新并执行完缓存的删除操作之后,A线程再将旧数据写入缓存内,才会发生线程安全问题,但A线程更新缓存的时间极短,
这段时间不足以让B线程执行完操作,所以这个概率极小。
同时还需要保证数据库与缓存操作的原子性,单体系统通过事务机制解决,分布式系统利用分布式事务机制解决。
缓存穿透
1.缓存一个空对象,每次返回一个空,缺点就是有效期内有额外的内存开销。可能会短期内的数据不一致
2.布隆过滤
在redis前加一个布隆过滤器,原理是数据库里面的数据基于某种哈希算法得到哈希值,再将哈希值转化为二进制位,保存到布隆过滤器里。有点是数据量小,
不用保存多余的key,缺点是实现复杂,有误判的可能。
实际使用一般用第一种方案
其他还有考虑增加id复杂度,避免被猜到规矩,做好数据的基础格式校验,加强用户权限,做好热点参数限流比如空值这种
缓存雪崩
同时大量key失效或者redis服务宕机导致数据库压力巨大
1.给不同的key添加TTL随机值,达到不同的失效时间
2.提高redis集群高服务的可用性,比如哨兵机制,和redis数据同步(主从服