自己做商城网站能卖服装吗,搜索网站入口,记事本html网页制作代码,开发网站多少钱文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁3.2 基于逻辑过期 1.缓存穿透 解决办法
写入NULL值到Redis缓存#xff0c;以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题#xff01; 代码
2.缓存雪崩
这个概念很好理解#xff0c;雪崩就是无数的… 文章目录 1.缓存穿透2.缓存雪崩3.缓存击穿3.1 互斥锁3.2 基于逻辑过期 1.缓存穿透 解决办法
写入NULL值到Redis缓存以后就会命中Redis的控制缓存而不会出现请求直接打到数据库的问题 代码
2.缓存雪崩
这个概念很好理解雪崩就是无数的小雪花结构突然因为外界传递的巨大能量而受到破坏因此无数雪花结构崩溃导致雪崩这里缓存里面的key也是一样的大量的key同时失效导致大量请求打到数据库导致数据库崩溃 3.缓存击穿 3.1 互斥锁
利用到了Redis的setnx指令这种指令设置的key是只有该key不存在时才会被修改成功如果该key已经存在则无法修改该key。利用该特性如果大量的线程来到获取该key并修改该key为1那么实际上只有1个key才会被修改成功并且java中提供了相应的函数提供此功能如果修改成功那么返回True如果修改失败那么返回false根据此特性如果我们使用该函数如果返回False那就是获取互斥锁失败如果True那就是获取互斥锁成功接着我们可以直接使其他所有的相关线程Sleep就完事儿了等到获取互斥锁成功的线程执行完重构缓存的命令完了之后再来访问原来成功获取锁的线程就直接返回旧的缓存数据即可这个就是互斥锁原理
3.2 基于逻辑过期
逻辑过期的应用场景是对于热点Key的访问比如商家做活动的时候系统里面有经常访问到的key这种key就是热点key。 逻辑过期给出的解决方案 在逻辑过期的解决方案里面热点key的缓存的TTL都是直接设置为-1的即永久保存在Redis中但是这样我们如何区分这些个热点key有无过期呢于是我们设置了expire字段标记他有无过期如果当前时间在这个expire之前那么就是该热点key没过期直接去做缓存重建重置热点key的expire在原来expire过期时间上再次加上30分钟如果过期了那就直接返回旧的缓存数据获取锁完成缓存重建用线程池里面的线程完成缓存重建这样无论如何都能保证到热点key永不过期永远不会说是热点key过期了的瞬间又瞬间来了大量的请求打到后台数据库导致数据库宕机 一般来说在这套流程里面缓存都是命中的如果没命中只能说明这个key不是热点key中了就是热点key。因为我们的Redis都是提前缓存好了许多的热点key的热点key才会命中冷门key就没命中因为冷门key不在Redis里面。