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

一、KEYS:全量遍历键

KEYS pattern
  • 功能:用来获取此数据库中所有的键名

  • 注意事项:

    • KEYS命令需要遍历Redis中的所有键,当键的数量较多时会影响性能,不建议在生产环境下使用

  • 支持glob风格通配符格式,见下表:

  • 符号
    含义

    匹配一个字符
    *匹配任意个(包括0个)字符
    []
    匹配括号间的任一字符, 可以使用“-”符号表示一个范围,如a [b-d]可以匹配“ab"、ac"和“ad"
    \x
    匹配字符x,用于转义符号。如要匹配“?"就需要使用\?
  • KEYS命令使用扩展

  • 因为Redis采取单线程架构,如果Redis包含了大量的键,那么执行该命令可能会造成Redis阻塞,所以一般建议不要在生产环境下使用该命令

  • 有时候确实有遍历键的需求,那么可以在下面三种情况下使用:

    • 在一个不对外提供服务的Redis从节点上执行,这样不会阻塞到客户端 的请求,但是会影响到主从复制

    • 如果确认键值总数确实比较少,可以执行该命令

    • 使用下面要介绍的scan命令渐进式的遍历所有键,可以有效防止阻 塞。

演示案例

  • 下面是一些基本使用:

  • 当需要遍历所有键时(例如检测过期或闲置时间、寻找大对象等),KEYS是一个很有帮助的命令。例如想删除所有以video字符串开头的键,可以执行下面的命令:

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并不能保证完整的遍历出来所有的键,这在开发时需要考虑

 命令格式

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开头的元素全部删除,可以参考下面的伪代码:

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:判断键是否存在

EXISTS key [key2 key3...]
  • 功能:判断键是否存在

  • 返回值:

    • 成功返回存在的键数

    • 失败返回整数0

演示案例

四、RENAME:键的重命名

RENAME key newkey
  • 功能:用来重命名一个键

  • 返回值:

    • 更改的键存在,成功返回更改后的名称

    • 更改的键不存在,返回错误

演示案例

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

五、DEL:删除键

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:随机返回一个键

RANDOMKEY
  • 功能:每次执行随机返回数据库中的一个键 

  • 返回值:

    • 如果有键,随机返回一个键

    • 如果没有键,返回null

演示案例

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

七、TYPE:获取键类型

TYPE key
  • 功能:用来获得键的数据类型,而不是键值的数据类型

  • 返回值:

    • string:字符串类型

    • hash:散列类型

    • list:列表类型

    • set:集合类型

    • zet:有序集合类型

演示案例

、DBSIZE:获取键总数

dbsize
  • 功能:用来返回当前数据库中键的总数

  • 返回值:返回当前数据库中键的总数

与KEYS命令的区别

  • dbsize命令在计算键总数时不会遍历所有键,而是直接获取Redis内置的键总数变量,所以dbsize命令的时间复杂度为O(1)

  • 而keys命令会遍历所有键,所以它的时间复杂度是O(n),当Redis保存了大量键时,线上环境禁止使用

演示案例

  • 例如当前数据库中有26个键

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/444510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode67. 二进制求和

给定两个二进制字符串,返回他们的和(用二进制表示)。 输入为非空字符串且只包含数字 1 和 0。 示例 1: 输入: a "11", b "1" 输出: "100" 示例 2: 输入: a "1010", b "1011" 输出…

C++:13---继承(单一继承、多重继承、多级继承、菱形继承、虚继承)

一、基类与派生类的概念 基类(父类):在继承关系中处于上层的类派生类(子类):在继承关系中处于下层的类class A;class B;class C:public A //C为A的子类,A为C的父类{};class D:public A,public B //D为A和B的子类,A和B均为D的父类{};二、类派生列表 派生类通过派生类列…

(十三) 深入浅出TCPIP之setsockopt参数详解

在socket编程中我们会经常用到setsockopt这个函数,那么本节我们将对这个函数的参数和使用做说明: 首先看下函数原型: int setsockopt( int socket, int level, int option_name,const void *option_value, size_t ,ption_len); 第…

22种编程语言新年快乐

请允许我用22种编程语言&#xff0c;祝大家新年快乐 C语言&#xff1a;printf(“祝大家新年快乐”); C : cout<<“祝大家新年快乐”; OC: NSLog(“祝大家新年快乐”) QBasic : Print “祝大家新年快乐” Asp : Response.Write “祝大家新年快乐” PHP : echo “祝大家新年…

Redis:05---键的基本命令(下) 生存周期

一、设置键生存/过期时间生存时间&#xff08;Time To Live&#xff0c;TTL&#xff09;&#xff1a;在经过指定的秒数或者毫秒数之后&#xff0c;服务器就会自动删除生存时间为0的键过期时间&#xff08;expire time&#xff09;&#xff1a;是一个UNIX时间戳&#xff0c;当键…

数论基础代码合集

欧几里德 #include<iostream> using namespace std; int hcf(int a,int b) {int r0;while(b!0){ra%b;ab;br;}return(a); } lcd(int u,int v,int h) //ua&#xff0c;vb&#xff0c;h为最小公约数hcf(a,b); {return(u*v/h); } int main() {int a,b,x,y;cin>>…

