我是redis,mysql大哥被我害惨了!( 二 )


我是redis,mysql大哥被我害惨了!
文章图片
而且就算退一步讲 , 我能够把过期的数据都删除掉 , 那万一过期时间设置的很长 , 还没等到我去清理 , 内存就吃满了 , 一样要吃枣药丸 , 所以我还得想个办法 。
我苦思良久 , 终于憋出了个大招:内存淘汰策略 , 这一次我要彻底解决问题!
我提供了8种策略供应用程序选择 , 用于我遇到内存不足时该如何决策:
noeviction:返回错误 , 不会删除任何键值
allkeys-lru:使用LRU算法删除最近最少使用的键值
volatile-lru:使用LRU算法从设置了过期时间的键集合中删除最近最少使用的键值
allkeys-random:从所有key随机删除
volatile-random:从设置了过期时间的键的集合中随机删除
volatile-ttl:从设置了过期时间的键中删除剩余时间最短的键
volatile-lfu:从配置了过期时间的键中删除使用频率最少的键
allkeys-lfu:从所有键中删除使用频率最少的键
有了上面几套组合拳 , 我再也不用担心过期数据多了把空间撑满的问题了~缓存穿透&&布隆过滤器
我的日子过的还挺舒坦 , 不过MySQL大哥就没我这么舒坦了 , 有时候遇到些烦人的请求 , 查询的数据不存在 , MySQL就要白忙活一场!不仅如此 , 因为不存在 , 我也没法缓存啊 , 导致同样的请求来了每次都要去让MySQL白忙活一场 。 我作为缓存的价值就没得到体现啦!这就是人们常说的缓存穿透 。
我是redis,mysql大哥被我害惨了!
文章图片
这一来二去 , MySQL大哥忍不住了:“唉 , 兄弟 , 能不能帮忙想个办法 , 把那些明知道不会有结果的查询请求给我挡一下”
这时我想到了我的另外一个好朋友:布隆过滤器
我是redis,mysql大哥被我害惨了!
文章图片
我这位朋友别的本事没有 , 就擅长从超大的数据集中快速告诉你查找的数据存不存在(悄悄告诉你 , 我的这位朋友有一点不靠谱 , 它告诉你存在的话不能全信 , 其实有可能是不存在的 , 不过它他要是告诉你不存在的话 , 那就一定不存在) 。
我是redis,mysql大哥被我害惨了!
文章图片
如果你对我这位朋友感兴趣的话 , 可以看看这里《白话布隆过滤器BloomFilter》 。
我把这位朋友介绍给了应用程序 , 不存在的数据就不必去叨扰MySQL了 , 轻松帮忙解决了缓存穿透的问题 。 缓存击穿&&缓存雪崩
这之后过了一段时间太平日子 , 直到那一天???
有一次 , MySQL那家伙正优哉游哉的摸鱼 , 突然一大堆请求给他怼了过去 , 给他打了一个措手不及 。
一阵忙活之后 , MySQL怒气冲冲的找到了我 , “兄弟 , 咋回事啊 , 怎么一下子来的这么猛”
我是redis,mysql大哥被我害惨了!
文章图片
我查看了日志 , 赶紧解释到:“大哥 , 实在不好意思 , 刚刚有一个热点数据到了过期时间 , 被我删掉了 , 不巧的是随后就有对这个数据的大量查询请求来了 , 我这里已经删了 , 所以请求都发到你那里来了”
“你这干的叫啥事 , 下次注意点啊” , MySQL大哥一脸不高兴的离开了 。
这一件小事我也没怎么放在心上 , 随后就抛之脑后了 , 却没曾想几天之后竟捅了更大的篓子 。
那一天 , 又出现了大量的网络请求发到了MySQL那边 , 比上一次的规模大得多 , MySQL大哥一会儿功夫就给干趴下了好几次!
等了好半天这一波流量才算过去 , MySQL才缓过神来 。