Redis之Hash和List类型常用命令
-
- 一、Hash类型详解
- 二、List类型详解
-
- [1. List类型的特点](#1. List类型的特点)
- [2. 常用命令及示例](#2. 常用命令及示例)
- [3. 应用场景](#3. 应用场景)
Redis内存数据库中,除了基础的String类型外,Hash和List也是开发中频繁使用的两种数据结构,下面详细讲解Hash和List类型的特点、常用命令及典型应用场景,以便处理复杂业务需求。
一、Hash类型详解
Hash类型(哈希)是一个键值对集合,类似于Java中的HashMap
或Python中的字典。它适合存储对象类数据,能够实现对对象属性的精准操作,避免了String类型中序列化整个对象的开销。
1. Hash类型的特点
- 键值结构:每个Hash类型的键(key)下包含多个字段(field)和对应的值(value)
- 二进制安全:field和value都支持二进制数据
- 内存高效:存储对象数据比String类型更节省空间
- 操作灵活:可单独对某个字段进行CRUD,无需操作整个对象
2. 常用命令及示例
假设我们要存储用户信息,以user:100
作为Hash的键,包含id
、name
、age
、email
等字段。
(1)设置字段值
-
HSET key field value:为哈希表中的字段设置值,返回受影响的字段数量
bash127.0.0.1:6379> HSET user:100 id 100 name "张三" age 25 (integer) 3
-
HMSET key field1 value1 field2 value2 ...:同时设置多个字段值(Redis 4.0.0后推荐使用HSET替代)
bash127.0.0.1:6379> HMSET user:100 email "zhangsan@example.com" gender "男" OK
(2)获取字段值
-
HGET key field:获取哈希表中指定字段的值
bash127.0.0.1:6379> HGET user:100 name "张三"
-
HMGET key field1 field2 ...:获取多个字段的值
bash127.0.0.1:6379> HMGET user:100 id age gender 1) "100" 2) "25" 3) "男"
-
HGETALL key:获取哈希表中所有字段和值
bash127.0.0.1:6379> HGETALL user:100 1) "id" 2) "100" 3) "name" 4) "张三" 5) "age" 6) "25" ...
(3)删除字段
-
HDEL key field1 field2 ... :删除哈希表中的一个或多个字段,返回删除的字段数量
bash127.0.0.1:6379> HDEL user:100 gender (integer) 1
(4)其他常用命令
-
HEXISTS key field:判断字段是否存在,存在返回1,否则返回0
bash127.0.0.1:6379> HEXISTS user:100 email (integer) 1
-
HLEN key:获取哈希表中字段的数量
bash127.0.0.1:6379> HLEN user:100 (integer) 4
-
HKEYS key:获取哈希表中所有字段名
bash127.0.0.1:6379> HKEYS user:100 1) "id" 2) "name" 3) "age" 4) "email"
-
HVALS key:获取哈希表中所有字段值
bash127.0.0.1:6379> HVALS user:100 1) "100" 2) "张三" 3) "25" 4) "zhangsan@example.com"
-
HINCRBY key field increment:为数字类型字段增加指定增量
bash127.0.0.1:6379> HINCRBY user:100 age 1 (integer) 26
3. 应用场景
- 存储对象数据:如用户信息、商品详情、订单数据等
- 统计数据:如用户的关注数、粉丝数、文章阅读量等
- 配置信息:存储应用的各种配置项,支持单独更新某个配置
二、List类型详解
List类型(列表)是一个有序的字符串集合,类似于Java中的LinkedList
,允许元素重复,底层采用双向链表结构实现,适合做队列或栈操作。
1. List类型的特点
- 有序性:元素按照插入顺序排序
- 双向操作:可从头部和尾部插入/删除元素
- 灵活的范围操作:支持获取指定索引范围的元素
- 内存高效:链表结构对元素的增删操作效率高
2. 常用命令及示例
以存储文章评论列表为例,使用article:100:comments
作为List的键。
(1)添加元素
-
LPUSH key value1 value2 ...:从列表头部插入一个或多个元素,返回插入后列表的长度
bash127.0.0.1:6379> LPUSH article:100:comments "这篇文章很有用" "学习了" (integer) 2
-
RPUSH key value1 value2 ...:从列表尾部插入一个或多个元素
bash127.0.0.1:6379> RPUSH article:100:comments "感谢分享" (integer) 3
(2)获取元素
-
LPOP key:移除并返回列表的第一个元素
bash127.0.0.1:6379> LPOP article:100:comments "学习了"
-
RPOP key:移除并返回列表的最后一个元素
bash127.0.0.1:6379> RPOP article:100:comments "感谢分享"
-
LRANGE key start stop:获取列表中指定范围的元素(0表示第一个元素,-1表示最后一个元素)
bash127.0.0.1:6379> LPUSH article:100:comments "评论1" "评论2" "评论3" (integer) 4 127.0.0.1:6379> LRANGE article:100:comments 0 -1 1) "评论3" 2) "评论2" 3) "评论1" 4) "这篇文章很有用"
-
LINDEX key index:获取列表中指定索引的元素
bash127.0.0.1:6379> LINDEX article:100:comments 1 "评论2"
(3)列表长度与修剪
-
LLEN key:获取列表的长度
bash127.0.0.1:6379> LLEN article:100:comments (integer) 4
-
LTRIM key start stop:保留列表中指定范围的元素,删除其他元素
bash127.0.0.1:6379> LTRIM article:100:comments 0 1 OK 127.0.0.1:6379> LRANGE article:100:comments 0 -1 1) "评论3" 2) "评论2"
(4)其他常用命令
-
LREM key count value:删除列表中与value相等的元素,count指定删除数量(正数从头部开始,负数从尾部开始,0删除所有)
bash127.0.0.1:6379> LREM article:100:comments 1 "评论2" (integer) 1
-
LSET key index value:设置列表中指定索引的元素值
bash127.0.0.1:6379> LSET article:100:comments 0 "最新评论" OK
-
RPOPLPUSH source destination:移除source列表的最后一个元素,并将其添加到destination列表的头部
bash127.0.0.1:6379> RPOPLPUSH article:100:comments article:101:comments "这篇文章很有用"
3. 应用场景
- 消息队列:利用LPUSH+RPOP实现简单的FIFO(先进先出)队列
- 栈结构:使用LPUSH+LPOP或RPUSH+RPOP实现LIFO(后进先出)栈
- 最新列表:如最新文章、最新评论,使用LPUSH添加,LRANGE获取前N条
- 排行榜:结合LTRIM可实现固定长度的排行榜
- 任务队列:通过RPOPLPUSH实现安全的任务处理(避免任务丢失)
总结
- Hash类型适合存储对象类数据,支持对单个字段的精准操作,是存储用户信息、商品详情等数据的理想选择
- List类型基于有序链表实现,适合构建队列、栈、最新列表等场景,支持灵活的首尾操作和范围查询
若这篇内容帮到你,动动手指支持下!关注不迷路,干货持续输出!
ヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノヾ(´∀ ˋ)ノ