C++:03---引用类型

一、概念 C++中的一种新的变量类型,作用是为变量取别名二、引用规则 引用被创建时必须被初始化(即必须指向一个对象,因此引用一旦被初始化,就不能再指向其他对象)int a = 10; int &p = a; //正确 int &p2; //错误,引用必须初始化引用的数据类型必须与被引用的…

三个博弈基础

&#xff08;一&#xff09;巴什博奕&#xff08;Bash Game&#xff09;&#xff1a;只有一堆n个物品&#xff0c;两个人轮流从这堆物品中取物&#xff0c;规定每次至少取一个&#xff0c;最多取m个。最后取光者得胜。 显然&#xff0c;如果nm1&#xff0c;那么由于一次最…

(十五)nodejs循序渐进-高性能游戏服务器框架pomelo之Protobuf模块

消息压缩 在实际编程中&#xff0c;为了减少数据传输带宽的消耗&#xff0c;提高传输效率&#xff0c;pomelo提供了对消息的压缩&#xff0c;包括基于字典的对route的压缩和基于protobuf的对具体传输数据的压缩。 route压缩 在实际编程中&#xff0c;网络带宽的有效数据负载…

C++:13---多态和虚函数表

多态的意思为“以一个public基类的指针/引用,寻址一个派生类对象”。 “多态”的关键在于通过基类指针或引用调用一个虚函数时,编译时不确定到底调用的是基类还是派生类的函数,运行时才确定。这是如何实现的呢?请看下面的程序,该程序演示了多态类对象存储空间的大小。 #in…

leetcode96. 不同的二叉搜索树 动归vs数学?

给定一个整数 n&#xff0c;求以 1 ... n 为节点组成的二叉搜索树有多少种&#xff1f; 示例: 输入: 3 输出: 5 解释: 给定 n 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 …

Redis:06---数据库管理

一、服务器中的数据库Redis服务器将所有数据库都保存在服务器状态redis.h/redisServer结构的db数组中&#xff0c;db数组的每个项都是一个redis.h/redisDb结构&#xff0c;每个redisDb结构代表一个数据库&#xff1a;struct redisServer {// ...redisDb *db; // 一个数组&#…

leetcode95. 不同的二叉搜索树 II

给定一个整数 n&#xff0c;生成所有由 1 ... n 为节点所组成的二叉搜索树。 示例: 输入: 3 输出: [ [1,null,3,2], [3,2,null,1], [3,1,null,null,2], [2,1,3], [1,null,2,null,3] ] 解释: 以上的输出对应以下 5 种不同结构的二叉搜索树&#xff1a; 1 3 …

在同一局域网下连接共享文件夹失败,提示:你不能访问共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问

1.尝试打开guest访问。 &#xff08;1&#xff09;使用键盘 win R 键&#xff0c;打开运行窗口&#xff0c;并输入 gpedit.msc 打开本地组策略编辑器窗口 &#xff08;2&#xff09;选择计算机配置------->管理模板-------->网络-------->Lanman工作站。 &#…

(十五)深入浅出TCPIP之Hello CDN

什么是CDNCDN 其实是 Content Delivery Network 的缩写&#xff0c;即“内容分发网络”。CDN是将媒体资源&#xff0c;动静态图片(Flash) &#xff0c;HTML, CSS, JS等等内容缓存到距离你更近的互联网数据中心&#xff0c;从而让用户进行共享资源&#xff0c;实现缩减站点间的响…

Redis:07---Redis数据结构

一、五大数据结构Redis可以存储键与5种不同数据结构类型之间的映射&#xff0c;这5种数据结构类型分别为&#xff1a;STRING&#xff1a;字符串LIST&#xff1a;列表SET&#xff1a;集合HASH&#xff1a;散列ZSET&#xff1a;有序集合TYPE命令用来获得键的数据类型&#xff0c;…

C++:14---虚继承,虚函数,多态

一、多级混合继承 下面先介绍菱形继承 //菱形继承 class A { public: int data; }; class B:public A { public: int data; }; class C:public A { public: int data; }; class D:public B,public C { public: int data; };int main() { D c; D.data=1; D.B::data=2;//访问B中的…

(十四)nodejs循序渐进-高性能游戏服务器框架pomelo之开发Treasures游戏

#Tutorial 2 -- Treasures ##描述 Treasures 游戏是从 LordOfPomelo 中抽取出来&#xff0c;去掉了大量的游戏逻辑&#xff0c;用以更好的展示 Pomelo 框架的用法以及运作机制。 Treasures 很简单&#xff0c;输入一个用户名后&#xff0c;会随机得到一个游戏角色&#xff0c;…

leetcode243. 最短单词距离(vip题)好像挺简单?

给定一个单词列表和两个单词 word1 和 word2&#xff0c;返回列表中这两个单词之间的最短距离。 示例: 假设 words ["practice", "makes", "perfect", "coding", "makes"] 输入: word1 “coding”, word2 “practice”…

谈谈苹果应用内支付(IAP)的坑

一、请求商品 下面是请求商品的代码: - (void)validateProductIdentifier:(NSArray *)productIdentifier {SKProductsRequest *productRequest = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIdentifier]];self.request = productRe…