目录
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百万用户,拆成200个key, 可在客户端用hash取模定位
- 如果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 | 建议开启,但应用本身也要开启 |
- maxTotal: 当前连接池最大连接数,应用数*maxTotal <= redis服务端最大连接数(默认10000)
- maxIdle: 业务需要的最大连接数
- 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内存满的时候, 会触发删除策略
a 对过期的key处理:
- volatile-ttl:在筛选时,会针对设置了过期时间的键值对,根据过期时间的先后进行删除,越早过期的越先被删除。
- volatile-random:就像它的名称一样,在设置了过期时间的键值对中,进行随机删除。
- volatile-lru:会使用 LRU 算法筛选设置了过期时间的键值对删除。
- volatile-lfu:会使用 LFU 算法筛选设置了过期时间的键值对删除。
b 对所有的key处理:
- allkeys-random:从所有键值对中随机选择并删除数据。
- allkeys-lru:使用 LRU 算法在所有数据中进行筛选删除。
- allkeys-lfu:使用 LFU 算法在所有数据中进行筛选删除。
c 不处理:
- 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 #重置慢查询日志