Redis命令使用

Redis是以键值对进行数据存储的,添加数据和查找数据最常用的2个指令就是setget

  • set:set指令用来添加数据。把key和value存储进去。
  • get:get指令用来查找相应的键所对应的值。根据key来取value。
    首先,我们先进入到redis客户端。然后使用setget
    请添加图片描述

对于这里的key和value,不需要加上引号,就可以表示字符串的类型。如果要是给key和value加上引号也是可以的(单引号或双引号都可以)。redis中的命令不区分大小写。
如果get到一个不存在的key,那么就会显示(nil),这个意思与NULL一样,表示找不到,为空。
请添加图片描述

Redis全局命令

Redis支持很多种数据结构,整体来说,Redis是键值对结构,key只能是字符串,value实际上有很多种类型,比如说,字符串、哈希表、列表、集合、有序集合等等,操作不同的数据结构就会有不同的命令。
所以,全局命令,就是能够搭配任意一个数据结构来使用的命令。

keys

  • keys:返回所有满足样式(pattern)的 key。⽀持如下统配样式。
    语法:KEYS pattern
  1. h?llo匹配hellohallohxllo。匹配任意一个字符
  2. h*llo 匹配 hllo 和 heeeello。匹配0个或多个任意字符
  3. h[ae]llo 匹配 hello 和 hallo 但不匹配 hillo。即匹配包含a或e的键
  4. h[^e]llo 匹配 hallo , hbllo , … 但不匹配 hello。即除了包含e的不符合,其它都符合。
  5. h[a-b]llo 匹配 hallo 和 hbllo。匹配a到b这个范围内的字符,包含两侧边界。

命令有效版本:1.0.0 之后
时间复杂度: O ( N ) O(N) O(N)
返回值:匹配 pattern 的所有 key。
示例:

// 创建key
redis 127.0.0.1:6379> SET runoob1 redis
OK
redis 127.0.0.1:6379> SET runoob2 mysql
OK
redis 127.0.0.1:6379> SET runoob3 mongodb
OK// 查找以 runoob 为开头的 key:
redis 127.0.0.1:6379> KEYS runoob*
6) "runoob3"
7) "runoob1"
8) "runoob2"//获取 redis 中所有的 key 可用使用 *。
redis 127.0.0.1:6379> KEYS *
9) "runoob3"
10) "runoob1"
11) "runoob2"

在生产环境中,一般都会禁止使用keys命令,尤其是keys *:查询redis中所有的key。

EXISTS

这个命令是判断某个值是否存在。
语法:EXISTS key [key ...]
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:key 存在的个数。
示例:

127.0.0.1:6379> set hello 111
OK
127.0.0.1:6379> set hallo 222
OK
127.0.0.1:6379> set haxxllo 333
OK
127.0.0.1:6379> keys *
1) "hello"
2) "hallo"
3) "school"
4) "car"
5) "haxxllo"
6) "test"
127.0.0.1:6379> exists hello car
(integer) 2
127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> exists car
(integer) 1

exists判断的时候,一次判断和分开判断时是有区别的。因为redis是一个客户端、服务器结构的程序。客户端和服务器之间通过网络来进行通信。一次判断完的话,只会产生一次请求和响应。而用两次判断的话,会多增加一次请求和响应。分开的写法,会产生更多轮次的网络通信。所以能一次查找最好。

DEL

删除指定的 key。
语法:DEL key [key ...]
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:删除掉的 key 的个数。
示例:

127.0.0.1:6379> keys *
1) "hello"
2) "hallo"
3) "school"
4) "car"
5) "haxxllo"
6) "test"
127.0.0.1:6379> del car
(integer) 1
127.0.0.1:6379> del hallo
(integer) 1
127.0.0.1:6379> keys *
1) "hello"
2) "school"
3) "haxxllo"
4) "test"

EXPIRE

为指定的 key 添加秒级的过期时间(Time To Live TTL)
语法:EXPIRE key seconds
命令有效版本:1.0.0 之后
时间复杂度:O(1)
返回值:1 表示设置成功。0 表示设置失败。
这个的场景会用在验证码或者优惠券在指定时间之前有效等等。
示例:

127.0.0.1:6379> keys *
1) "hello"
2) "school"
3) "haxxllo"
4) "test"
127.0.0.1:6379> expire hello 10
(integer) 1
127.0.0.1:6379> get hello
"111"
127.0.0.1:6379> get hello
"111"
127.0.0.1:6379> get hello
"111"
127.0.0.1:6379> get hello
(nil)

TTL

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

