Redis连接池参数&过期策略&慢查询日志

目录

bigKey

bigKey危害

bigKey优化

连接池参数

删除策略

慢查询日志

redis.config配置

命令配置

showlog命令


bigKey

bigKey危害

  • Redis阻塞,bigKey操作一般耗时久,Redis单线程, 其他客户端会排队等待
  • 网络拥堵,bigKey意味着每次获取需要很大流量, 假设单条数据1MB,并发1000时,就算千兆网卡(128M/s),造成网络拥堵也会降低并发性能
  • 过期删除阻塞,bigKey如果设置了过期时间, 如果没有使用Redis4.0+的异步删除配置(lazyfree-lazy-expire yes), 肯能造成阻塞

bigKey优化

  1. 分段存储,比如1百万用户,拆成200个key, 可在客户端用hash取模定位
  2. 如果bigKey不可避免, 尽量不要一次性取出来, 可以hmget.lrange,遍历去数据

连接池参数

序号

参数名

含义

默认值

使用建议

1

maxTotal

资源池中最大连接数

8

设置建议见下面

2

maxIdle

资源池允许最大空闲的连接数

8

设置建议见下面

3

minIdle

资源池确保最少空闲的连接数

0

设置建议见下面

4

blockWhenExhausted

当资源池用尽后,调用者是否要等待。只有当为true时,下面的maxWaitMillis才会生效

true

建议使用默认值

5

maxWaitMillis

当资源池连接用尽后,调用者的最大等待时间(单位为毫秒)

-1:表示永不超时

不建议使用默认值

6

testOnBorrow

向资源池借用连接时是否做连接有效性检测(ping),无效连接会被移除

false

业务量很大时候建议设置为false(多一次ping的开销)。

7

testOnReturn

向资源池归还连接时是否做连接有效性检测(ping),无效连接会被移除

false

业务量很大时候建议设置为false(多一次ping的开销)。

8

jmxEnabled

是否开启jmx监控,可用于监控

true

建议开启,但应用本身也要开启

  1. maxTotal: 当前连接池最大连接数,应用数*maxTotal <= redis服务端最大连接数(默认10000)
  2. maxIdle: 业务需要的最大连接数
  3. minIdle: 至少需要保持的空闲连接数

在连接使用过程中, 如果大于minIdle,会继续建立连接,如果大于maxIdle, 超过的连接执行完业务后会慢慢被连接池释放掉.,建议maxTotal=maxIdle, 避免频繁创建连接,让性能最大化.

如果系统启动, 会马上有很多请求打进来, 可以将连接池提前预热,执行ping命令

代码示例:

List<Jedis> minIdleJedisList = new ArrayList<Jedis>(jedisPoolConfig.getMinIdle());
for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) {
    Jedis jedis = null;
    try {
        jedis = pool.getResource();
        minIdleJedisList.add(jedis);
        jedis.ping();
    } catch (Exception e) {
        logger.error(e.getMessage(), e);
    } finally {
        //注意,这里不能马上close将连接还回连接池,否则最后连接池里只会建立1个连接
        //jedis.close();
    }
}
//统一将预热的连接还回连接池
for (int i = 0; i < jedisPoolConfig.getMinIdle(); i++) {
    Jedis jedis = null;
    try {
        jedis = minIdleJedisList.get(i);
        //将连接归还回连接池
        jedis.close();
    } catch (Exception e) {
        log.error(e.getMessage(), e);
    }
}

过期键删除策略

Redis对于过期键有三种清除策略:

  1. 被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key
  2. 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期(默认每100ms)主动淘汰一批已过期的key,这里的一批只是部分过期key,所以可能会出现部分key已经过期但还没有被清理掉的情况,导致内存并没有被释放
  3. 当前已用内存超过maxmemory限定时,触发主动清理策略

主动清理策略在Redis 4.0 之前一共实现了 6 种内存淘汰策略,在4.0后,又增加2 种策略,总共8种:

a 对过期的key处理:

  1. volatile-ttl:在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
  2. volatile-random:就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
  3. volatile-lru:会使用 LRU 算法筛选设置了过期时间的键值对删除。
  4. volatile-lfu:会使用 LFU 算法筛选设置了过期时间的键值对删除。

b 对所有的key处理:

  1. allkeys-random:从所有键值对中随机选择并删除数据。
  2. allkeys-lru:使用 LRU 算法在所有数据中进行筛选删除。
  3. allkeys-lfu:使用 LFU 算法在所有数据中进行筛选删除。

c 不处理:

  1. noeviction:不会删除任何数据,拒绝所有写入操作并返回客户端错误提示,此时Redis只响应读操作。

LRU:保留最近,淘汰最早使用的key

LFU:淘汰使用次数最少的key

慢查询日志

redis.config配置

# 记录超过该时间阈值的命令,单位为微秒

# <0,即不做任何记录; =0, 即记录所有命令; >0, 记录符合条件的命令
slowlog-log-slower-than 20000

# 日志最多保存的条数,先进先出淘汰
slowlog-max-len 1024

命令配置

CONFIG SET slowlog-log-slower-than 20000
CONFIG SET slowlog-max-len 1024

showlog命令

Redis慢日志命令说明:
config get slow* #查询有关慢日志的配置信息
config set slowlog-log-slower-than 20000  #设置慢日志使时间阈值,单位微秒,此处为20毫秒,即超过20毫秒的操作都会记录下来,生产环境建议设置1000,也就是1ms,这样理论上redis并发至少达到1000,如果要求单机并发达到1万以上,这个值可以设置为100
config set slowlog-max-len 1024  #设置慢日志记录保存数量,如果保存数量已满,会删除最早的记录,最新的记录追加进来。记录慢查询日志时Redis会对长命令做截断操作,并不会占用大量内存,建议设置稍大些,防止丢失日志
config rewrite #将服务器当前所使用的配置保存到redis.conf
slowlog len #获取慢查询日志列表的当前长度
slowlog get 5 #获取最新的5条慢查询日志。慢查询日志由四个属性组成:标识ID,发生时间戳,命令耗时,执行命令和参数
slowlog reset #重置慢查询日志

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值