【Redis】Redis基本命令(1)

KEYS

返回所有满足样式(pattern)的key。

  • KEY * 返回所有key,不简易使用
    性能问题:当 Redis 存储百万级键时,会消耗大量 CPU 和内存资源,Redis 是单线程模型,KEYS * 执行期间会阻塞其他所有命令(包括读写操作),导致服务短暂不可用。
    生产环境风险:
    阻塞导致请求堆积
    客户端超时重试
    最终导致 Redis 崩溃
    返回大量键名时可能撑爆客户端内存

  • yid?i 其中 ?匹配任意一个字符,比如 yidaiyideiyidii
    在这里插入图片描述

  • yid*i 其中 * 匹配任意一串字符,比如 yidaiyideeeeeiyidi
    在这里插入图片描述

  • yi[ae]ai 其中 [ae] 代表匹配 a 或者 e 任意一个字符,比如 yidaiyidei
    在这里插入图片描述

  • yi[^e]ai 其中 [^e] 代表匹配除了 e 的任意一个字符,比如 yidai 但不匹配 yidei
    在这里插入图片描述

  • yi[a-e]ai 其中 [a-e] 代表匹配 a 到 e 任意一个字符,比如 yidaiyideiyidbi
    用法:KEYS pattern
    在这里插入图片描述
    命令有效版本:1.0.0 以后
    时间复杂度为O(N)
    返回值为匹配 pattern 的所有 key

EXIST

判断某个key是否存在
语法:EXISTS key [key ...]
可以一次查找一个或者多个key

 127.0.0.1:6379> EXISTS yidai 
(integer) 1
127.0.0.1:6379> EXISTS yidai yidi hello
(integer) 3

时间复杂度为O(1)
返回值为 key 存在的个数

DEL

删除指定的 key
可以一次删除一个或者多个key
语法:DEL key [key ...]

127.0.0.1:6379> DEL yidai yidi 
(integer) 2

返回值:删除key的个数
时间复杂度:O(1)

EXPIRE

为指定的 key 添加秒级的过期时间(Time To Live TTL)
语法:EXPIRE key seconds
时间复杂度:O(1)
返回值:成功时返回1,失败返回0

127.0.0.1:6379> EXPIRE hello 10
(integer) 1

TTL

获取指定 key 的过期时间,秒级。
语法:TTL key
时间复杂度:O(1)
返回值:剩余过期时间。-1 表示没有关联过期时间,-2 表示 key 不存在。

127.0.0.1:6379> TTL yidei
(integer) -1

TYPE

Redis TYPE 命令返回值详解

返回值对应的数据结构示例或说明
string字符串类型SET name "Alice"TYPE name 返回 string
list列表类型LPUSH fruits "apple"TYPE fruits 返回 list
hash哈希类型HSET user:1 name "Bob"TYPE user:1 返回 hash
set集合类型SADD tags "red"TYPE tags 返回 set
zset有序集合类型ZADD leaderboard 100 "player1"TYPE leaderboard 返回 zset
stream流类型(Redis 5.0+)XADD mystream * field1 "value1"TYPE mystream 返回 stream
nonekey 不存在TYPE non_existent_key 返回 none

语法​​:TYPE key_name
​​时间复杂度​​:O(1)
​​特殊场景​​:

  • 已过期的 key 仍会返回原类型,直到 redis 清除
  • 空数据结构(如空列表)仍返回对应类型
  • 模块扩展类型可能返回自定义类型名
127.0.0.1:6379> SET greeting "Hello"
OK
127.0.0.1:6379> TYPE greeting
string
127.0.0.1:6379> TYPE missing_key
none

redis 的5种数据类型内部编码

Redis 数据结构内部编码对照表

