Redis key操作实战(全)

目录

DEL 删除KEY

EXPIRE 设置过期时间

PERSIST 移除给定KEY的生存时间

EXPIREAT 设置过期时间-时间戳

TTL 获取剩余过期时间

PTTL 获取剩余过期时间

RENAME 重命名KEY

RENAMENX 重命名KEY

EXISTS 判断KEY是否存在

KEYS 按模式匹配KEY

SORT 排序

SORT key asc|desc 数字排序

SORT key alpha 字符串排序

sort key limit start size 限制返回数量

DUMP 序列化给定 KEY

RESTORE 反序列化给定 KEY

OBJECT 查看KEY内部存储信息

TYPE 查值的类型


DEL 删除KEY

DEL key [key ...]:删除给定的一个或多个 key

  • 若key不存在,则忽略
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name lisi    # 初始化key
OK
127.0.0.1:6379> set age 22
OK
(integer) 1
127.0.0.1:6379> lpush mylist apple banana orange pear
(integer) 4
127.0.0.1:6379> del name age mylist address # 删除key
(integer) 3    # 删除成功的key数量(不存在的key忽略)

时间复杂度:

  • 对于字符串类型的 key ,时间复杂度为O(N), N 为被删除的 key 的数量
  • 列表、集合、有序集合或哈希表类型的 key,时间复杂度为O(M), M 为以上数据结构内的元素数量

返回:

  • 被删除 key 的数量

EXPIRE 设置过期时间

EXPIRE key seconds:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除

  • 如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不会被改变
  • 对一个 key 执行 INCR 命令,对一个列表进行 LPUSH 命令,或者对一个哈希表执行 HSET 命令,这类操作都不会修改 key 本身的生存时间
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> expire age 20
(integer) 1
127.0.0.1:6379> get age    # 查看age值
"21"
127.0.0.1:6379> get age    # 过20秒再查看
(nil)
  • 对一个 key 进行改名,那么改名后的 key 的生存时间和改名前一样
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> expire name 20    # 设置过期时间为20秒
(integer) 1
127.0.0.1:6379> rename name name2 # 重命名key为name2
OK
127.0.0.1:6379> keys *       # 查看库中有多少key
1) "name2"
127.0.0.1:6379> get name2    # 查看name2信息
"lisi"
127.0.0.1:6379> get name2    # 过20秒再获取name2信息
(nil)
  • 使用PERSIST 可以删除key的生存时间(不删除key)
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> expire name 20    # 设置过期时期
(integer) 1
127.0.0.1:6379> persist name      # 对key为name执行persist命令
(integer) 1
127.0.0.1:6379> get name          # 获取name信息
"lisi"
127.0.0.1:6379> get name          # 过20秒再获取name信息
"lisi"
  • 多次对同一个KEY执行 EXPIRE 命令,后面的生存时间覆盖之前的生存时间
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> expire name 50
(integer) 1
127.0.0.1:6379> expire name 20
(integer) 1
127.0.0.1:6379> expire name 5
(integer) 1
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> get name    # 过5秒后查name信息
(nil)

时间复杂订O(1)。

返回:

  • 生成返回1
  • 失败返回0

PERSIST 移除给定KEY的生存时间

PERSIST key:将这个 key 从(带生存时间 key )的过期时间删除

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> expire name 10
(integer) 1
127.0.0.1:6379> persist name
(integer) 1
127.0.0.1:6379> ttl name
(integer) -1    # name的过期时间已清除,所以返回-1
127.0.0.1:6379> persist name
(integer) 0
127.0.0.1:6379> persist name1
(integer) 0

时间复杂度O(1)。

返回:

  • 当生存时间移除成功时,返回 1 
  • key 不存在或 key 没有设置生存时间,返回 0 

EXPIREAT 设置过期时间-时间戳

EXPIREAT key timestamp:操作与EXPIRE相似

  • 不同点:EXPIREAT的过期时间单位为时间戳,而EXPIRE的过期时间单位为秒

TTL 获取剩余过期时间

TTL key:以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)

