redis补充
这篇文档是redis入门笔记的补充
1.info 命令
用来显示服务的信息。
info 命令可以跟下面的选项:
server : 关于 Redis 服务器的一些信息clients : 客户端连接部分memory : 内存消耗相关信息persistence : RDB和AOF相关信息stats : 一些统计replication : 主/副本复制信息cpu : CPU消耗统计commandstats : Redis 命令统计delatencystats : Redis 命令延迟百分位分布统计cluster : Redis 集群部分modules : 模块部分keyspace : Redis数据库相关的统计信息errorstats : Redis 错误统计
如info keyspace 就能查看redis每个库中存储的key的信息。
同时info 也可以跟下面的一些选项
all :返回所有部分(不包括模块生成的部分)default :仅返回默认的部分集everything :包括所有和模块
如果单纯是info 命令的话,等价于info default 。
具体的信息大家可以查看官方文档部分的介绍。
2.memory stats 命令
用来显示服务的内存使用的相关情况。
-
peak.allocated : Redis 消耗的峰值内存(以字节为单位)(参见 INFO 的 used_memory_peak ) -
total.allocated : Redis 使用其分配器分配的总字节数(参见 INFO 的 used_memory ) -
startup.allocated : Redis 在启动时消耗的初始内存量(以字节为单位)(参见 INFO 的 used_memory_startup ) -
replication.backlog : 复制积压缓存区的字节大小(参见INFO的repl_backlog_active ) -
clients.slaves : 所有副本开销的总大小(以字节为单位)(输出和查询缓冲区、连接上下文) -
clients.normal : 所有客户端开销(输出和查询缓冲区、连接上下文)的总大小(以字节为单位) -
aof.buffer : AOF 相关缓冲区的总大小(以字节为单位) -
lua.caches : Lua 脚本缓存开销的总大小(以字节为单位) -
dbXXX : 对于服务器的每个数据库,主字典和过期字典(分别为overhead.hashtable.main 和overhead.hashtable.expires )的开销以字节为单位报告 -
overhead.total : 所有开销的总和,即 startup.allocated 、replication.backlog 、clients.slaves 、clients.normal 、aof.buffer 以及用于管理 Redis 键空间的内部数据结构的总和(参见 INFO 的 used_memory_overhead) -
keys.count : 整个redis实例key的个数 -
keys.bytes-per-key : 每个key平均字节数,net memory usage(total.allocated 减去 startup.allocated )与keys.count 的比值 -
dataset.bytes : Redis 实例中数据占用的总字节数,计算方法total.allocated 减去overhead.total -
dataset.percentage : Redis 数据消耗内存占总内存的百分比 -
peak.percentage : 当前内存消耗占峰值内存消耗的百分比 -
fragmentation : 同 INFO 的 mem_fragmentation_ratio
中文官方文档章节链接
3.debug object 命令
可以用来显示关于key的一些调试信息
debug object [key]
4.lua 脚本
格式:eval [script] [numkeys] key ... arg ...
如eval "return 'hello world'" 0 "hello world"
这里return 关键字主要用来返回命令执行的结果。如果我们不需要命令直接的结果,那就不需要写return 。
直接在脚本中通过调用redis.call() 函数或者redis.pcall() 函数执行Redis命令
如eval "return redis.call('set',KEYS[1],ARGV[1])" 1 "message" "hello world"
这里有2个地方需要注意:
redis.call() 函数和redis.pcall() 函数都可以用于执行Redis命令,它们之间唯一不同的就是处理错误的方式。前者在执行命令出错时会引发一个Lua错误,迫使EVAL命令向调用者返回一个错误;而后者则会将错误包裹起来,并返回一个表示错误的Lua表格.
值转换:
Redis服务器中有两种不同的环境:一种是Redis命令执行器所处的环境,而另一种则是Lua解释器所处的环境。因为这两种环境
使用的是不同的输入和输出,所以在这两种环境之间传递值将引发相应的转换操作:
1)当Lua脚本通过redis.call()函数或者redis.pcall()函数执行Redis命令时,传入的Lua值将被转换成Redis协议值;
2)当redis.call()函数或者redis.pcall()函数执行完Redis命令时,命令返回的Redis协议值将被转换成Lua值。
3)当Lua脚本执行完毕并向EVAL命令的调用者返回结果时,Lua值将被转换为Redis协议值。
将Redis协议值转换成Lua值的规则
将Lua值转换为Redis协议值的规则
全局变量保护
为了防止预定义的Lua环境被污染,Redis只允许用户在Lua脚本中创建局部变量而不允许创建全局变量,尝试在脚本中创建全局变量将引发一个错误。
通过lua脚本删除redis中多个key
在redis中没有通过正则去删除多个key的方法,所以我们可以通过lua脚本的方式去删除多个key。
首先看下lua脚本中关于数组遍历的方法。
arr = {"a","b","c"}
for i = 1, #arr do
print(arr[i])
end
将上面的内容存储到新建的名为a.lua文件中。执行lua a.lua 就可以分别打印a、b、c.
下面我们看看如果删除多个key。做法还是通过keys 命令查到多个符合要求的key,再通过遍历数组的方式删除。
比如我们要删除所有a 开头的key,就可以使用下面的命令。
eval "local ks=redis.call('keys',KEYS[1]) for i = 1, #ks do redis.call('del',ks[i]) end " 1 "a*"
|