数据结构内部编码说明
stringraw普通字符串编码(长度大于44字节时使用)
int整数值编码(当字符串可表示为64位整数时)
embstr嵌入式字符串编码(长度≤44字节时使用,内存连续分配)
hashhashtable标准哈希表实现(元素较多时使用)
ziplist压缩列表实现(元素较少且值较小时默认使用)
listlinkedlist双向链表实现(Redis 3.2前使用)
ziplist压缩列表实现(Redis 3.2前默认)
quicklist快速列表实现(Redis 3.2+默认,由ziplist组成的双向链表)
sethashtable标准哈希表实现
intset整数集合实现(当元素均为整数且数量较少时使用)
zsetskiplist跳表+哈希表组合实现(元素较多时使用)
ziplist压缩列表实现(元素较少且值较小时默认使用)

关键说明:

  1. 编码转换阈值(可通过配置文件调整):
    # redis.conf 示例配置
    hash-max-ziplist-entries 512  # hash元素超过512时转hashtable
    hash-max-ziplist-value 64      # hash字段值超过64字节时转hashtable

object encoding

可以查看数据结构内部编码

127.0.0.1:6379> set hello world
OK
127.0.0.1:6379> lpush mylist a b c
(integer) 3
127.0.0.1:6379> object encoding hello
"embstr"
127.0.0.1:6379> object encoding mylist
"quicklist"

Redis 这样设计有两个好处:
内存效率​​:针对不同数据特征选择最优编码
​​性能优化​​:平衡读写速度与存储开销
​​弹性扩展​​:自动适应数据规模变化

String字符串

字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意:
1)⾸先 Redis 中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型
2)字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似 JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚⾄是⼆进制流数据,例如图片、⾳频、视频等。不过⼀个字符串的最大值不能超过 512 MB。

注意:由于 Redis 内部存储字符串完全是按照⼆进制流的形式保存的,所以 Redis 是不处理字符集编码问题的,客⼾端传⼊的命令中使⽤的是什么字符集编码,就存储什么字符集编码。

SET

将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。
语法:SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
时间复杂度:O(1)
选项:
SET 命令⽀持多种选项来影响它的⾏为:

  • EX seconds⸺使⽤秒作为单位设置 key 的过期时间。
  • PX milliseconds⸺使⽤毫秒作为单位设置 key 的过期时间。
  • NX ⸺只在 key 不存在时才进行设置,即如果 key 之前已经存在,设置不执行。
  • XX ⸺只在 key 存在时才进行设置,即如果 key 之前不存在,设置不执行。
    返回值:
  • 如果设置成功,返回 OK。
  • 如果由于 SET 指定了 NX 或者 XX 但条件不满足,SET 不会执行,并返回 (nil)。
127.0.0.1:6379> SET hello 1  EX 10 
OK
127.0.0.1:6379> ttl hello
(integer) 8
127.0.0.1:6379> set hello 2 px 1000
OK
127.0.0.1:6379> pttl hello
(integer) -2
127.0.0.1:6379> set hello 2 px 1000
OK
127.0.0.1:6379> pttl hello
(integer) 490
127.0.0.1:6379> set hello 111 NX
OK
127.0.0.1:6379> set hello 111 NX
(nil)
127.0.0.1:6379> set yidai 123 EX 10 XX
(nil)
127.0.0.1:6379> set yidai 123 EX 10 NX
OK
127.0.0.1:6379> set yidai 123 EX 10 XX
OK

SETNX

设置 key-value 但只允许在 key 之前不存在的情况下
语法:SETNX key value
时间复杂度:O(1)
返回值:1 表示设置成功。0 表示没有设置。

127.0.0.1:6379> SETNX YIDAI 123
(integer) 1
127.0.0.1:6379> SETNX YIDAI 123
(integer) 0

GET

获取 key 对应的 value。
语法:GET key
时间复杂度:O(1)
返回值:key 对应的 value,或者 nil 当 key 不存在。如果 value 的数据类型不是 string,会报错。

127.0.0.1:6379> lpush yidai 1 2 3
(integer) 3
127.0.0.1:6379> TYPE yidai
list
127.0.0.1:6379> GET yidai
(error) WRONGTYPE Operation against a key holding the wrong kind of value
127.0.0.1:6379> set key 1
OK
127.0.0.1:6379> get key
"1"

MGET

⼀次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil

语法:MGET key [key ...]
时间复杂度:O(K),K是key的个数
返回值:对应value的列表