127.0.0.1:6379> set name lisi ex 20
OK
127.0.0.1:6379> ttl name
(integer) 18
127.0.0.1:6379> ttl name
(integer) 6
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name
(nil)

时间复杂度O(1)

返回值:

  • 当 key 不存在时,返回 -2
  • 当 key 存在但没有设置剩余生存时间时,返回 -1 
  • 否则,以秒为单位,返回 key 的剩余生存时间

PTTL 获取剩余过期时间

PTTL key:操作类似于TTL

  • 不同点:PTTL以毫秒为单位返回,而TTL以秒为单位返回

RENAME 重命名KEY

RENAME key newkey:将 key 改名为 newkey 

  • 当 key 不存在时,返回一个错误
  • 当 newkey 已经存在时, RENAME 命令将覆盖旧值
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> rename name address    # key不存在
(error) ERR no such key
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> rename name name2      # 执行rename命令
OK
127.0.0.1:6379> set address guiyang
OK
127.0.0.1:6379> keys *
1) "address"
2) "name2"
127.0.0.1:6379> rename name2 address    # 执行rename命令
OK
127.0.0.1:6379> keys *                  # newkey已存在,直接覆盖,只剩下address一个key
1) "address"
127.0.0.1:6379> get address
"lisi"

时间复杂度O(1)。

返回值:

  • 改名成功时提示 OK 
  • 失败时候返回一个错误

RENAMENX 重命名KEY

RENAMENX key newkey:操作与RENAME相似

  • 不同点:当且仅当 newkey 不存在时,将 key 改名为 newkey

EXISTS 判断KEY是否存在

EXISTS key:检查给定 key 是否存在

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> exists name
(integer) 0
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> exists name
(integer) 1

时间复杂度O(1)。

返回:

  • 若 key 存在,返回 1 ,否则返回 0 

KEYS 按模式匹配KEY

KEYS pattern:查找所有符合给定模式 pattern 的 key

  • KEYS * :匹配数据库中所有 key(不推荐使用该命令)
  • KEYS h?llo :第二个字符字符匹配一个任何字符。如 匹配 hello,hallo 和 hxllo 等
  • KEYS h*llo :匹配第一个字符和最后三个字符,中间匹配任意字符。如 hllo 和 heeeeello 等
  • KEYS h[ae]llo: 第二个字符为a或e。如 hello 和 hallo ,但不匹配 hillo
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set hallo 2
OK
127.0.0.1:6379> set hxllo 3
OK
127.0.0.1:6379> set hillo 4
OK
127.0.0.1:6379> set habcdello 5
OK
127.0.0.1:6379> keys *
1) "habcdello"
2) "hallo"
3) "hello"
4) "hillo"
5) "hxllo"
127.0.0.1:6379> keys h?llo
1) "hallo"
2) "hello"
3) "hillo"
4) "hxllo"
127.0.0.1:6379> keys h*llo
1) "habcdello"
2) "hallo"
3) "hello"
4) "hillo"
5) "hxllo"
127.0.0.1:6379> keys h[ae]llo
1) "hallo"
2) "hello"

时间复杂度为O(N), N 为数据库中 key 的数量

返回:

  • 符合给定模式的 key 列表

SORT 排序

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC | DESC] [ALPHA] [STORE destination]

  • 返回或保存给定列表、集合、有序集合 KEY 中经过排序的元素
  • 排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较
  • 默认排序对象为数字

SORT key asc|desc 数字排序

127.0.0.1:6379> lpush mylist 2 4 3 1
(integer) 4
127.0.0.1:6379> sort mylist        # 默认为 asc
1) "1"
2) "2"
3) "3"
4) "4"
127.0.0.1:6379> sort mylist desc
1) "4"
2) "3"
3) "2"
4) "1"

SORT key alpha 字符串排序

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist a g b e j
(integer) 5
127.0.0.1:6379> sort mylist
(error) ERR One or more scores can't be converted into double # 字符串排序报错
127.0.0.1:6379> sort mylist alpha    # 添加alpha进行对字符串排序
1) "a"
2) "b"
3) "e"
4) "g"
5) "j"

