一、缓存击穿问题:
问题描述:
1.查询一个必然不存在的数据。比如文章表,查询一个不存在的id,每次都会访问DB,如果有人恶意破坏,很可能直接对DB造成影响。
2.缓存过期时间相同,同时失效,就会击穿。
问题解决:
1.最简单的方法就是再查库的时候 把这个key缓存为空
–缓存太多空值,占用更多空间。(优化:给个空值过期时间)
–存储层更新代码了,缓存层还是空值。(优化:后台设置时主动删除空值,并缓存把值进去)
–有可能黑客拿10000万种不同的key 你的redis都没有 还是会造成缓存击穿。
2.将数据库中所有的查询条件,放到redis中,做成key-value结构,利用redis的setNX方法判断key是否在存在,如果存在则查库,如果不存在就直接返回空。这种最保险。
二 热点key问题:
1.问题描述:压测的时候我创建100万个相同的key去访问,这时候相同的key都会落到redis相同的分片上,redis同一个分片大概会支持3-4W的并发,这时候就会超时。
2.问题解决:
1.利用谷歌的guawa本地缓存。redis上一层加一层本地缓存。
2.利用一主多从的redis集群,一个集群支持3-4W 十个集群就支持30-40W,这样有个缺点 就是资源耗费太大,其实阿里就是这么做的。