127.0.0.1:6379> keys *
1) "school"
2) "haxxllo"
3) "test"
127.0.0.1:6379> expire school 10
(integer) 1
127.0.0.1:6379> ttl school
(integer) 6
127.0.0.1:6379> ttl school
(integer) 3
127.0.0.1:6379> ttl school
(integer) -2

[!note] 注意
EXPIRE 和 TTL 命令都有对应的支持毫秒为单位的版本:PEXPIRE 和 PTTL,详细⽤法就不再介绍了。

TYPE

返回 key 对应的值的数据类型。
语法:TYPE key
命令有效版本:1.0.0 之后
比特就业课时间复杂度:O(1)
返回值: none , string , list , set , zset , hash 和stream(用于消息队列和日志存储,支持消息的持久化和时间排序) 。
示例:

 redis> SET key1 "value"
"OK"
redis> LPUSH key2 "value"
(integer) 1
redis> SADD key3 "value"
(integer) 1
redis> TYPE key1
"string"
redis> TYPE key2
"list"
redis> TYPE key3
"set

FLUSHALL

这个命令用于清除所有的键,相当于MySQL中的drop dataname,这个命令不能随便使用。开玩笑来说这个命令是“删库跑路”。
语法:flushall

127.0.0.1:6379> keys *
1) "key1"
2) "key2"
3) "key3"
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty array)

数据类型与内部编码

Redis 针对每种数据结构都有⾃⼰的底层内部编码实现,而且是多种实现,这样 Redis 会在合适的场景选择合适的内部编码。

数据类型说明
string(字符串)基本的数据存储单元,可以存储字符串、整数或者浮点数
hash(哈希)一个键值对的集合,可以存储多个字段
list(列表)一个简单的列表,可以存储一系列的字符串元素
set(集合)一个无序集合,可以存储不重复的字符串元素
zset(有序集合)类似于集合,但是每个元素都有一个分数(权重)与之关联
Bitmaps(位图)基于字符串类型,可以对每个位进行操作
Stream(流)用于消息队列和日志存储,支持消息的持久化和时间排序

还有其它的数据类型,不过最常用的就是前5种。其它的数据类型也某些特定的场景下才会用到。
Redis在底层实现上述数据结构的时候,会在源码层面,针对上述实现进行特定的优化,来节省时间/空间的效果,其中特定的优化就是编码方式
另外Redis承诺,我这个哈希表,你在进行查询、插入、删除操作的时候,保证时间复杂度为O(1),但是这个背后的实现,不一定就是一个标准的哈希表。可能在特定的场景下,使用别的数据结构实现,但是仍然保证时间复杂度符合承诺。
每种数据类型,都可能会有多种实现方式,Redis称其为编码方式,常见编码方式如下表:

数据类型内部编码
stringraw
int
embstr
hashhashtable
ziplist
listlinkedlist
ziplist
sethashtable
intset
zsetskiplist
ziplist
  1. string
    • int:存储的字符串是一个可以用64位有符号整数表示的数字时,会用int编码。
    • raw:存储的字符串长度超过44字节时,会使用raw编码。raw编码需要两次内存分配,分别用于存储Redis对象头和字符串数据。
    • embstr:存储的字符串长度小于等于44字节时,会使用embstr编码。embstr编码将redis对象头和字符串数据连续存储在一块内存中,避免了多次内存分配,提高了内存使用效率和操作性能。
  2. hash
    • hashtable:是一种标准的哈希表数据结构,支持快速的查找。插入和删除操作,适合存储大规模的哈希对象。
    • ziplist:同时满足2个条件,才会使用ziplist编码。第一,哈希对象保存到键值对数量小于hash-max-ziplist-entries(默认值是512);第二,哈希对象保存的所有键值对的键和值的字符串长度都小于hash - max - ziplist - value(默认值为 64)。ziplist是一种紧凑的、连续的内存数据结构,适合存储小的哈希对象,可以节省内存
  3. list
    • linkedlist:是一种双向链表数据结构,支持在列表的两端快速插入和删除元素,但内存开销较大。
  4. set
    • intset:当集合对象同时满足以下两个条件时,Redis 会使用intset编码。第一,集合对象保存的所有元素都是整数值。第二,集合对象保存的元素数量小于set - max - intset - entries(默认值为 512)。 intset是一种紧凑的整数集合数据结构,适合存储整数集合,可以节省内存
    • hashtable:当集合对象不满足intset编码的条件时,Redis 会使用hashtable编码。hashtable的键用于存储集合元素,值都为NULL,支持快速的查找、插入和删除操作。
  5. zset
    • ziplist:ziplist编码的有序集合将成员和分数依次存储在ziplist中,并且按照分数从小到大排序,适合存储小的有序集合。
    • skiplist:skiplist是一种跳跃表数据结构,它结合了链表和二分查找的思想,支持快速的插入、删除和查找操作,同时还可以按照分数范围进行快速遍历。在 Redis 中,skiplist还会和hashtable结合使用,hashtable用于快速查找成员的分数,skiplist用于维护元素的有序性。