127.0.0.1:6379> set hello 1
OK
127.0.0.1:6379> set yidai 2
OK
127.0.0.1:6379> mget hello yidai
1) "1"
2) "2"

MSET

⼀次性设置多个 key 的值。
语法:MSET key value [key value ...]
时间复杂度:O(K),K是key的个数
返回值:OK

127.0.0.1:6379> MSET key1 1 key2 2
OK

多次GET 和 MGET的区别

在这里插入图片描述
其中 MGET 有效减少了网络通信的时间,一次查找完了多个key值,而 get
需要多次查询,增加了网络通信时间消耗,降低了效率
注意:用MGET也需要注意查询建的个数,不能过于庞大,否则可能导致命令执行时间过长,导致Redis阻塞

计数命令

INCR

将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:INCR key
时间复杂度:O(1)
返回值:integer 类型的加完后的数值

127.0.0.1:6379> EXISTS LL
(integer) 0
127.0.0.1:6379> INCR LL
(integer) 1
127.0.0.1:6379> INCR LL
(integer) 2
127.0.0.1:6379> SET KK 10
OK
127.0.0.1:6379> INCR KK
(integer) 11
127.0.0.1:6379> SET NUM 239204940933333333333333333335333333333333
OK
127.0.0.1:6379> INCR NUM
(error) ERR value is not an integer or out of range
127.0.0.1:6379> SET str dsdaf
OK
127.0.0.1:6379> INCR str
(error) ERR value is not an integer or out of range

INCRBY

将 key 对应的 string 表示的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:INCRBY key decrement
时间复杂度:O(1)
返回值:integer 类型的加完后的数值

127.0.0.1:6379> EXISTS ky
(integer) 0
127.0.0.1:6379> INCRBY ky 2
(integer) 2
127.0.0.1:6379> INCRBY by -1
(integer) -1

DECR

将 key 对应的 string 表⽰的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错
语法:DECR key
时间复杂度:O(1)
返回值:integer 类型的减完后的数值

127.0.0.1:6379> EXISTS ui
(integer) 0
127.0.0.1:6379> DECR ui
(integer) -1

DECRBY

将 key 对应的 string 表示的数字减上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:DECRBY key decrement
时间复杂度:O(1)
返回值:integer 类型的加完后的数值

127.0.0.1:6379> EXISTS we 
(integer) 0
127.0.0.1:6379> DECRBY we -2
(integer) 2

INCRBYFLOAT

将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表示浮点数。
语法:INCRBYFLOAT key increment
时间复杂度:O(1)
返回值:加/减完后的数值

127.0.0.1:6379> EXISTS float
(integer) 0
127.0.0.1:6379> INCRBY float -1
(integer) -1
127.0.0.1:6379> INCRBYFLOAT float -1
"-2"
127.0.0.1:6379> INCRBYFLOAT float -0.5
"-2.5"
127.0.0.1:6379> INCRBYFLOAT float 10.5
"8"
127.0.0.1:6379> INCRBYFLOAT float 1e5
"100008"

APPEND

如果 key 已经存在并且是⼀个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在,则效果等同于 SET 命令。
语法:APPEND KEY VALUE
时间复杂度:O(1)
返回值:追加完成之后 string 的⻓度。

127.0.0.1:6379> EXISTS ss
(integer) 0
127.0.0.1:6379> APPEND ss 1
(integer) 1
127.0.0.1:6379> GET ss
"1"
127.0.0.1:6379> APPEND ss sdad
(integer) 5
127.0.0.1:6379> GET ss
"1sdad"

GETRANGE

返回 key 对应的 string 的子串,由 start 和 end 确定(左闭右闭)。可以使用负数表示倒数。-1 代表倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的长度调整成正确的值
语法:GETRANGE key start end
时间复杂度:O(N)
返回值:string类型的子串

127.0.0.1:6379> SET yidai "i am yidai"
OK
127.0.0.1:6379> GETRANGE yidayi 0 4
""
127.0.0.1:6379> GETRANGE yidai 0 4
"i am "
127.0.0.1:6379> GETRANGE yidai 0 7
"i am yid"
127.0.0.1:6379> GETRANGE yidai 0 9
"i am yidai"

