明天你会感谢今天奋力拼搏的你。
ヾ(o◕∀◕)ノヾ
慢查询的阈值默认为10毫秒(注意:这个时间是执行指令的时间,不包括网络传输时间和Redis线程排队时间)
相关配置介绍
slowlog-log-slower-than 10000 表示慢查询阈值为10毫秒,单位为微妙,如果设置为小于0的数则表示不记录慢查询。slowlog-max-len 128 表示保存的慢查询队列的长度。如下图所示为Redis配置文件中对慢查询的默认设置,
相关命令示例:
# 设置慢查询阈值为0(这里是为了方便测试,生产环境不要这样)
config set slowlog-log-slower-than 0
# 上面的命令服务器重启后会失效,想要永久生效,可以用如下命令把改动的参数回写到redis的配置文件中
config rewrite
# 获取慢查询日志的相关配置
CONFIG GET slowlog-*
# 获取慢查询日志记录,语法:SLOWLOG GET [数量],数量表示显示日志条数
SLOWLOG GET 2
# 获取当前慢查询日志的数量
SLOWLOG LEN
# 清空慢查询日志
SLOWLOG RESET
生产配置优化建议
注意:
Redis Pipeline(管道)是一种批量执行命令的优化技术,用于减少客户端与服务器之间的网络往返延迟(RTT),显著提升高并发场景下的吞吐量。客户端将多个命令打包一次性发送给服务器,服务器处理完所有命令后,一次性返回所有结果。
使用Pipeline的注意事项:
Java代码示例:
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.Response;
import java.util.List;
public class RedisPipelineExample {
public static void main(String[] args) {
// 连接 Redis 服务器
try (Jedis jedis = new Jedis("localhost", 6379)) {
// 示例 1:批量写入
Pipeline pipeline = jedis.pipelined();
for (int i = 0; i < 1000; i++) {
pipeline.set("key" + i, "value" + i);
}
// 执行批量操作
List<Object> results = pipeline.syncAndReturnAll();
System.out.println("批量写入完成,共执行 " + results.size() + " 条命令");
// 示例 2:批量读取(使用 Response 对象获取结果)
Pipeline getPipeline = jedis.pipelined();
Response<String> key1 = getPipeline.get("key1");
Response<String> key2 = getPipeline.get("key2");
Response<Long> incrResult = getPipeline.incr("counter");
// 执行并获取结果
getPipeline.sync();
System.out.println("key1: " + key1.get());
System.out.println("key2: " + key2.get());
System.out.println("counter 自增后的值: " + incrResult.get());
// 示例 3:混合操作(写入后读取)
Pipeline mixedPipeline = jedis.pipelined();
mixedPipeline.set("user:1", "Alice");
mixedPipeline.hset("user:1:info", "age", "30");
mixedPipeline.get("user:1");
mixedPipeline.hgetAll("user:1:info");
List<Object> mixedResults = mixedPipeline.syncAndReturnAll();
System.out.println("混合操作结果:");
for (Object result : mixedResults) {
System.out.println(result);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
pipeline内置了很多与命令同名的方法,直接调用即可。
获取结果的方式有两种,示例中都有覆盖:
Redis 事务是一组命令的集合,它可以确保多个命令按顺序执行,且在执行过程中不会被其他客户端的请求打断。
相关命令介绍:
与传统关系型数据库的事务相比,Redis的事务非常的鸡肋,只能判断语法层面的错误进行回滚,更适合处理非强一致性要求的场景,不能保证事务的原子性和一致性。
如下图所示,命令格式正确但执行时出错,错误命令执行错误,但不会影响其它命令的正常执行:
注意:PipeLine是客户端封装所有命令组一起批量执行,能提升吞吐量。而事务依然是普通命令,每个命令都会进行网络传输,只是在MULTI和EXEC中间的命令Redis先放到缓冲区中,EXEC提交时才真正执行。
LUA脚本语言是C开发的,类似存储过程,具体的Lua语法可以查看:《Lua教程 | 菜鸟教程》。
使用LUA脚本的好处:
核心命令介绍:
1、执行Lua脚本
EVAL script numkeys key [key ...] arg [arg ...]示例:
EVAL "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}" 2 key1 key2 first second
2、脚本加载到Redis缓存中
SCRIPT LOAD script示例:
SCRIPT LOAD "return {KEYS[1], KEYS[2], ARGV[1], ARGV[2]}'"
# 返回结果
493d4552555dd9618f79b2b6ef18f8a89fd8f4
3、执行缓存的脚本
EVALSHA sha1 numkeys key [key ...] arg [arg ...]示例:
EVALSHA 493d4552555dd9618f79b2b6ef18f8a89fd8f4 2 key1 key2 first second
Redis的发布订阅功能比较鸡肋,在此做一下简单的介绍。
概念介绍:
核心命令介绍:
SUBSCRIBE channel [channel …]PUBLISH channel messageUNSUBSCRIBE [channel …]为什么比较鸡肋?
Redis 5.0版本发布的Stream功能,其借鉴了kafka的设计提供了持久化的能力,用于支持消息中间件(可以算是发布订阅功能的替代)。
消息队列相关命令:
XADD stream-key [MAXLEN count] * field value [field value ...]
XTRIM stream-key MAXLEN [~] count
XDEL stream-key message-id [message-id ...]
XLEN stream-key
XRANGE stream-key start end [COUNT count]
0-0表示最小ID,$表示最大ID)。XREVRANGE stream-key end start [COUNT count]
XRANGE相同,但返回顺序相反。XREAD [BLOCK milliseconds] STREAMS stream-key [stream-key ...] ID [ID ...]
$表示从最新消息开始)。消费者组相关命令:
XGROUP CREATE stream-key group-name id [MKSTREAM]
0-0表示从最早消息开始,$表示从最新消息开始)。XREADGROUP GROUP group-name consumer-name [BLOCK milliseconds] [COUNT count] STREAMS stream-key [stream-key ...] >
XREAD,支持阻塞和分页。XACK stream-key group-name message-id [message-id ...]
XGROUP SETID stream-key group-name id
XREADGROUP的读取位置。XGROUP DELCONSUMER stream-key group-name consumer-name
XGROUP DESTROY stream-key group-name
XPENDING stream-key group-name [start end count [consumer-name]]
XCLAIM stream-key group-name consumer-name min-idle-time message-id [message-id ...] [IDLE ms] [RETRYCOUNT count] [FORCE]
XINFO [STREAM stream-key | GROUPS stream-key | CONSUMERS stream-key group-name]
XINFO GROUPS stream-key
XINFO STREAM stream-key
全部评论