示例:

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"

可以通过 object encoding 命令查询内部编码:


为什么可以看到每种数据结构都有至少两种以上的内部编码实现?Redis 这样设计有两个好处:

  1. 可以改进内部编码,而对外的数据结构和命令没有任何影响,这样⼀旦开发出更优秀的内部编码,⽆需改动外部数据结构和命令,例如 Redis 3.2 提供了 quicklist,结合了 ziplist 和 linkedlist 两者的优势,为列表类型提供了⼀种更为优秀的内部编码实现,而对用户来说基本无感知。
  2. 多种内部编码实现可以在不同场景下发挥各自的优势,例如 ziplist 比较节省内存,但是在列表元素比较多的情况下,性能会下降,这时候 Redis 会根据配置选项将列表类型的内部实现转换为linkedlist,整个过程⽤户同样无感知。

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

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

相关文章

Linux打开.img镜像文件

kparkx 可以查看和修改img文件的内容 1.安装kparkx 1.安装 kpartx sudo apt-get update sudo apt-get install kpartx2.使用kpartx映射镜像文件 假设镜像文件名为 example.img ,以下命令会将其分区映射到 dev/mapper/ sudo kpartx -av example.img• -a表示添加…

6.4 计算机网络面试题

HTTP到底是不是无状态的? 无状态即每个请求都是独立的,服务器不会在多个请求间保存关于客户端状态的信息。 HTTP虽然是无状态的,但是可以通过一些机制保存状态,如使用cookies session跟踪用户状态。 携带Cookie的HTTP请求是有状…

基于千帆大模型的AI体检报告解读系统实战:使用OSS与PDFBox实现PDF内容识别

目录 说明 前言 需求 流程说明 表结构说明 整体流程 百度智能云 注册和实名认证 创建应用 费用说明 大模型API说明 集成大模型 设计Prompt 上传体检报告 读取PDF内容 功能实现 智能评测 抽取大模型工具 功能实现 总结 说明 AI体检报告解读、病例小结或者…

湖北理元理律师事务所:债务优化中的生活保障实践

在债务压力与生活质量失衡的普遍困境中,法律服务的价值不仅在于解决债务问题,更在于帮助债务人重建生活秩序。湖北理元理律师事务所通过其债务优化服务,探索出一条“法律生活”的双轨路径。 债务规划的核心矛盾:还款能力与生存需…

无人机智能识别交通目标,AI视觉赋能城市交通治理新高度

在城市化快速发展的当下,如何实现对道路交通的智能化管理、保障出行安全,成为城市治理的重要命题。传统的交通监控往往依赖地面摄像头,受限于固定视角与安装环境。而今,随着人工智能与无人机技术的深度融合,一种更高效…

unity UI Rect Transform“高”性能写法

🎯 Unity UI 性能优化终极指南 — RectTransform篇 🧩 RectTransform 是什么? Unity UI中每一个UI元素的必备组件继承自 Transform,但专门用于 2D 布局负责定义UI的位置、大小、锚点、旋转、缩放 ⚠️ 特别注意:所有…

JDK21深度解密 Day 8:Spring Boot 3与虚拟线程整合

【JDK21深度解密 Day 8】Spring Boot 3与虚拟线程整合 引言:Spring Boot 3遇上JDK21虚拟线程 在本系列的第8天,我们将聚焦于Spring Boot 3与JDK21虚拟线程的整合实践。作为全网首套完整的JDK21特性解析,我们不仅会探讨虚拟线程如何颠覆传统Java并发模型,还会通过完整的Sp…

【STM32F407 PWM配置和应用指南 】

PWM基本概念 PWM(脉冲宽度调制)是一种通过快速开关数字信号来控制模拟电路的技术,通过改变脉冲的占空比来控制平均电压。STM32F407的定时器外设可以生成PWM信号。 STM32F407 PWM配置步骤 1. 定时器时钟使能 首先需要使能定时器的时钟&…

鸿蒙【HarmonyOS 5】 (React Native)的实战教程

