redis实用操作小结

redis实用操作小结

  1. 键的命名
  • 通常情况下是使用冒号来划分键名,如user:id:name
  • 这些冒号在早期的Redis版本中作为存储命名空间数据的概念。在早期版本中,redis只支持字符串,如果想存储电子邮件和“bob”的历史,必须将其全部存储为字符串,因此使用了冒号,如user:bob:email
  • 在redis中具有特殊的处理或性能特性,唯一的目的是命名数据空间以再次找到它。现在,可以使用散列来存储大部分的冒号键
  • 使用合适的命名方法会简化你的数据库管理,当你通过你的应用程序或者服务做键的命名空间时,可以在数据迁移、转换或者删除时轻松的识别

  1. 删除匹配模式下的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命令,速度处理也是非常快的

  1. 排序
    返回或存储key的listsetsorted 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 选项,可以将结果存储于一个特定的列表中,以代替返回到客户端

  1. 键空间通知
    键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 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@ 为前缀
gDEL 、 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 ""

参考资料
Redis 命令参考
超大批量删除redis中无用key+配置
Redis的排序命令使用(Sort)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值