SETRANGE

覆盖字符串的⼀部分,从指定的偏移开始
语法:SETRANGE key offset value
时间复杂度:O(N)
返回值:替换后 string类型的长度

127.0.0.1:6379> SET key "hello world"
OK
127.0.0.1:6379> SETRANGE key 6 redis
(integer) 11
127.0.0.1:6379> GET key
"hello redis"

STRLEN

获取 key 对应的 string 的⻓度。当 key 存放的类似不是 string 时,报错。
语法:STRLEN key
时间复杂度:O(1)
返回值:string 的长度。或者当 key 不存在时,返回 0。

127.0.0.1:6379> SET yidai yidai
OK
127.0.0.1:6379> STRLEN yidia
(integer) 0
127.0.0.1:6379> STRLEN yidai
(integer) 5

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

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

相关文章

C#通用常见面试题-精心整理

以下是优化后的版本,在原有内容基础上补充了应用场景,其他结构保持不变: 上位机面试题解答(技术详解+示例) C#-IOC框架 1. 值类型和引用类型的本质区别 解释 值类型:存储在栈中,直接保存数据值(如 int, struct)。引用类型:存储在堆中,变量保存对象地址(如 class,…

K8S节点出现Evicted状态“被驱逐”

在Kubernetes集群中,Pod状态为“被驱逐(evicted)”表示Pod无法在当前节点上继续运行,已被集群从节点上移除。 问题分析: 节点磁盘空间不足 ,使用df -h查看磁盘使用情况 可以看到根目录 / 已100%满&#x…

[密码学基础]国密算法深度解析:中国密码标准的自主化之路

国密算法深度解析:中国密码标准的自主化之路 国密算法(SM系列算法)是中国自主研发的密码技术标准体系,旨在打破国际密码技术垄断,保障国家信息安全。本文将从技术原理、应用场景和生态发展三个维度,全面解…

Linux 网络基础(三) TCP/IP协议

一、TCP 与 IP 的关系 IP 层的核心作用是定位主机,具有将数据从主机 A 发送到主机 B 的能力,但是能力并不能保证一定能够做到,所以这时就需要 TCP 起作用了,TCP 可以通过超时重传、拥塞控制等策略来保证数据能够发送到 B 主机。 所…

基于 Vue 的Tiptap 富文本编辑器使用指南

