redis 由来:因为大部分的数据库操作都是查询重复的操作,mysql需要让费很多的时间进行i磁盘I/O,所以就像cpu一样给mysql 加一个缓存 redis。
先对mysql进行访问获取数据 然后把对应的数据放到redis中进行缓存 这样下次再来查询数据 就不需要访问mysql 直接在redis返回
缓存过期和 缓存淘汰
一直把数据放到redis中 内存也会满 所以给缓存内容设置一个过期时间 ,过期了就删除内容 这样就释放内存了
但是也不会全盘扫描,那样每个检查一下数据是否过期也会要很久影响当时的数据请求,所以就选择随机扫描 挑出一部分数据看是否过期 过期了就删除,进行定期随机删除来释放缓解内存压力
但这样一来总有一些数据会一直没被选到 就一直占用空间
惰性删除: 对应上面的这些没被发现的数据,只要被查询到 发现过期了 查询之后立刻被删除
但这样就还有一部分数据 过期了 也没被随机到 也一直没被查询 就一直占着内存 这样就会时间长了 也会内存占满 这时就用到了 缓存淘汰
八大缓存淘汰
缓存穿透和布隆过滤
缓存穿透:对于一些数据不存在的查询,redis没有数据自然要去mysql查询,又查不到数据白忙一次 下次还是这样 这样redis就没有起到缓存的作用这就叫缓存穿透
布隆过滤器:就是可以从超大的数据集中找到你要的数据存在不存在(但返回存在可能不存在,但返回不存在 就一定不存在)
应用程序结合布隆 不存在数据的请求就不会再去访问数据库了
缓存击穿和缓存雪崩
缓存击穿: 对于热点数据时间到期了 刚好被删除了 此时刚好被大量访问 造成数据库压力
缓存雪崩: 对于一批热点数据一块到期 刚好被删除 此时又有更多的访问 造成数据库更大的压力
解决方法:热点数据永不过期 其他过期时间设置均匀一点 随机一点 尽量不出现大量数据集体过期的情况
原文:https://www.cnblogs.com/xrxc/p/14717755.html