Redis 应用场景和问题
一.redis 分布式锁:
并发的情况下,同时setNx命令,会不会有问题,Redis是单线程的,所以Redis服务本身没有并发接受命令问题.
redis分布式锁主要是靠redis的操作具有原子性和其中两个命令,lua脚本实现的.
1.setNx命令
在指定的 key 不存在时,为 key 设置指定的值,如果存在则返回0.反之返回1.
2.expire命令
用于设置 key 的过期时间,主要作用是防止抢占到锁的线程一直不释放锁,造成死锁
3.lua脚本
redis lua脚本支持将几个命令提交给redis执行,并且保证原子性.
可以用redisson框架实现,同时还有可重入分布式锁.
二.缓存穿透 + 缓存雪崩 + 缓存击穿
1.缓存穿透:
问题: 指的是查询一个不存在数据,结果缓存没有进行存储,导致每次查询都走数据库.
解决方法: 可以把不存在的数据,用一个特殊数字或者字符串代替值,存在redis里面.
比如存一个数字 -1
2.缓存雪崩:
问题: 缓存同一个时间进行缓存的key大量进行到期,或者redis宕机,导致所有的请求都去请求数据库了,数据库压力过大,导致系统崩溃
解决:
①可以采用高可用的redis系统集群,例如哨兵集群,cluster集群
②采用二级缓存,可以用本地系统缓存
③进行数据库查询层次的限流.
3.缓存击穿:
问题:当缓存失效的瞬间,大量并发请求去访问数据库数据,导致大量线程在重新重建缓存
解决:
①可以用redisson分布式锁,只能有一个线程去重新建立缓存,其他的进行等待.
②可以设置热点数据不进行过期
还没有评论,来说两句吧...