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

我是Redis
你好 , 我是Redis , 一个叫Antirez的男人把我带到了这个世界上 。
我是redis,mysql大哥被我害惨了!
文章图片
说起我的诞生 , 跟关系数据库MySQL还挺有渊源的 。
在我还没来到这个世界上的时候 , MySQL过的很辛苦 , 互联网发展的越来越快 , 它容纳的数据也越来越多 , 用户请求也随之暴涨 , 而每一个用户请求都变成了对它的一个又一个读写操作 , MySQL是苦不堪言 。 尤其是到“双11”、“618“这种全民购物狂欢的日子 , 都是MySQL受苦受难的日子 。
据后来MySQL告诉我说 , 其实有一大半的用户请求都是读操作 , 而且经常都是重复查询一个东西 , 浪费它很多时间去进行磁盘I/O 。
后来有人就琢磨 , 是不是可以学学CPU , 给数据库也加一个缓存呢?于是我就诞生了!
出生不久 , 我就和MySQL成为了好朋友 , 我们俩常常携手出现在后端服务器中 。
应用程序们从MySQL查询到的数据 , 在我这里登记一下 , 后面再需要用到的时候 , 就先找我要 , 我这里没有再找MySQL要 。
我是redis,mysql大哥被我害惨了!
文章图片
为了方便使用 , 我支持好几种数据结构的存储:
String
Hash
List
Set
SortedSet
Bitmap
······
因为我把登记的数据都记录在内存中 , 不用去执行慢如蜗牛的I/O操作 , 所以找我要比找MySQL要省去了不少的时间呢 。
可别小瞧这简单的一个改变 , 我可为MySQL减轻了不小的负担!随着程序的运行 , 我缓存的数据越来越多 , 有相当部分时间我都给它挡住了用户请求 , 这一下它可乐得清闲自在了!
有了我的加入 , 网络服务的性能提升了不少 , 这都归功于我为数据库挨了不少枪子儿 。 缓存过期&&缓存淘汰
不过很快我发现事情不妙了 , 我缓存的数据都是在内存中 , 可是就算是在服务器上 , 内存的空间资源还是很有限的 , 不能无节制的这么存下去 , 我得想个办法 , 不然吃枣药丸 。
不久 , 我想到了一个办法:给缓存内容设置一个超时时间 , 具体设置多长交给应用程序们去设置 , 我要做的就是把过期了的内容从我里面删除掉 , 及时腾出空间就行了 。
我是redis,mysql大哥被我害惨了!
文章图片
超时时间有了 , 我该在什么时候去干这个清理的活呢?
最简单的就是定期删除 , 我决定100ms就做一次 , 一秒钟就是10次!
我清理的时候也不能一口气把所有过期的都给删除掉 , 我这里面存了大量的数据 , 要全面扫一遍的话那不知道要花多久时间 , 会严重影响我接待新的客户请求的!
时间紧任务重 , 我只好随机选择一部分来清理 , 能缓解内存压力就行了 。
我是redis,mysql大哥被我害惨了!
文章图片
就这样过了一段日子 , 我发现有些个键值运气比较好 , 每次都没有被我的随机算法选中 , 每次都能幸免于难 , 这可不行 , 这些长时间过期的数据一直霸占着不少的内存空间!气抖冷!
我眼里可揉不得沙子!于是在原来定期删除的基础上 , 又加了一招:
那些原来逃脱我随机选择算法的键值 , 一旦遇到查询请求 , 被我发现已经超期了 , 那我就绝不客气 , 立即删除 。
这种方式因为是被动式触发的 , 不查询就不会发生 , 所以也叫惰性删除!
可是 , 还是有部分键值 , 既逃脱了我的随机选择算法 , 又一直没有被查询 , 导致它们一直逍遥法外!而与此同时 , 可以使用的内存空间却越来越少 。