6

redis笔记补充 - wang03

 2 years ago
source link: https://www.cnblogs.com/wbo112/p/16104289.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

具体的信息大家可以查看官方文档部分的介绍:https://redis.io/commands/info/

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.mainoverhead.hashtable.expires)的开销以字节为单位报告

  • overhead.total: 所有开销的总和,即 startup.allocatedreplication.backlogclients.slavesclients.normalaof.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: 同 INFOmem_fragmentation_ratio

    中文官方文档链接:https://www.redis.com.cn/commands/memory-stats.html

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个地方需要注意:

  • 数组下标是从1开始
  • KEYS,ARGV都必须大写

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*"

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK