redis实用操作小结
- 键的命名
- 通常情况下是使用冒号来划分键名,如
user:id:name
- 这些冒号在早期的Redis版本中作为存储命名空间数据的概念。在早期版本中,redis只支持字符串,如果想存储电子邮件和“bob”的历史,必须将其全部存储为字符串,因此使用了冒号,如
user:bob:email
- 在redis中具有特殊的处理或性能特性,唯一的目的是命名数据空间以再次找到它。现在,可以使用散列来存储大部分的冒号键
- 使用合适的命名方法会简化你的数据库管理,当你通过你的应用程序或者服务做键的命名空间时,可以在数据迁移、转换或者删除时轻松的识别
- 删除匹配模式下的key
以删除所有以name开关的key为例
- 使用lua脚本
redis-cli -a "password" -n 0 -p 6379 keys "name:*" | xargs -i redis-cli -a "password" -n 0 -p 6379 del {}
- 这样一个坏处每次都要建立一个连接,量小的话还可以接受,量大的话,效率不行
- 使用内置的lua解释器
redis-cli -a "password" -n 0 -p 6379 EVAL "return redis.call('del', unpack(redis.call('keys', ARGV[1])))" 0 'name:*'
- 量大的情况下,lua函数unpack会出现问题:
(error) ERR Error running script (call to f_e177a091510d969af3b388ee986dbe6658df6b57): user_script:1: too many results to unpack
- 上述方式的改进
redis-cli -a "password" -n 0 -p 6379 EVAL "local keys = redis.call('keys', ARGV[1]) for i=1,#keys,5000 do redis.call('del', unpack(keys, i, math.min(i+4999, #keys))) end return #keys" 0 'name:*'
- 一次性unpack太多会出问题,那就干脆一次5000吧,这样就不会有问题了
- 使用scan命令
redis-cli -a "password" -n 0 -p 6379 --scan --pattern "name:*" | xargs -L 5000 redis-cli -a "password" -n 0 -p 6379 DEL
- 自从redis2.8以后就开始支持scan命令,速度处理也是非常快的
- 排序
返回或存储key的list
、set
或sorted set
中的元素。默认是按照数值类型排序的,并且按照两个元素的双精度浮点数类型值进行比较,如果是字符串需要加ALPHA参数。
- 普通排序
sort key
按照key升序排列sort key desc
降序排序SORT testkey alpha
testkey中存储的为字符串时这样使用
- 使用limit限制返回结果,此修饰符有一个 offset 参数,指定了跳过的元素数量;还带有一个 count 参数,指定了从 offset 开始返回的元素数量
SORT mylist LIMIT 0 10
返回排序后的列表 mylist 从第0个元素(offset 是从0开始的)开始的10个元素SORT mylist LIMIT 0 5 ALPHA DESC
,修饰符一起使用
- 使用外部key排序,使用外部key 的数据作为权重,代替默认的直接对比键值的方式来进行排序
SORT mylist BY weight_*
列表 mylist包含元素1、 2 和 3,分别代表了存储在object_1、object_2 和 object_3中的对象的唯一ID。当这些对象关联到存储在weight_1、 weight_2 和 weight_3 中的权重后, SORT 命令就能使用这些权重按照下述语句来对 mylist 排序SORT mylist BY nosort
选项可以是一个并不存在的key,这会导致 SORT 命令跳过排序操作。这在我们获取未经排序的外部key(参考下文的 GET 选项)时非常有用
- 获取外键get
SORT mylist BY weight_* GET object_* GET #
GET 选项可多次使用,以便获取每一个原始列表、集合或有序集合中元素的key。还可以通过使用特殊 # 模式获取 GET 元素本身SORT mylist BY weight_*->fieldname GET object_*->fieldname
可以在hash的属性上使用 BY 和 GET 选项,字符串 -> 用于区分key名称和哈希属性的名称。key被替换为上面所记录的,结果key中存储的hash用于获取特定hash的属性
- 保存排序结果
SORT mylist BY weight_* STORE resultkey
使用 STORE 选项,可以将结果存储于一个特定的列表中,以代替返回到客户端
- 键空间通知
键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件(截止目前,该功能尚不完善,仍在开发中)。
- 注意:
- Redis 目前的订阅与发布功能采取的是发送即忘(fire and forget)策略, 所以如果你的程序需要可靠事件通知(reliable notification of events), 那么目前的键空间通知可能并不适合你
- 当订阅事件的客户端断线时, 它会丢失所有在断线期间分发给它的事件
- 事件类型
- 键空间通知,所有通知以
__keyspace@<db>__
为前缀,键空间频道的订阅者将接收到被执行的事件的名字,如 del - 键事件通知,所有通知以
__keyevent@<db>__
为前缀,键事件频道的订阅者将接收到被执行事件的键的名字,如 mykey
- 键空间通知,所有通知以
- 配置
- 因为开启键空间通知功能需要消耗一些 CPU , 所以在默认配置下, 该功能处于关闭状态
- 可以通过修改 redis.conf 文件, 或者直接使用 CONFIG SET 命令来开启或关闭键空间通知功能
- 当 notify-keyspace-events 选项的参数为空字符串时,功能关闭
notify-keyspace-events
的参数可以是以下字符的任意组合, 它指定了服务器该发送哪些类型的通知:
字符 | 发送的通知 |
---|---|
K | 键空间通知,所有通知以 keyspace@ 为前缀 |
E | 键事件通知,所有通知以 keyevent@ 为前缀 |
g | DEL 、 EXPIRE 、 RENAME 等类型无关的通用命令的通知 |
$ | 字符串命令的通知 |
l | 列表命令的通知 |
s | 集合命令的通知 |
h | 哈希命令的通知 |
z | 有序集合的通知 |
x | 过期事件:每当有过期键被删除时发送 |
e | 驱逐事件:每当有键因为 maxmemory 政策而被删除时发送 |
A | 参数 g$lshzxe 的别名,所有事件 |
- 输入的参数中至少要有一个 K 或者 E , 否则的话, 不管其余的参数是什么, 都不会有任何通知被分发
- 将参数设为字符串 “AKE” 表示发送所有类型的通知
- 如下示例,设置监听所有键空间事件,一段时间后关闭:
127.0.0.1:6379> config set notify-keyspace-events KA
127.0.0.1:6379> psubscribe '__key*__:*'
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "__key*__:*"
3) (integer) 1
127.0.0.1:6379> config set notify-keyspace-events ""