一、环境配置 ‌安装鸿蒙专属模板‌ bashCopy Code npx react-native0.72.5 init HarmonyApp --template react-native-template-harmony:ml-citation{ref"4,6" data"citationList"} ‌配置 ArkTS 模块路径‌ 在 entry/src/main/ets 目录下创建原生模块&…

MYSQL MGR高可用

1,MYSQL MGR高可用是什么 简单来说,MySQL MGR 的核心目标就是:确保数据库服务在部分节点(服务器)发生故障时,整个数据库集群依然能够继续提供读写服务,最大限度地减少停机时间。 2. 核心优势 v…

(18)混合云架构部署

文章目录 🚀 混合云架构部署:Java应用的云原生之旅🌩️ 混合云架构简介⚡ Java应用云原生部署五大核心技术1️⃣ 容器化与编排技术2️⃣ 服务网格与API网关3️⃣ CI/CD自动化流水线4️⃣ 多云管理平台5️⃣ 云原生Java框架与运行时 &#x1f…

虚拟现实教育终端技术方案——基于EFISH-SCB-RK3588的全场景国产化替代

一、VR教育终端技术挑战与替代价值 ‌实时交互性能瓶颈‌ 赛扬N100/N150仅支持3DOF渲染(延迟>25ms),动态手势识别帧率≤15FPS,难以满足6DOF教学场景需求RK3588 Mali-G610 GPU支持6DOF空间渲染(延迟≤12ms&…

pikachu靶场通关笔记14 XSS关卡10-XSS之js输出(五种方法渗透)

目录 一、源码分析 1、进入靶场 2、代码审计 二、渗透实战 1、根据提示输入tmac 2、XSS探测 3、注入Payload1 4、注入Payload2 5、注入Payload3 6、注入Payload4 7、注入Payload5 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关)渗透集合&#x…

PARADISE:用于新生儿缺氧缺血性脑病(HIE)疾病识别与分割的个性化和区域适应性方法|文献速递-深度学习医疗AI最新文献

Title 题目 PARADISE: Personalized and regional adaptation for HIE disease identification and segmentation PARADISE:用于新生儿缺氧缺血性脑病(HIE)疾病识别与分割的个性化和区域适应性方法 1 文献速递介绍 缺氧缺血性脑病&…

OpenCV C++ 心形雨动画

❤️ OpenCV C 心形雨动画 ❤️ 本文将引导你使用 C 和 OpenCV 库创建一个可爱的心形雨动画。在这个动画中,心形会从屏幕顶部的随机位置落下,模拟下雨的效果。使用opencv定制自己的专属背景 目录 简介先决条件核心概念实现步骤 创建项目定义心形结构…

【记录】Python|Python支持if 1<a<2、if not a、if a is None这三种写法

今天让AI帮我写代码&#xff0c;突然发现写出来一句类似1<a<2&#xff0c;我顿感疑惑&#xff1a;不是只能用and连接吗&#xff1f; 一试发现真行&#xff0c;那我辛辛苦苦写了好几年的 (条件1) and (条件2) 算什么&#xff1f;算我勤快吗&#xff1f;&#x1f62d; 常…

Matlab | MATLAB 中的插值详解

MATLAB 中的插值详解 插值是数值分析中的核心技术,用于在已知数据点之间估计未知点的值。MATLAB 提供了完整的插值函数库,涵盖一维到高维数据,支持多种插值方法。以下从基础到高级全面解析: 一、插值核心概念 1. 数学本质 给定数据点 ( x i , y i ) (x_i, y_i) (<

正则表达式检测文件类型是否为视频或图片

// 配置化文件类型检测&#xff08;集中管理支持的类型&#xff09; const FILE_TYPE_CONFIG {video: {extensions: [mp4, webm, ogg, quicktime], // 可扩展支持更多格式regex: /^video\/(mp4|webm|ogg|quicktime)$/i // 自动生成正则},image: {extensions: [jpeg, jpg, png,…

Redis最佳实践——热点数据缓存详解

Redis在电商热点数据缓存中的最佳实践 一、热点数据定义与识别 1. 热点数据特征 高频访问&#xff08;QPS > 1000&#xff09;数据规模适中&#xff08;单条 < 10KB&#xff09;数据变化频率低&#xff08;更新间隔 > 5分钟&#xff09;业务关键性高&#xff08;直接…

8088单板机C语言sprintf()格式化串口输出---Prj04

#include "tiny_stdarg.h" // 使用自定义可变参数实现#define ADR_273 0x0200 #define ADR_244 0x0400 #define LED_PORT 0x800 #define PC16550_THR 0x1f0 #define PC16550_LSR 0x1f5 / //基本的IO操作函数 / char str[]"Hello World! 20250531 Ve…