Redis命令使用
Redis
是以键值对进行数据存储的,添加数据和查找数据最常用的2个指令就是set
和get
。
- set:set指令用来添加数据。把key和value存储进去。
- get:get指令用来查找相应的键所对应的值。根据key来取value。
首先,我们先进入到redis客户端。然后使用set
和get
。
对于这里的key和value,不需要加上引号,就可以表示字符串的类型。如果要是给key和value加上引号也是可以的(单引号或双引号都可以)。redis中的命令不区分大小写。
如果get
到一个不存在的key
,那么就会显示(nil)
,这个意思与NULL一样,表示找不到,为空。
Redis全局命令
Redis支持很多种数据结构,整体来说,Redis是键值对结构,key只能是字符串,value实际上有很多种类型,比如说,字符串、哈希表、列表、集合、有序集合等等,操作不同的数据结构就会有不同的命令。
所以,全局命令,就是能够搭配任意一个数据结构来使用的命令。
keys
- keys:返回所有满足样式(pattern)的 key。⽀持如下统配样式。
语法:KEYS pattern
h?llo
匹配hello
,hallo
和hxllo
。匹配任意一个字符h*llo
匹配 hllo 和 heeeello。匹配0个或多个任意字符h[ae]llo
匹配 hello 和 hallo 但不匹配 hillo。即匹配包含a或e的键h[^e]llo
匹配 hallo , hbllo , … 但不匹配 hello。即除了包含e的不符合,其它都符合。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
称其为编码方式,常见编码方式如下表:
数据类型 | 内部编码 |
---|---|
string | raw int embstr |
hash | hashtable ziplist |
list | linkedlist ziplist |
set | hashtable intset |
zset | skiplist ziplist |
- string
- int:存储的字符串是一个可以用64位有符号整数表示的数字时,会用int编码。
- raw:存储的字符串长度超过44字节时,会使用raw编码。raw编码需要两次内存分配,分别用于存储Redis对象头和字符串数据。
- embstr:存储的字符串长度小于等于44字节时,会使用embstr编码。embstr编码将redis对象头和字符串数据连续存储在一块内存中,避免了多次内存分配,提高了内存使用效率和操作性能。
- hash
- hashtable:是一种标准的哈希表数据结构,支持快速的查找。插入和删除操作,适合存储大规模的哈希对象。
- ziplist:同时满足2个条件,才会使用ziplist编码。第一,哈希对象保存到键值对数量小于
hash-max-ziplist-entries
(默认值是512);第二,哈希对象保存的所有键值对的键和值的字符串长度都小于hash - max - ziplist - value
(默认值为 64)。ziplist
是一种紧凑的、连续的内存数据结构,适合存储小的哈希对象,可以节省内存。
- list
- linkedlist:是一种双向链表数据结构,支持在列表的两端快速插入和删除元素,但内存开销较大。
- set
- intset:当集合对象同时满足以下两个条件时,Redis 会使用
intset
编码。第一,集合对象保存的所有元素都是整数值。第二,集合对象保存的元素数量小于set - max - intset - entries
(默认值为 512)。intset
是一种紧凑的整数集合数据结构,适合存储整数集合,可以节省内存。 - hashtable:当集合对象不满足
intset
编码的条件时,Redis 会使用hashtable
编码。hashtable
的键用于存储集合元素,值都为NULL
,支持快速的查找、插入和删除操作。
- intset:当集合对象同时满足以下两个条件时,Redis 会使用
- zset
- ziplist:
ziplist
编码的有序集合将成员和分数依次存储在ziplist
中,并且按照分数从小到大排序,适合存储小的有序集合。 - skiplist:
skiplist
是一种跳跃表数据结构,它结合了链表和二分查找的思想,支持快速的插入、删除和查找操作,同时还可以按照分数范围进行快速遍历。在 Redis 中,skiplist
还会和hashtable
结合使用,hashtable
用于快速查找成员的分数,skiplist
用于维护元素的有序性。
- ziplist:
示例:
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 这样设计有两个好处:
- 可以改进内部编码,而对外的数据结构和命令没有任何影响,这样⼀旦开发出更优秀的内部编码,⽆需改动外部数据结构和命令,例如 Redis 3.2 提供了 quicklist,结合了 ziplist 和 linkedlist 两者的优势,为列表类型提供了⼀种更为优秀的内部编码实现,而对用户来说基本无感知。
- 多种内部编码实现可以在不同场景下发挥各自的优势,例如 ziplist 比较节省内存,但是在列表元素比较多的情况下,性能会下降,这时候 Redis 会根据配置选项将列表类型的内部实现转换为linkedlist,整个过程⽤户同样无感知。
相关文章:

Redis命令使用
Redis是以键值对进行数据存储的,添加数据和查找数据最常用的2个指令就是set和get。 set:set指令用来添加数据。把key和value存储进去。get:get指令用来查找相应的键所对应的值。根据key来取value。 首先,我们先进入到redis客户端…...

