前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Redis:04---键的基本命令(上)

Redis:04---键的基本命令(上)

作者头像
用户3479834
发布2021-02-03 15:36:23
4310
发布2021-02-03 15:36:23
举报
文章被收录于专栏:游戏开发司机游戏开发司机

一、KEYS:全量遍历键

代码语言:javascript
复制
KEYS pattern
  • 功能:用来获取此数据库中所有的键名
  • 注意事项:
    • KEYS命令需要遍历Redis中的所有键,当键的数量较多时会影响性能,不建议在生产环境下使用
  • 支持glob风格通配符格式,见下表:

符号

含义

匹配一个字符

*

匹配任意个(包括0个)字符

[]

匹配括号间的任一字符, 可以使用“-”符号表示一个范围,如a [b-d]可以匹配“ab"、ac"和“ad"

\x

匹配字符x,用于转义符号。如要匹配“?"就需要使用\?

  • KEYS命令使用扩展

  • 因为Redis采取单线程架构,如果Redis包含了大量的键,那么执行该命令可能会造成Redis阻塞,所以一般建议不要在生产环境下使用该命令
  • 有时候确实有遍历键的需求,那么可以在下面三种情况下使用:
    • 在一个不对外提供服务的Redis从节点上执行,这样不会阻塞到客户端 的请求,但是会影响到主从复制
    • 如果确认键值总数确实比较少,可以执行该命令
    • 使用下面要介绍的scan命令渐进式的遍历所有键,可以有效防止阻 塞。

演示案例

  • 下面是一些基本使用:
  • 当需要遍历所有键时(例如检测过期或闲置时间、寻找大对象等),KEYS是一个很有帮助的命令。例如想删除所有以video字符串开头的键,可以执行下面的命令:
代码语言:javascript
复制
redis-cli keys video* | xargs redis-cli del

二、SCAN:渐进式遍历键

命令介绍

  • Redis从2.8版本后,提供了一个新的命令scan,它能有效的解决keys命令存在的问题
  • 和keys命令执行时会遍历所有键不同,scan采用渐进式遍历的方式来解决keys命令可能带来的阻塞问题,每次scan命令的时间复杂度是O(1),但是要真正实现keys的功能,需要执行多次scan
  • Redis存储键值对实际使用的是hashtable的数据结构.
  • 那么每次执行scan,可以想象成只扫描一个字典中的一部分键,直到将字典中的所有键遍历完毕

SCAN命令可能会产生的问题

  • 如果在SCAN过程中有键发生变化(增加、删除、修改),那么遍历可能会遇到如下问题:新增的键可能没有遍历到,遍历出了重复的键等情况,也就是说SCAN并不能保证完整的遍历出来所有的键,这在开发时需要考虑

命令格式

代码语言:javascript
复制
scan cursor [match pattern] [count number]
  • 参数:
    • cursor是必需参数,实际上cursor是一个游标,第一次遍历从0开始,每次scan遍历完都会返回当前游标的值,直到游标值为0,表示遍历结束
    • match pattern是可选参数,它的作用的是做模式的匹配,这点和keys的模式匹配很像
    • count number是可选参数,它的作用是表明每次要遍历的键个数,默认值是10,此参数可以适当增大

演示案例

  • 例如当前Redis数据库中有26个键(26个英文字母),现在我们要分3次遍历完数据库中的26个键
  • 第一次执行"scan 0",返回两部分:
    • 第一部分10,代表下次scan需要的cursor
    • 第二部分是返回的11个键

第二次执行“scan 10”,因为上一次返回10,所以从“cursor=10”开始扫描,结果如下所示,返回10个键

  • 第二次执行“scan 3”,因为上一次返回3,所以从“cursor=3”开始扫描,结果如下所示,返回5个键
  • 上图中SCAN命令返回0,代表所有的键已经遍历完,所以遍历结束

