头条坚持更文第九天,越努力越幸运,为了未来更好的生活,让我们一起努力加油叭! Code皮皮虾一个沙雕而又有趣的憨憨少年,和大多数小伙伴们一样喜欢听歌、游戏,当然除此之外还有写作的兴趣,emm。。。,日子还很长,让我们结伴一起走下去吧 欢迎各位小伙伴们关注我的公众号:JavaCodes,名称虽带Java但涉及范围可不止Java领域噢,期待您的关注 一张图带你了解Redis有哪些缓存淘汰策略!!! Figure:前提概要 众所周知,Redis是基于内存的数据库,数据都在内存中,配合上其高效的数据结构、多路IO机制、单线程等等,使得Redis的性能非常高,单个实例的QPS能够达到10W左右。 但是,内存也是有限的,不可能让你无限制的进行数据的存放 所以,当Redis内存空间满了之后,如果在进行写请求就会报错,当然读请求还是正常执行! 那么,Redis内存满了之后的解决办法,下面一一都给大家进行讲解!!! 通过命令动态修改内存大小 设置Redis最大占用内存大小为100M 127。0。0。1:6379configsetmaxmemory100mb 获取设置的Redis能使用的最大内存大小 127。0。0。1:6379configgetmaxmemory 如果不设置最大内存大小或者设置最大内存大小为0,在64位操作系统下不限制内存大小,在32位操作系统下最多使用3GB内存Redis过期删除策略 常用的过期数据的删除策略就两个(重要!自己造缓存轮子的时候需要格外考虑的东西): 惰性删除:只会在取出key的时候才对数据进行过期检查。这样对CPU最友好,但是可能会造成太多过期key没有被删除。 定期删除:指的是Redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。 定期删除对内存更加友好,惰性删除对CPU更加友好。两者各有千秋, 所以Redis采用的是定期删除惰性删除的混合模式。 但是,仅仅通过给key设置过期时间还是有问题的。因为还是可能存在定期删除和惰性删除漏掉了很多过期key的情况。这样就导致大量过期key堆积在内存里,然后就OOM了。 解决方法:Redis内存淘汰机制。 Redis缓存淘汰策略noeviction:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就返回error,然后啥也不干allkeyslru:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会扫描所有的key,淘汰一些最近未使用的keyallkeyslfu:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会扫描所有的key,淘汰一些最近最少使用的keyallkeysrandom:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会扫描所有的key,随机淘汰一些keyvolatilelru:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,扫描那些设置了过期时间的key,淘汰一些最近未使用的keyvolatilerandom:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,扫描那些设置了过期时间的key,随机淘汰一些keyvolatilelfu:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,就会淘汰一些设置了过期时间的,并且最近最少使用的keyvolatilettl:添加数据时,如果redis判断该操作会导致占用内存大小超过内存限制,扫描那些设置里过了时间的key,淘汰一些即将过期的key最后 我是Code皮皮虾,一个热爱分享知识的皮皮虾爱好者,未来的日子里会不断更新出对大家有益的博文,期待大家的关注!!! 创作不易,如果这篇博文对各位有帮助,希望各位小伙伴可以一键三连哦!,感谢支持,我们下次再见