【免费数据】1980-2022年中国2384个站点的水质数据
水,是生命之源,关乎着地球上每一个生物的生存与发展。健康的水生生态系统维持着整个水生态的平衡与活力;更是确保人类能持续获得清洁水源的重要保障。水质数据在水质研究、海洋生物量测算以及生物多样性评估等诸多关键领域都扮演着举足轻重的…...
Java基础 Day28 完结篇
一、方法引用 对 Lambda 表达式的进一步简化 方法引用使用一对冒号 :: Tips:静态方法用类名加双冒号,非静态方法用对象名加双冒号 通过方法的名字来指向一个方法 参数可推导即可省略 可以使语言的构造更紧凑简洁,减少冗余代码 二、单元…...
小红薯商品搜索详情分析与实现
前言 小红书作为国内知名的社交电商平台,拥有丰富的商品数据和用户评价信息。对于数据分析师、产品经理或电商从业者来说,能够获取小红书的商品数据具有重要的商业价值。本文将详细介绍如何通过逆向工程实现小红书商品搜索API的调用。 免责声明:本文仅用于技术学习和研究目…...

Git 极简使用指南
Git 是一个强大的分布式版本控制系统,但入门只需要掌握几个核心概念和命令。本指南旨在帮助你快速上手,处理日常开发中最常见的 80% 的场景。 核心概念 仓库 (Repository / Repo): 你的项目文件夹,包含了项目的所有文件和完整的历史记录。…...

力扣刷题Day 69:搜索二维矩阵(74)
1.题目描述 2.思路 首先判断target是否有可能在矩阵的某一行里,没可能直接返回False,有可能就在这一行里二分查找。 3.代码(Python3) class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> boo…...
c#压缩与解压缩-SharpCompress
SharpCompress SharpCompress 是一个开源项目库,能够处理文件。c#库对于压缩已经有很多,可以随意选择,看了SharpCompress感觉比较简洁,还是介绍给大家。 项目地址: sharpcompress 项目使用 引入nuget包࿱…...
Neo4j 安全深度解析:原理、技术与最佳实践
在当今数据驱动的世界中,图数据库承载着关键的关系信息,其安全性至关重要。Neo4j 提供了一套多层次、纵深防御的安全体系。 Neo4j 的安全体系提供了从认证授权到数据加密、审计追溯的完整解决方案。安全不是单一功能而是一种持续状态,其有效…...

MySQL指令个人笔记
MySQL学习,SQL语言笔记 一、MySQL 1.1 启动、停止 启动 net start mysql83停止 net stop mysql831.2 连接、断开 连接 mysql -h localhost -P 3306 -u root -p断开 exit或者ctrlc 二、DDL 2.1 库管理 2.1.1 直接创建库 使用默认字符集和排序方式…...

2022年 国内税务年鉴PDF电子版Excel
2022年 国内税务年鉴PDF电子版Excelhttps://download.csdn.net/download/2401_84585615/89784658 https://download.csdn.net/download/2401_84585615/89784658 2022年国内税务年鉴是对中国税收政策、税制改革和税务管理实践的全面总结。这份年鉴详细记录了中国税收系统的整体状…...

