Redis生产场景问题以及解决方案
本篇内容介绍了“redis生产场景问题以及解决方案”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
袁州网站制作公司哪家好,找成都创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。成都创新互联成立于2013年到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选成都创新互联。
1、缓存穿透
缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑,
如果从存储 层查不到数据则不写入缓存层。 缓存穿透将导致不存在的数据每次请求都要到存储层去查询, 失去了缓存保护后端存储的意义。
造成缓存穿透的基本原因有两个:
第一, 自身业务代码或者数据出现问题。
第二, 一些恶意攻击、 爬虫等造成大量空命中。
解决方案
1-1、缓存空对象
1-2、布隆过滤器
2、缓存失效
比如在管理后台批量设置了大量的缓存数据,那么在某个时间大量的key在相同的时间同时失效,这样大量来自用户端的请求就会直接请求到数据库层,造成数据库端瞬间压力增大,这种情况即为缓存失效。
解决方案:在批量设置key时,过期时间通过随机时间的方式来设置,可以避免这种问题的发生
3、读写不一致解决方案
(1)并发量小,或者是用户想关的数据基本不会有并发,设置过期时间即可
(2)利用分布式锁解决读写不一致的问题
Redisson readWriteLock、读读不互斥,读写互斥
(3)canal中间件方案
利用canal中间件,可以解决读写不一致的问题,程序只需关注缓存或数据库自身即可,同步的事情交给中间件canal来完成
5、通过连接池方式访问redis,提高访问效率
示例代码-->
https://gitee.com/ggkt/java-base/blob/master/src/com/ggkt/redis/RedisPool.java
6、连接池预热
示例代码->
https://gitee.com/ggkt/java-base/blob/master/src/com/ggkt/redis/RedisPoolPreLoad.java
如果系统有大量并发,为了提交redis效率,客户端可以提前将redis连接预热到连接池,规避瞬间redis访问的压力
7、过期key清除原理
(1)、被动删除,key过期了并不会自动清除,过期时间后有访问了才会清除
(2)、主动删除,redis会定期淘汰过期key;
(3)、超过maxmemory也会触发清理策略
8、主动删除策略
主动清理策略在Redis 4.0 之前一共实现了 6 种内存淘汰策略,在 4.0 之后,又增加了 2 种策 略,总共8种:
8-1、设置了过期时间的key的删除
(1)volatile-ttl:按照过期时间先后删除
(2)volatile-random:按照过期时间随机删除
(3)volatile-lru:按照过期时间lru随机删除
(4)volatile-lfu:按照过期时间lfu随机删除
8-2、针对所有的key的删除
(5) allkeys-random:从所有键值对中随机选择并删除数据。
(6)allkeys-lru:使用 LRU 算法在所有数据中进行筛选删除。
(7)allkeys-lfu:使用 LFU 算法在所有数据中进行筛选删除。
8-3、不处理
(8) noeviction:不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息"(error)
OOM command not allowed when used memory",此时Redis只响应读操作。
9、最大内存设置
生产环境一定要设置最大内存,否则,如果如果内存数据超过了物理内存
则会使用swap分区进行内存的存储,这样增加了磁盘io读写、数据交换,大大降低服务及服务器性能。
而设置了最大内存就会内存达到一定的值就会触发redis的内存清理机制,可以保证redis的效率
10、模拟程序打爆你的redis
“Redis生产场景问题以及解决方案”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注创新互联网站,小编将为大家输出更多高质量的实用文章!
本文名称:Redis生产场景问题以及解决方案
本文链接:http://ybzwz.com/article/iiidgo.html