sort key limit start size 限制返回数量

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> lpush mylist a g b e j
(integer) 5
127.0.0.1:6379> sort mylist asc alpha limit 0 2
1) "a"
2) "b"
  • start:开始位置
  • size:数量

DUMP 序列化给定 KEY

DUMP key:序列化给定 key ,并返回被序列化的值,使用 RESTORE 命令可以将这个值反序列化为 Redis 键

  • 它带有 64 位的校验和,用于检测错误, RESTORE 在进行反序列化之前会先检查校验和
  • 值的编码格式和 RDB 文件保持一致
  • RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本不同造成 RDB 格式不兼容,那么 Redis 会拒绝对这个值进行反序列化操作
127.0.0.1:6379> flushdb # 清空库
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> dump name # dump存在的key
"\x00\x04lisi\t\x00\xd2p\xcc\xfe6\x8d\xd9\x15"127.0.0.1:6379> dump age  # dump不存在的key
(nil)

时间复杂度:

  • 查找给定键的复杂度为 O(1) 
  • 对键进行序列化的复杂度为 O(N*M) ,其中 N 是构成 key 的 Redis 对象的数量,而 M 则是这些对象的平均大小
  • 若序列化的对象是比较小的字符串,那么复杂度为 O(1)

返回值:

  • 返回序列化之后的值
  • 若 key 不存在,那么返回 nil

RESTORE 反序列化给定 KEY

RESTORE key ttl serialized-value:反序列化给定的序列化值,并将它和给定的 key 关联

  • 参数 ttl 以毫秒为单位为 key 设置生存时间;如果 ttl 为 0 ,那么不设置生存时间
  • 反序列化前校验RDB版本的数据完整性,版本不同或不完整报错
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> dump name    # 序列化
"\x00\x04lisi\t\x00\xd2p\xcc\xfe6\x8d\xd9\x15"
127.0.0.1:6379> restore name2 0 "\x00\x04lisi\t\x00\xd2p\xcc\xfe6\x8d\xd9\x15" # 反序列化
OK
127.0.0.1:6379> keys *
1) "name2"
2) "name"
127.0.0.1:6379> get name
"lisi"
127.0.0.1:6379> get name2
"lisi"
127.0.0.1:6379> restore name2 0 "\x00\x04lisi\t\x00\xd2p\xcc\xfe6"    
(error) BUSYKEY Target key name already exists.    # 序列化值不完整,报错

时间复杂度

  • 查找给定键的复杂度为 O(1) ,对键进行反序列化的复杂度为 O(N*M) ,其中 N 是构成 key 的 Redis 对象的数量,而 M 则是这些对象的平均大小。
  • 有序集合(sorted set)的反序列化复杂度为 O(N*M*log(N)) ,因为有序集合每次插入的复杂度为 O(log(N)) 。
  • 如果反序列化的对象是比较小的字符串,那么复杂度为 O(1) 

返回值:

  • 反序列化成功,返回OK
  • 否则报错

OBJECT 查看KEY内部存储信息

OBJECT subcommand [arguments [arguments]]:允许从内部察看给定 key 的 Redis 对象

  • 通常用在除错或者了解为了节省空间而对 key 使用特殊编码的情况
  • 将Redis用作缓存程序时,你也可以通过 OBJECT 命令中的信息,决定 key 的驱逐策略(eviction policies)

子命令:

  • OBJECT REFCOUNT <key> 返回给定 key 引用所储存的值的次数。此命令主要用于除错
  • OBJECT ENCODING <key> 返回给定 key 锁储存的值所使用的内部表示(representation)
  • OBJECT IDLETIME <key> 返回给定 key 自储存以来的空转时间(idle, 没有被读取也没有被写入),以秒为单位
