Redis数据结构与常见命令

目录

[1. Redis基本概念](#1. Redis基本概念)

[1.1 Redis是什么?](#1.1 Redis是什么?)

[2 Redis常见数据结构](#2 Redis常见数据结构)

[2.1 String数据结构](#2.1 String数据结构)

[2.1.1 常见命令](#2.1.1 常见命令)

[2.1.2 适用场景](#2.1.2 适用场景)

[2.2 List数据结构](#2.2 List数据结构)

[2.2.1 常见命令](#2.2.1 常见命令)

[2.2.2 适用场景](#2.2.2 适用场景)

[2.3 Set数据结构](#2.3 Set数据结构)

[2.3.1 常见命令](#2.3.1 常见命令)

[2.3.2 适用场景](#2.3.2 适用场景)

[2.4 Zset数据结构](#2.4 Zset数据结构)

[2.4.1 常见命令](#2.4.1 常见命令)

[2.4.2 适用场景](#2.4.2 适用场景)

[2.5 Hash数据结构](#2.5 Hash数据结构)

[2.5.1 常见命令](#2.5.1 常见命令)

[2.5.2 适用场景](#2.5.2 适用场景)

负责业务中涉及redis的很少,主要是算法一些数据是灌到redis中,搜索引擎去读,这些逻辑很少会改动,测试redis的场景很少,对redis了解不是很多,将一些基础的知识进行汇总

1. Redis基本概念

1.1 Redis是什么?

Redis(Remote Dictionary Server )是一个 开源的、基于内存的键值(Key-Value)存储系统 ,由 Salvatore Sanfilippo 在 2009 年开发,使用 C 语言 编写。

它的特点是数据存储在内存中,读写速度极快,同时支持将数据持久化到磁盘。

主要特点:

  • 高性能:内存操作,速度可达每秒百万级请求。
  • 多数据结构:不仅支持字符串(String),还支持哈希(Hash)、列表(List)、集合(Set)、有序集合(Sorted Set)、位图(Bitmap)、HyperLogLog、地理位置(Geo)等。
  • 持久化:支持 RDB(快照)和 AOF(追加文件)两种持久化方式。
  • 发布/订阅:支持消息队列功能。
  • 分布式支持:可通过 Redis Cluster 实现分布式存储。

2 Redis常见数据结构

Redis的key是字符串,value值有很多类型,主要类型如下:

|--------|---------------|-----------------------|------------------------------|
| 数据结构 | 值类型 | value | 适用场景 |
| String | 字符串,整数,浮点 | hello,world | 缓存对象、常规计数、分布式锁、共享 session 信息 |
| List | 链表,链表节点是字符串 | [A B C C] | |
| Set | 包含字符串的无序无重复集合 | [A B C] | 点赞、共同关注、抽奖活动 |
| Zset | 有序的集合 | {A:1,B:2,C:3} | 排行榜、电话和姓名排序 |
| Hash | 包含键值对无序散列 | {a:"hello",b:"world"} | 缓存对象、购物车 |

2.1 String数据结构

不仅是字符串, 也可以是数字(整数或浮点数),value 最多可以容纳的数据长度是512M。

2.1.1 常见命令

|--------|-------------------------------------|----------------------|------------------------------|
| 类型 | 命令 | 含义 | 备注 |
| 基本操作 | SET key value | 设置值 | set name jelly |
| 基本操作 | GET key | 根据key获取value | get name |
| 基本操作 | DEL key | 删除某个key | del name |
| 基本操作 | EXISTS key | 判断某个key是否存在 | exists name |
| 基本操作 | STRLEN key | 返回key对应value长度 | strlen name |
| 批量操作 | MSET key1 value1 key2 value2 | 批量设置值 | |
| 批量操作 | MGET key1 key2 | 批量获取值 | |
| 计数器操作 | INCR key INCRBY key 10 | 数值value+1 数值value+10 | incr number incrby number 10 |
| 计数器操作 | DECR key DECRBY key 10 | 数值value-1 数值value-10 | decr number decrby number 10 |
| 过期时间 | EXPIRE key 60 | 设置key 60秒过期 | |
| 过期时间 | TTL key | 查看key还有多久过期 | time to live |
| 过期时间 | SET key value EX 60 SETEX key value | 设置值时增加过期时间秒 | expire |
| 过期时间 | SET key value PX 60 | 60毫秒 | precise expire |
| 不存在就插入 | SETNX key value | | |

2.1.2 适用场景

1️⃣缓存对象,set user '{"name":"xiaolin", "age":18}'

2️⃣常规计数,因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等。

3️⃣分布式锁:set命中中增加NX,表示key不存在则插入,插入成功表示加锁成功,插入失败则表示加锁失败,为了防止死锁,给锁加上过期时间,set lock lock_value NX PX

4️⃣保存session信息:分布式系统session在redis中统一存储和管理

2.2 List数据结构

简单的字符串列表,按照插入顺序排序,列表最大长度2^32-1

2.2.1 常见命令

|--------|-------------------------------------------------------------|-----------------------------------------|----|
| 类型 | 命令 | 含义 | 备注 |
| 增删 | LPUSH key value [value1...] RPUSH key value [value1...] | 插入list的最左侧 插入list的最右侧 | |
| 增删 | LPOP key RPOP key | list最左侧移除一个元素并返回该元素 list最左侧移除一个元素并返回该元素 | |
| 查询 | LRANGE key index1 index2 | 返回索引index1-index2的所有元素 | |
| 堵塞弹出元素 | BLPOP key [key1..] timeout BRPOP key [key1..] timeout | 弹出一个或者多个列表,如果没有元素则堵塞timeout秒 | |

2.2.2 适用场景

消息队列

消息有序性:生产者使用LPUSH,存储消息,消费者使用BRPOP读取消息

消息重复性:业务自行实现唯一ID存入消息中

消息可靠性:消费者消费消息时采用命令BRPUSHLPOP命令,在消费者读取消息后同时将该消息存储到另一个列表中,消费者如果消费该消息失败,则可以冲备份的列表中重新读取该消息。

缺点:消费模式不能是广播消费模式,只能是集群消费模式,因为一个消费者读取消息后,列表中就没有该消息了。

2.3 Set数据结构

set是一个无序唯一的键值集合,

2.3.1 常见命令

|---------|------------------------------|----------------------|----|
| 类型 | 命令 | 含义 | 备注 |
| 增加 | SADD key value [value1...] | 往集合中添加元素,如果key不存在则新建 | |
| 删除 | SREM key value | | |
| 查询 | SMEMBERS key | 获取key中所有元素 | |
| 判断存在 | SISMEMBER key value | 是否存在key value | |
| 数量 | SCARD key | key中元素个数 | |
| 选n个元素剔除 | SPOP key 2 | 从key对应的value中剔除2个元素 | |
| 交集 | SINTER key [key1...] | 求多个key的交集 | |
| 并集 | SUNION key [key1...] | 求多个key的并集 | |
| 差集 | SDIFF key [key1...] | 求多个key的差集 | |

2.3.2 适用场景

数据去重,保障数据唯一性

1️⃣点赞:文章acticle:1,点赞用户user:1,user:2,user:3

SADD acticle:1 user:1 user:2 user:3

文章1点赞用户:SMEMBER acticle:1

文章1点赞数量:SCARD acticle:1

2️⃣共同关注:

用户1关注了1 2 3 5 :SADD user:1 1 2 3 5

用户2关注了1 3 4 8 :SADD user:2 1 3 4 8

共同关注:SINTER user:1 user:2

给用户user:1推送用户user:2关注的信息:SDIFF user:2 user:1

3️⃣抽奖活动:已经获奖的用户从set中剔除,保障每个人只中奖一次

抽两名中奖:SPOP key 2

2.4 Zset数据结构

有序集合,相比于set多了一个排序属性分数score,value值是两个元素,一个有序元素值,一个排序值,元素值有序且唯一。

2.4.1 常见命令

|-------------|-------------------------------------------|--------------------------|----|
| 类型 | 命令 | 含义 | 备注 |
| 新增 | ZADD key score value [score1 value1...] | 有序集合中加入带分值元素 | |
| 删除 | ZREM key value [value1...] | | |
| 获取分值 | ZSCORE key value | | |
| 获取数量 | ZCARD key | | |
| 分值+n | ZINCRBY key n value | | |
| 获取正序 | ZRANGE key startIndex endIndex | 下标startIndex-endIndex的元素 | |
| 获取倒序 | ZREVRANGE key startIndex endIndex | | |
| 分数相同,按照字典正序 | ZRANGEBYLEX key min max | | |
| 分数相同,按照字典倒序 | ZREVRANGEBYLEX key min max | | |

2.4.2 适用场景

1️⃣排行榜:用户1的3个文章点赞集合

ZADD user:1 200 acticle:1 300 acticle:2 150 acticle:3

文章1新增了一个点赞:ZINCRBY user:1 1 acticle:1

查看文章1的点赞数:ZSCORE user:1 acticle:1

获取点赞最多的两篇文章:ZRANGE user:1 0 1

2️⃣电话姓名排序,分数相同,按照字典排序

2.5 Hash数据结构

hash结构数据,value=[{field1,value1},{field2,value2}],适合存储对象

2.5.1 常见命令

|------|--------------------------------------------|------------------------|----|
| 类型 | 命令 | 含义 | 备注 |
| 基本操作 | HSET key field value | 设置key field的值 | |
| 基本操作 | HGET key field | 获取key field的值 | |
| 基本操作 | HMSET key field value [field1 value1...] | 批量设置多个field值 | |
| 基本操作 | HMGET key field [field1...] | 批量获取多个field值 | |
| 基本操作 | HDEL key field [field...] | 删除一个或多个field值 | |
| | HLEN key | key中field的数量 | |
| | HGETALL key | 返回key下所有的field value键值 | |
| | HINCBY key field 10 | key field对应的value值+10 | |

2.5.2 适用场景

1️⃣缓存对象

例如数据库中数据

|----|------|-----|
| id | name | age |
| 1 | Tom | 21 |
| 2 | Lily | 25 |

缓存在redis中 HMSET id:1 name Tom age 21;HMSET id:2 name Lily age 25

例如购物车对象,用户id为key,商品id为field,数量为value

加购:HSET user:1 coffee 1;添加数量:HINCBY user:1 coffee 1

其它的类型:BitMap、HyperLogLog、GEO、Stream,详见:https://www.xiaolincoding.com/redis/data_struct/command.html#bitmap

相关推荐
小北方城市网2 小时前
Redis 分布式锁高可用实现:从原理到生产级落地
java·前端·javascript·spring boot·redis·分布式·wpf
ʚB҉L҉A҉C҉K҉.҉基҉德҉^҉大3 小时前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
哈__3 小时前
多模融合 一体替代:金仓数据库 KingbaseES 重构企业级统一数据基座
数据库·重构
老邓计算机毕设3 小时前
SSM医院病人信息管理系统e7f6b(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·医院信息化·ssm 框架·病人信息管理
2601_949613023 小时前
flutter_for_openharmony家庭药箱管理app实战+药品分类实现
大数据·数据库·flutter
beginner.zs4 小时前
注意力革命:Transformer架构深度解析与全景应用
深度学习·架构·transformer
dyyx1114 小时前
使用Scikit-learn进行机器学习模型评估
jvm·数据库·python
挺6的还4 小时前
18.缓存
redis
踢足球09294 小时前
寒假打卡:2026-01-27
数据库
不想写bug呀4 小时前
MySQL索引介绍
数据库·mysql