慢查询原因分析
由于 Redis 是单线程的,它内部维护了一个命令队列,所以当有耗时的命令出现时,比如 keys *
,后面的命令会被阻塞,通查查出慢查询可以对服务进一步优化。
- 设置慢查询阀值:默认 10 毫秒,以微秒为单位
6379>config set slowlog-log-slower-than 10000
可直接修改 redis.conf 加上 slowlog-log-slower-than 10000
slow-max-len 用来设置慢查询条数
- 执行 slowlog get 获取慢查询,格式如下
一般会定期将慢查询进行导出到 mysql 或其它存储,用于业务人员查看哪里出现了慢查询
管道 pipeline
上篇文章展示了在控制台中如何使用管道来导入 mysql 数据,但管道一般在应用程序中使用
Object execute = redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection) throws DataAccessException {connection.openPipeline();
for (int i = 0; i < 1000000; i++) {
String key = "123" + i;
connection.set(key.getBytes(), key.getBytes());
}
List<Object> result = connection.closePipeline();
return result;
}
});
发布订阅 (publish/subscribe)
Redis 的发布订阅比较简单,不适合于专业的场景,会有消息丢失,无法回溯等问题,这个发布订阅一般是用在 Redis 内部使用,比如哨兵的监控
专业的发布订阅建议还是使用 kafka 或者 rabbitmq
rabbitmq 可参考我的另一篇文章 Rabbitmq
一些实用命令
-
查询连接的占用情况,哪台主机占用多少连接,用于排查连接耗光问题
redis-cli -a < 密码 > client list | awk '{print $1}' | cut -d "=" -f2 | cut -d: -f 1 | sort -n | uniq -c
- 查询当前内存使用情况
6379> info Memory
-
在所有 key 里面返回随机一个 key,可以用于抽奖
randomkey