127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> set code 123456789901234567890
OK
127.0.0.1:6379> lpush mylist 1 2 3 4 5 b c d e f g h j 
(integer) 13
127.0.0.1:6379> hset myhash name lisi age 20 address 'guiyang'
(integer) 3
127.0.0.1:6379> sadd myset 1 2 3 a b c d e f hello world
(integer) 11
127.0.0.1:6379> zadd mysset 1 a 3 c 2 d 5 5 6 1a
(integer) 5
127.0.0.1:6379> object encoding name
"embstr"                                # 字符串
127.0.0.1:6379> object encoding age
"int"                                   # 数字
127.0.0.1:6379> object encoding code
"embstr"                                # 大的数字被编码为字符串
127.0.0.1:6379> object encoding mylist
"quicklist"                             # 列表
127.0.0.1:6379> object encoding myhash
"ziplist"                               # 集合
127.0.0.1:6379> object encoding myset
"hashtable"                             # hash
127.0.0.1:6379> object encoding mysset
"ziplist"                               # 有序集合

时间复杂度为O(1)。

返回值:

  • OBJECT REFCOUNT key 返回数字
  • OBJECT IDLETIME key 返回数字
  • OBJECT ENCODING key 返回相应的编码类型

TYPE 查值的类型

TYPE key:返回 key 所储存的值的类型。

127.0.0.1:6379> flushdb
OK
127.0.0.1:6379> set name lisi
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> set code 123456789901234567890
OK
127.0.0.1:6379> lpush mylist 1 2 3 4 5 b c d e f g h j 
(integer) 13
127.0.0.1:6379> hset myhash name lisi age 20 address 'guiyang'
(integer) 3
127.0.0.1:6379> sadd myset 1 2 3 a b c d e f hello world
(integer) 11
127.0.0.1:6379> zadd mysset 1 a 3 c 2 d 5 5 6 1a
(integer) 5
127.0.0.1:6379> type address
none
127.0.0.1:6379> type name
string                        # 字符串
127.0.0.1:6379> type age
string                        # 字符串
127.0.0.1:6379> type code
string                        # 字符串
127.0.0.1:6379> type mylist
list                          # 列表
127.0.0.1:6379> type myhash
hash                          # 哈希
127.0.0.1:6379> type myset
set                           # 集合
127.0.0.1:6379> type mysset
zset                          # 有序集合

时间复杂度O(1)。

返回:

  • none (key不存在)
  • string (字符串)
  • list (列表)
  • hash (哈希表)
  • set (集合)
  • zset (有序集)

PS:还有 SCAN迭代键、RANDOMKEY随机返回键、MIGRATE原子键跨实例移动、MOVE库之间移动等命令几乎用不上,有需要的同学请移步到官网查阅https://redis.io。
 

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

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

相关文章

uni-app 实现凸起的 tabbar 底部导航栏

效果图 在 pages.json 中设置隐藏自带的 tabbar 导航栏 "custom": true, // 开启自定义tabBar(不填每次原来的tabbar在重新加载时都回闪现) 新建一个 custom-tabbar.vue 自定义组件页面 custom-tabbar.vue <!-- 自定义底部导航栏 --> <template><v…

react.js在visual code 下的hello World

想学习reacr.js &#xff0c;就开始做一个hello world。 我的环境是visual code &#xff0c;所以我找这个环境下的例子。参照&#xff1a; https://code.visualstudio.com/docs/nodejs/reactjs-tutorial 要学习react.js &#xff0c;还得先安装node.js&#xff0c;我在visual …

9.29 听力笔记

exactly&#xff0c;convinced这种类似的&#xff0c;表示情感态度的单词要记听力原文中的名字写简写也要记

github代码提交过程详细介绍

1、下载github上面的代码 &#xff08;1&#xff09;在github网站上&#xff0c;找到想要下载的代码仓库界面&#xff0c;点击Code选项就可以看到仓库的git下载地址&#xff1b; &#xff08;2&#xff09;使用命令下载&#xff1a;git clone 地址&#xff1b; 2、配置本地git…

【通意千问】大模型GitHub开源工程学习笔记(1)

9月25日&#xff0c;阿里云开源通义千问140亿参数模型Qwen-14B及其对话模型Qwen-14B-Chat,免费可商用。 立马就到了GitHub去fork。 GitHub&#xff1a; GitHub - QwenLM/Qwen: The official repo of Qwen (通义千问) chat & pretrained large language model proposed b…

