温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Redis生产场景问题以及解决方案

发布时间:2021-07-05 18:31:13 来源:亿速云 阅读:178 作者:chen 栏目:编程语言

本篇内容介绍了“Redis生产场景问题以及解决方案”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

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生产场景问题以及解决方案”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI