一:事务
Redis的事务是通过multi、exec、discard和watch这四个命令来完成的,单个命令是原子性的,所以事务指的是: 确保命令集合连续执行不被打断。 事务不支持回滚。事务命令:multi: 开启事务。 redis会将后续命令依次放入队列(EXEC,DISCARD,WATCH,MULTI除外)exec: 执行命令队列discard: 取消事务,清除队列watch: 监视keyunwatch: 取消监视举例:1)正常执行
(2)放弃事务
(3)若在事务队列中存在命令性错误(类似于java编译性错误),则执行EXEC命令时,所有命令都不会执行
(4)若在事务队列中存在语法性错误(类似于java的1/0的运行时异常),则执行EXEC命令时,其他正确命令会被执行,错误命令抛出异常。
(5)使用watch
案例一:使用watch检测balance,事务期间balance数据未变动,事务执行成功
案例二:使用watch检测balance,在开启事务后,开启新的客户端执行标注2中的操作,更改balance的值,模拟其他客户端在事务执行期间更改watch监控的数据,然后再执行标注1后命令,执行EXEC后,事务未成功执行。
一但执行 EXEC 开启事务的执行后,无论事务使用执行成功, WARCH 对变量的监控都将被取消。
故当事务执行失败后,需重新执行WATCH命令对变量进行监控,并开启新的事务进行操作。
二:慢查询日志
1、在redis.conf中设置慢查询:
#执行时间超过多少微秒的命令请求会被记录到日志上 0 :全记录 <0 不记录slowlog-log-slower-than 10000#slowlog-max-len 存储慢查询日志条数slowlog-max-len 128
还可以用命令confifig set临时设置,重启后失效。
confifig set slowlog-log-slower-than 微秒confifig set slowlog-max-len 条数
Redis使用列表存储慢查询日志,采用队列方式(FIFO),超过条数后,先存储的先丢失。
127.0.0.1:6379> config set slowlog-log-slower-than 0OK127.0.0.1:6379> config set slowlog-max-len 2OK127.0.0.1:6379> set name:001 zhaoyunOK127.0.0.1:6379> set name:002 zhangfeiOK127.0.0.1:6379> get name:002"zhangfei"
127.0.0.1:6379> slowlog get1) 1) (integer) 7 #日志的唯一标识符(uid)2) (integer) 1589774302 #命令执行时的UNIX时间戳3) (integer) 65 #命令执行的时长(微秒)4) 1) "get" #执行命令及参数2) "name:002"5) "127.0.0.1:37277"6) ""2) 1) (integer) 62) (integer) 15897742813) (integer) 74) 1) "set"2) "name:002"3) "zhangfei"5) "127.0.0.1:37277"6) ""# set和get都记录,第一条被移除了。
struct redisServer {long long slowlog_entry_id; // 下一条慢查询日志的 ID
list *slowlog; // 保存了所有慢查询日志的链表- FIFO
long long slowlog_log_slower_than; // 服务器配置 slowlog-log-slower-than 选项的值
unsigned long slowlog_max_len; // 服务器配置 slowlog-max-len 选项的值
};
typedef struct slowlogEntry {long long id; // 日志id
time_t time; // 命令执行时的当前时间,格式为 UNIX 时间戳
long long duration; // 执行命令消耗的时间,以微秒为单位
robj **argv; // 命令与命令参数
int argc; // 命令与命令参数的数量
} slowlogEntry;
使用slowlog get 可以获得执行较慢的redis命令,针对该命令可以进行优化:
1、尽量使用短的key和value,能使用int就int。2、避免使用keys *、hgetall等全量操作。4、将rdb改为aof模式rdb fork 子进程 主进程阻塞 redis大幅下降,关闭持久化 (适合于数据量较小)改aof 命令式
5、想要一次添加多条数据的时候可以使用管道6、尽可能地使用哈希存储7、尽量限制下redis使用的内存大小,这样可以避免redis使用swap分区或者出现OOM错误 ,内存与硬盘的swap
127.0.0.1:6379> monitorOK1589706136.030138 [0 127.0.0.1:42907] "COMMAND"1589706145.763523 [0 127.0.0.1:42907] "set" "name:10" "zhaoyun"1589706163.756312 [0 127.0.0.1:42907] "get" "name:10"
127.0.0.1:6379>127.0.0.1:6379> set name:10 zhaoyunOK127.0.0.1:6379> get name:10"zhaoyun"