目录 🧰 技术栈 📦 所需依赖 📁 文件结构 🧱 编辑器组件实现(components/Editor.vue) ✨ 常用操作指令 🧠 小贴士 🧩 Tiptap 扩展功能使用说明(含快捷键与命令&am…

统计图表ECharts

统计某个时间段,观看人数 ①、数据表 ②、业务代码 RestController RequstMapping(value"/admin/vod/videoVisitor") CrossOrigin public class VideoVisitorController{Autowriedprivate VideoVisitorService videoVisitorService;//课程统计的接口…

ubuntu 安装 redis server

ubuntu 安装 redis server sudo apt update sudo apt install redis-server The following NEW packages will be installed:libhiredis0.14 libjemalloc2 liblua5.1-0 lua-bitop lua-cjson redis-server redis-toolssudo systemctl start redis-server sudo systemctl ena…

【白雪讲堂】[特殊字符]内容战略地图|GEO优化框架下的内容全景布局

📍内容战略地图|GEO优化框架下的内容全景布局 1️⃣ 顶层目标:GEO优化战略 目标关键词: 被AI理解(AEO) 被AI优先推荐(GEO) 在关键场景中被AI复读引用 2️⃣ 三大引擎逻辑&#x…

NVIDIA 自动驾驶技术见解

前言 参与 NVIDIA自动驾驶开发者实验室 活动,以及解读了 NVIDIA 安全报告 自动驾驶 白皮书,本文是我的一些思考和见解。自动驾驶技术的目标是为了改善道理安全、减少交通堵塞,重塑更安全、高效、包容的交通生态。在这一领域,NVI…

OpenCV day6

函数内容接上文:OpenCV day4-CSDN博客 , OpenCV day5-CSDN博客 目录 平滑(模糊) 25.cv2.blur(): 26.cv2.boxFilter(): 27.cv2.GaussianBlur(): 28.cv2.medianBlur(): 29.cv2.bilateralFilter(): 锐…

Function calling, 模态上下文协议(MCP),多步能力协议(MCP) 和 A2A的区别

背景阐述 本文大部分内容都是基于openAI 的 chatGPT自动生成。作者进行了一些细微的调整。 LLM 带来了很多思维的活跃,基于LLM,产生了很多应用,很多应用也激活了LLM的新的功能。 Function calling,MCP(Modal Contex…

火山RTC 5 转推CDN 布局合成规则

实时音视频房间&#xff0c;转推CDN&#xff0c;文档&#xff1a; 转推直播--实时音视频-火山引擎 一、转推CDN 0、前提 * 在调用该接口前&#xff0c;你需要在[控制台](https://console.volcengine.com/rtc/workplaceRTC)开启转推直播功能。<br> * 调…

力扣面试150题--插入区间和用最少数量的箭引爆气球

Day 28 题目描述 思路 初次思路&#xff1a;借鉴一下昨天题解的思路&#xff0c;将插入的区间与区间数组作比较&#xff0c;插入到升序的数组中&#xff0c;其他的和&#xff08;合并区间&#xff09;做法一样。 注意需要特殊处理一下情况&#xff0c;插入区间比数组中最后一…

【Java面试笔记:基础】4.强引用、软引用、弱引用、幻象引用有什么区别?

1. 引用类型及其特点 强引用(Strong Reference): 定义:最常见的引用类型,通过new关键字直接创建。回收条件:只要强引用存在,对象不会被GC回收。示例:Object obj = new Object(); // 强引用特点: 强引用是导致内存泄漏的常见原因(如未及时置为null)。手动断开引用:…

ycsb性能测试的优缺点

YCSB&#xff08;Yahoo Cloud Serving Benchmark&#xff09;是一个开源的性能测试框架&#xff0c;用于评估分布式系统的读写性能。它具有以下优点和缺点&#xff1a; 优点&#xff1a; 简单易用&#xff1a;YCSB提供了简单的API和配置文件&#xff0c;使得性能测试非常容易…

基于SpringBoot的校园赛事直播管理系统-项目分享

基于SpringBoot的校园赛事直播管理系统-项目分享 项目介绍项目摘要管理员功能图用户功能图项目预览首页总览个人中心礼物管理主播管理 最后 项目介绍 使用者&#xff1a;管理员、用户 开发技术&#xff1a;MySQLJavaSpringBootVue 项目摘要 随着互联网和移动技术的持续进步&…

Nginx​中间件的解析

目录 一、Nginx的核心架构解析 二、Nginx的典型应用场景 三、Nginx的配置优化实践 四、Nginx的常见缺陷与漏洞 一、Nginx的核心架构解析 ​​事件驱动与非阻塞IO模型​​ Nginx采用基于epoll/kq等系统调用的事件驱动机制&#xff0c;通过异步非阻塞方式处理请求&#xff0c;…

杭州小红书代运营公司-品融电商:全域增长策略的实践者

杭州小红书代运营公司-品融电商&#xff1a;全域增长策略的实践者 在品牌竞争日趋激烈的电商领域&#xff0c;杭州品融电商作为一家专注于品牌化全域运营的服务商&#xff0c;凭借其“效品合一”方法论与行业领先的小红书代运营能力&#xff0c;已成为众多品牌实现市场突围的重…

【映客直播-注册/登录安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

Android audio_policy_configuration.xml加载流程

目录 一、audio_policy_configuration.xml文件被加载流程 1、AudioPolicyService 创建阶段 2、createAudioPolicyManager 实现 3、AudioPolicyManager 构造 4、配置文件解析 loadConfig 5、核心解析逻辑 PolicySerializer::deserialize 二、AudioPolicyConfig类解析 1、…