matlab自动生成FPGA rom源码

1 matlab 源码 close all clear all clci=0:1:(300000-100-1); x=300000./(100+i); x=x./2; x=round(

在vue使用wangEditor(简单使用)

wangEditor不同的版本使用方法都不一样&#xff0c;这里以目前最新的参考官网方法使用2023-09-28 首先安装&#xff0c;参考官网&#xff0c;注意editor跟editor-for-vue两个都要装 yarn add wangeditor/editor # 或者 npm install wangeditor/editor --saveyarn add wangedit…

【Linux指令集】---git命令的基本使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 演示环境&#xff1…

Event Loop——事件循环

JS 是单线程的&#xff0c;也就是同一个时刻只能做一件事情。 那么思考&#xff1a;为什么浏览器可以同时执行异步任务呢&#xff1f;因为浏览器是多线程的。 当 JS 需要执行异步任务时&#xff0c;浏览器会另外启动一个线程去执行该任务。 也就是说&#xff0c;“JS 是单线程…

Springboot中slf4j日志的简单应用

1、注入依赖&#xff08;pom.xml&#xff09; <!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --> <dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.9</version> &…

【5G PHY】物理层逻辑和物理天线的映射

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G算力网络技术标准研究。 博客…

最新AI创作系统源码ChatGPT源码+附详细搭建部署教程+AI绘画系统+支持国内AI提问模型

一、AI系统介绍 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&am…

数学术语之源——纤维(fiber)

1. 数学术语“纤维”(英英“fibre”,美英“fiber”)在数学中的起源 fiber[ˈfaɪbə(r)]这个词始于14世纪晚期&#xff0c;词义为“肝叶的一瓣(a lobe of the liver)”,也指“内脏(entrails)”。来自中世纪拉丁语“fibre”,其又源自拉丁语“fibra”,词义为“纤维(a fiber)、细…

31.链表练习题(2)(王道2023数据结构2.3.7节16-25题)

【前面使用的所有链表的定义在第29节】 试题16&#xff1a;两个整数序列A&#xff0c;B存在两个单链表中&#xff0c;设计算法判断B是否是A的连续子序列。 bool Pattern(LinkList L1,LinkList L2){ //此函数实现比较L1的子串中是否有L2LNode *p, *q; //工作在L1,p记录L1子串…

springcloud之自我介绍

写在前面 在这篇文章 中我们分析了单体应用的问题&#xff0c;以及用来解决这些问题的解决的方案微服务&#xff0c;并接着看了微服务需要考虑的各种&#xff0c;如服务调用&#xff0c;负载均衡&#xff0c;服务治理&#xff0c;链路追踪&#xff0c;分布式事务&#xff0c;等…

java中发射实现的三种方式

三种反射实现方式 通过 new 对象实现反射机制&#xff1b;通过路径实现反射机制&#xff1b;通过类名实现反射机制。 对象.getClass() User user new User(); Class userClass1 user.getClass(); System.out.println(userClass1.getName());通过所在路径 Class userClass…

【IDEA】使用idea调试时查看对象集合的值

1、在实体类上添加toString方法 2、在要查看集合的地方右键View as→toString 3、View Text复制对象集合的值 4、复制map集合的值同理

《动手学深度学习 Pytorch版》 7.6 残差网络(ResNet)

import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l7.6.1 函数类 如果把模型看作一个函数&#xff0c;我们设计的更强大的模型则可以看作范围更大的函数。为了使函数能逐渐靠拢到最优解&#xff0c;应尽量使函数嵌套&…

【1day】用友时空KSOA平台 imagefield接口SQL注入漏洞学习

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录

Qt 画自定义饼图统计的例子

先给出结果图&#xff0c;这个例子是将各种事件分类然后统计的其比例&#xff0c;然后画饼图显示出来 这个是我仿照官方给的例子&#xff0c;让后自己理解后&#xff0c;修改的&#xff0c;要生成饼图&#xff0c;需要QT的 charts 支持&#xff0c;安装QT 没有选择这个的&#…