扩展

  • 除了scan之外,Redis提供了面向哈希类型、集合类型、有序集合的扫描遍历命令。例如hgetall、smembers、zrange可能产生的阻塞问题,对应的命令分别是hscan、sscan、zscan,它们的用法和scan基本类似
  • 例如,下面以sscan为例,当前集合有两种类型的元素,分别为old:user和new:user开头,现需要将old:user开头的元素全部删除,可以参考下面的伪代码:
代码语言:javascript
复制
String key = "myset";
//定义pattern
String pattern = "old:user*";
// 游标每次从0开始
String cursor = "0";
while (true) {
  //获取扫描结果
  ScanResult scanResult = redis.sscan (key, cursor, pattern) ;
  List elemelts 上scanResult.getResult() ;
  if (elements != nu1l && elements.size () > 0) {
    //批量删除.
    redis.srem(key, elements) ;
  }
  //获取新的游标
  cursor = scanResult. getSStringCursor();
  / /如果游标为0表示遍历结果
  if ("0".equals(cursor)){
  break;
  }
}

三、EXISTS:判断键是否存在

代码语言:javascript
复制
EXISTS key [key2 key3...]
  • 功能:判断键是否存在
  • 返回值:
    • 成功返回存在的键数
    • 失败返回整数0

演示案例

四、RENAME:键的重命名

代码语言:javascript
复制
RENAME key newkey
  • 功能:用来重命名一个键
  • 返回值:
    • 更改的键存在,成功返回更改后的名称
    • 更改的键不存在,返回错误

演示案例

  • 例如当前数据库中有一个键名为Hello,现在将其重命名为World

五、DEL:删除键

代码语言:javascript
复制
DEL key [key2 key3...]
  • 功能:删除键
  • 返回值:
    • 返回删除的成功的键数
    • 如果删除一个不存在的键,返回0
  • 注意事项:
    • DEL不支持通配符,但是我们可以结合Linux的管道和xargs命令自己实现删除所有符合规则的键。例如要删除以“user:”开头的键,可以执行redis-cli KEYS "user:*" | xargs redis-cli DEL
    • 另外,由于DEL命令支持多个键参数,所以执行redis-cli DEL 'redis-cli KEYS "user:*" '达到同样的效果,但是性能更好

演示案例

六、RANDOMKEY:随机返回一个键

代码语言:javascript
复制
RANDOMKEY
  • 功能:每次执行随机返回数据库中的一个键
  • 返回值:
    • 如果有键,随机返回一个键
    • 如果没有键,返回null

演示案例

  • 例如当前数据库中26个键,每次执行命令会随机返回一个键

七、TYPE:获取键类型

代码语言:javascript
复制
TYPE key
  • 功能:用来获得键的数据类型,而不是键值的数据类型
  • 返回值:
    • string:字符串类型
    • hash:散列类型
    • list:列表类型
    • set:集合类型
    • zet:有序集合类型

演示案例

、DBSIZE:获取键总数

代码语言:javascript
复制
dbsize
  • 功能:用来返回当前数据库中键的总数
  • 返回值:返回当前数据库中键的总数

与KEYS命令的区别

  • dbsize命令在计算键总数时不会遍历所有键,而是直接获取Redis内置的键总数变量,所以dbsize命令的时间复杂度为O(1)
  • 而keys命令会遍历所有键,所以它的时间复杂度是O(n),当Redis保存了大量键时,线上环境禁止使用

演示案例

  • 例如当前数据库中有26个键
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 游戏开发司机 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、KEYS:全量遍历键
    • 演示案例
    • 二、SCAN:渐进式遍历键
      • 命令格式
      • 三、EXISTS:判断键是否存在
      • 四、RENAME:键的重命名
      • 五、DEL:删除键
      • 六、RANDOMKEY:随机返回一个键
      • 七、TYPE:获取键类型
      • 八、DBSIZE:获取键总数
      相关产品与服务
      数据库
      云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档