基于Java的OPCDA采集中间件
1.软件功能及技术特点简介: 软件功能及技术特点简介: OPCDA是基于Java语言开发的OPC client(OPC客户端)跨平台中间件软件,他支持OPC SERVER的OPC DA1.0/2.0/3.0。OPCDA实时采集数据(包括实时数据、报警数…...
基于PyQt5的相机手动标定工具:原理、实现与应用
基于PyQt5的相机手动标定工具:原理、实现与应用 一、背景介绍二、功能详解与实现原理2.1 图像加载与预处理2.2 交互式透视调整2.3 透视变换数学原理2.4 图像拼接核心技术2.5 用户界面优化细节三、完整使用流程四、应用场景实例五、技术优势分析六、代码七、总结一、背景介绍 …...

vue2 项目中 npm run dev 运行98% after emitting CopyPlugin 卡死
今天在运行项目时,发现如下问题: 开始以为是node_modules依赖的问题,于是重新 npm install,重启项目后还是未解决。 在网上找了一圈发现有人说是 require引入图片地址没有写。在我的项目中排查没有这个问题,最后发现某…...

JavaScript 性能优化实战:从原理到框架的全栈优化指南
在 Web 应用复杂度指数级增长的今天,JavaScript 性能优化已成为衡量前端工程质量的核心指标。本文将结合现代浏览器引擎特性与一线大厂实践经验,构建从基础原理到框架定制的完整优化体系,助你打造高性能 Web 应用。 一、性能优化基础&#x…...

2025年- H61-Lc169--74.搜索二维矩阵(二分查找)--Java版
1.题目描述 2.思路 方法一: 定义其实坐标,右上角的元素(0,n-1)。进入while循环(注意边界条件,行数小于m,列数要>0)从右上角开始开始向左遍历(比当…...
微服务商城-用户微服务
数据表 用户表 CREATE DATABASE user; USE user;CREATE TABLE user (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 用户ID,username varchar(50) NOT NULL DEFAULT COMMENT 用户名,password varchar(50) NOT NULL DEFAULT COMMENT 用户密码,MD5加密…...
数学复习笔记 26
5.25:这题还是有点难度的。主要是出现了新的知识点,我现在还没有那么熟悉这个新的知识点。这块就是,假设一个矩阵可以写成一个列向量乘以一个行向量的形式,这两个向量都是非零向量,那么这个矩阵的秩等于一。这个的原理…...
创建型-设计模式
文章目录 单例模式工厂模式建造者模式原型模式 单例模式 单例模式有饿汉式 和 懒汉式。这个我觉得无需多言,每个学过Java的都知道。 1.单例的使用:我一般就是用饿汉式,因为App开发的开发一般数据处理并不复杂,所以直接使用饿汉式…...
移动AI神器GPT Mobile:多模型自由切换
GPT Mobile是什么 GPT Mobile是一款开源的本地移动部署AI工具,主要用于安卓设备。以下是其相关介绍: 功能特点 多模型交互:支持与多个大型语言模型(LLM)同时进行对话,用户导入相应的API密钥,就可连接OpenAI、Anthropic、Google、Ollama等平台,还能根据需求自由切换不同…...

【黄金评论】美元走强压制金价:基于NLP政策因子与ARIMA-GARCH的联动效应解析
一、基本面:多因子模型解析黄金承压逻辑 1. 政策冲击因子驱动美元强势 通过NLP模型对关税政策文本进行情感分析,构建政策不确定性指数(PUI)达89.3,触发美元避险需求溢价。DSGE模型模拟显示,钢铁关税上调至…...
ubutu修改网关
修改Netplan配置以指定静态网关 1. 编辑Netplan配置文件 打开Netplan配置文件(通常位于 /etc/netplan/01-netcfg.yaml 或类似路径): sudo nano /etc/netplan/01-netcfg.yaml 2. 修改配置文件 在DHCP配置基础上,添加静态网关和…...

Flink进阶之路:解锁大数据处理新境界
目录 一、Flink 基础回顾 二、Flink 进阶知识深入 2.1 数据类型与序列化 2.2 双流 Join 操作 2.3 复杂事件处理(CEP) 2.4 状态管理与优化 三、Flink 在实际场景中的应用 3.1 实时智能推荐 3.2 实时欺诈检测 3.3 实时数仓与 ETL 四、Flink 性能…...

【论文阅读】Dolphin: Document Image Parsing via Heterogeneous Anchor Prompting
Paper:https://arxiv.org/abs/2505.14059 Source code: https://github.com/bytedance/Dolphin 作者机构:字节跳动 背景 业务场景 企业数据大多数都以文本、图片、扫描件、电子表格、在线文档、邮件等文档的形式存在,例如:PDF文…...

谷歌地图免费下载手机版
软件标签: 谷歌地图 谷歌卫星高清地图 下载链接:夸克网盘分享 手机地图 谷歌地图免费下载(google maps)是谷歌公司打造的手机高清电子地图。2024谷歌地图官方中文版能够直观的表达出世界各地的地点,在地图中能够清晰的了解到自身的定位,让…...

DeepSeek 赋能金融衍生品:定价与风险管理的智能革命
目录 一、引言1.1 金融衍生品市场发展现状1.2 DeepSeek 的技术特点和优势1.3 研究目的和意义 二、金融衍生品定价与风险管理基础2.1 金融衍生品定价常用方法2.2 金融风险管理主要策略 三、DeepSeek 在金融衍生品定价中的应用3.1 DeepSeek 助力定价模型构建3.2 案例分析…...
SpringBoot-15-多表查询之多对多查询可选中间表
文章目录 1 mysql数据库1.1 role角色表1.2 user用户表1.3 user_role中间表2 实体类2.1 Role.java2.2 User.java3 mapper3.1 RoleMapper.java3.2 UserMapper.java4 xml4.1 RoleMapper.xml4.2 UserMapper.xml5 UserController.java6 测试7 参考附录多对多查询,一个用户可以有多个…...

论文中pdf图片文件太大怎么办
文章目录 1.使用pdf文件的打印功能将文件导出2.操作3.前后文件大小对比 1.使用pdf文件的打印功能将文件导出 该方法在保证清晰度的同时,内存空间也能实现减少(如果使用线上的压缩pdf工具,清晰度会直线下降) 2.操作 点击文件—&…...

简单爬虫框架实现
1. 框架功能概述 (1) HttpSession 类:请求管理 功能:封装 requests 库,实现带重试机制的 HTTP 请求(GET/POST)。关键特性: 自动处理 429(请求过多)、5xx(服务器错误&am…...

MVCC理解
MySQL的MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种高效的并发控制机制,通过维护数据的多个版本实现读写操作的并行执行,显著提升数据库的并发性能和数据一致性。 MVCC 的实现依赖于:隐…...

705SJBH超市库存管理系统文献综述
前言 信息化的发展已经对我们的日常生活产生了积极的影响,无论是企业、商店、机关、甚至个人,每天都面对着大量的信息,而如果能有效地识别有用信息,并在对它们加工的基础上充分的利用信息,无疑会给我们的生活带来很巨…...