Redis入门篇(2)- 奇淫技巧

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/JavaMrZhang/article/details/89881255

慢查询

许多的存储系统都提供了慢查询的配置,来帮助开发和运维排查线上哪些指令执行的时间耗时过长导致系统响应过慢。同样的Redis也不逊色,也提供了类似慢查询指令的配置。
Redis主要提供了两个配置属性slowlog-log-slower-thanslowlog-max-len,来配置慢查询指令的记录规则。

  • slowlog-log-slower-than

设置指令执行时间的阀值,如果超过该时间将会被记录下来。单位是微秒(1秒=1000毫秒=1000000微秒)默认值:10000微秒,建议配成10毫秒。

  • slowlog-max-len

记录最多的慢查询指令条数。其实Redis对于慢查询指令并不是记录在文件当中,而是以列表类型的格式存放与Redis内存中。如果慢查询的指令数量超出设定值将会以先进先出的方式剔除指令。 我们可以通过命令slowlog get [n] 获取前 n 条 慢查询指令。

  • 慢查询的相关指令
// 1. 获取前n条慢查询指令
slowlog get [n]
// 2. 查询当前慢查询指令列表的长度
slowlog len
// 3. 重置慢查询指令列表
slowlog reset

怎么用

慢查询的配置有两种方式

  • 修改redis的配置文件
  • 通过命令行进行修改,如下:
> config set slowlog-log-slower-than
> config set slowlog-max-len

此方式只能临时生效,如果希望服务重启后依然生效需要执行config rewrite 将配置持久化到本地文件。

使用Lua解决Redis的事务操作

Redis的PipleLine能够封装多个命令一次性传输至服务端执行,但这种批量操作并不是原子性操作。原生的批量操作虽然是原子性操作,但是功能的支持有限。Redis可以结合multi、exec、watch 三个指令来实现简单性的事务,对于指令语法上的错误能有效的实现数据回滚,但面对运行时发生的错误(如:某集合原先存放的数据类型为数值型,在添加时加入字符串类型导致报错),就不能回滚数据。为了能够满足事务的场景,Redis通过与Lua脚本的结合提供了强大的事务支持。(关于Lua脚本的语法大家网上自行查阅,本篇不做讲解)

怎么用

Lua脚本和Redis结合使用有3种方法

  1. eval 脚本内容 key个数 key列表 参数列表
> eval 'return "hello" .. KEY[1] .. ARGV[1]' 1 redis world
  1. redis-cli --eval 脚本文件 key个数 key列表 参数列表
$ redis-cli --eval /home/zmj/test.lua
  1. evalsha SHA值 key个数 key列表 参数列表
> evalsha dsfdsjl343j42lj34l23j4l3 1 redis world

该命令是先将Lua脚本加载至redis内存中会获得一个SHA1值,然后通过SHA1执行。此方式能够有效的复用脚本,提高执行效率。关于管理lua脚本的命令如下

// 加载脚本至redis内存中
$ redis-cli script load "$(cat /home/zmj/batch_incr.lua)"
// 是否存在此SHA1的脚本
> script exists 4ff9d1c915292602c
// 清除redis内存中的所有Lua脚本
> script flush

案例

需求:将排名前3的用户等级都上升一级

  • Lua脚本(batch_incr.lua)
-- 1. 前3名用户(使用Redis内置的API)
local userList = redis.call("SMEMBERS",KEYS[1]);
local count = 0 ;
-- 2. 遍历前3名用户
for index,key in ipairs(userList)
do
-- 3. 增加用户等级
	redis.call("incr",key);
	count=count+1;
end
return count;
  • 执行脚本
$ redis-cli --eval /home/zmj/batch_incr.lua

书写技术文章是一个循序渐进的过程,所以我不能保证每句话、每行代码都是对的,但至少能保证不复制、不粘贴,每篇文章都是自己对技术的认识、细心斟酌总结出来的。乔布斯说:我们在这个星球上的时间都很短,很少有机会去做几件真正伟大的事情,同时要做得好,我必须要趁我还年轻的时候完成这些事。
其实我想说的是,我是一枚程序员,我只想在有限的时间内尽可能去沉淀我这一生中所能沉淀下来的东西


清山绿水始于尘,博学多识贵于勤。

我有酒,你有故事吗?

微信公众号:「Java锦囊」。

欢迎一起谈天说地,聊Java。


猜你喜欢

转载自blog.csdn.net/JavaMrZhang/article/details/89881255