Login
网站首页 > 文章中心 > 其它

Redis性能调优_redis连接池性能调优

作者:小编 更新时间:2023-08-16 09:22:09 浏览量:372人看过

第一段:设计优化

Redis性能调优_redis连接池性能调优

① 利用jemalloc特性进行优化

Redis性能调优_redis连接池性能调优

大键值对,延长写入和读取耗时、延长持久化需要时间,延长网络传输时间,并且占用内存多,更容易触发内存淘汰机制.尽量缩短存储长度,必要时进行压缩和序列化

第二段:设置键值的过期时间

Redis的serverCron函数定期清除过期键,节约内存占用,避免键值对过多堆积,频繁触发内存淘汰机制

第三段:限制Redis内存大小

LRU(Least Recently Used,最近最少使用)原理:使用链表保存缓存数据,越靠近表头,存放的数据访问时间越近.当有新数据时插入表头,当有缓存命中时,将数据移至表头,当内存不足时,丢弃表尾数据

缺点是类似全表扫描时,会将链表数据污染

LFU(Least Frequently Used,最不经常使用策略)原理:记录内存块的使用次数,回收时,按照访问次数排序,当缓存不足时,将使用频率最低的内存释放.

缺点是短时间内大量访问的数据很难删除

①?Redis缓存淘汰策略noeviction:不淘汰任何数据,当内存不足时,新增操作会报错,Redis 默认内存淘汰策略;

allkeys-lru:淘汰整个键值中最久未使用的键值;

allkeys-random:随机淘汰任意键值;

volatile-lru:淘汰所有设置了过期时间的键值中最久未使用的键值;

volatile-random:随机淘汰设置了过期时间的任意键值;

volatile-ttl:优先淘汰更早过期的键值;

volatile-lfu:淘汰所有设置了过期时间的键值中,最少使用的键值;

allkeys-lfu:淘汰整个键值中最少使用的键值;

?第四段:使用Lazy free特性(Redis④0新增)

删除大键值对比较耗时,造成主线程的阻塞,为此将删除的操作放在子线程中.共有四项配置:

lazyfree-lazy-eviction:当Redis运行内存超过最大内存,是否启用lazy free

lazyfree-lazy-expire:当设置了过期键,在键过期之后,是否启用lazy free

lazyfree-lazy-server-del:有些命令会隐式删除键,比如rename命令,对这些命令执行时是否启用lazy free

slave-lazy-flush:从节点加载主节点的RDB文件前,会运行flushall清理原有数据,此时是否启用lazy free

第五段:禁用长耗时的查询命令

Redis大部分的读写命令的时间复杂度在O(1)到O(N)之间.对于O(N)的命令,需要谨慎使用,如果执行时间过长,将会阻塞Redis

禁用Keys

避免一次查询所有键,使用scan命令进行分批遍历

控制Hash、Set、Sorted Set结构的数据大小

第六段:使用slowlog优化耗时命令

使用slowlog命令找出高耗时的Redis命令.慢查询的配置项:

slowlog-log-slower-than:慢查询评定的时间阈值,单位微妙

slowlog-max-len:配置慢查询日志的最大记录数

第七段:避免大量数据同时失效

在设置过期时间时,加入随机数.

第八段:检查数据持久化策略

RDB持久化,可能存在一定时间内的数据丢失.AOF持久化,文件较大时执行较慢,影响启动速度.在非必须持久化操作时,可以关闭持久化,避免间歇性的卡顿(serverCron函数周期性执行持久化操作)

第九段:使用Pipeline批量操作数据

Redis性能调优_redis连接池性能调优

使用Redis连接池,减少网络传输次数和非必要调用指令.


import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

十第一段:使用分布式架构增加读写速度

Redis分布式架构有:

主从同步:读写分离

哨兵:自动容灾

Redis Cluster集群:多读多写,高扩展(集群可添加节点)高可用(某主节点无从节点自动将其他主节点多余的从节点转移),自动容灾

十第二段:其他优化

使用物理机非虚拟机.虚拟机和物理机共享物理网口,并且一台物理机可能有多个虚拟机运行,在内存占用和网络延迟上性能较差

十第三段:禁用THP特性

Redis雪崩现象:

解决方案:过期时间设置加入随机数

Redis缓存击穿:

缓存中没有(过期),但数据库中存在数据.此时大量并发请求访问这部分数据,数据库压力陡增.缓存雪崩是大量的缓存击穿.

解决方案:

①设置热点数据永不过期


public String getData(String key) throws Exception{

String data = redis.get(key);
if(data == null){
    if(lock.tryLock()){
        data = redis.get(key);
        if(data == null){
            //查询数据库
            data = mysql.select();
            redis.set(key,data);
        }else{
            return data;
        }
    }else{            
        Thread.sleep(1000);
        return getData(key);
    }
}
return data;        
}

Redis缓存穿透:

缓存和数据库中都没有某数据,但有大量的并发请求查询这些数据.导致数据库宕机,主要考虑是漏洞攻击

① 接口层加校验,譬如用户鉴权

以上就是土嘎嘎小编为大家整理的Redis性能调优相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章