目录
Redis支持String,List,Hash,Set,Zset等数据类型操作
一、包含String、Set数据类型的基本命令
Redis 中的字符串(String)数据结构是最基础也是最简单的数据类型。每个字符串在 Redis 中可以存储的数据最大可以达到 512 MB。字符串类型是通用的,可用于各种不同的场景:
缓存数据: 字符串是实现缓存机制的理想选择。可以缓存例如网页、图片、视频、JSON 对象以及普通的文本数据等。这可以大幅减少对后端数据库的请求次数,提高应用的响应速度。
计数器: Redis 字符串可以用作计数器,使用
INCR
和DECR
命令可以非常方便地对值进行递增或递减操作。这适用于跟踪网站的访问次数、下载计数或任何其他需要计数的场景。共享会话状态: 在分布式系统中,Redis 可以用来存储和共享用户会话信息。由于其读写速度快,适合作为存储会话状态的解决方案,尤其是在多个应用服务器之间共享会话信息时。
分布式锁: Redis 字符串可以用来实现分布式锁的机制。通过设置一个键的值来表示锁的状态,使用命令如
SETNX
(Set If Not Exists)来安全地创建锁,使用EXPIRE
设置锁的过期时间来避免死锁。实现队列和堆栈的简单形式: 虽然 Redis 提供了更专门的列表类型来处理队列和堆栈,但通过一些创造性的方法,也可以使用字符串来模拟队列和堆栈的功能。例如,可以将多个值串联成一个字符串,然后再适当地添加或删除数据。
存储复杂的聚合数据: 例如,一个大的JSON对象可以被序列化为字符串并存储在单个键中。这可以用于临时存储复杂数据的快照,便于快速读取和恢复状态。
Redis 中的集合(Set)是字符串的无序集合,且集合中的每个元素都是唯一的,不允许重复。Set 数据结构在Redis中提供了一组丰富的操作命令,使得它非常适合用于以下几种场景:
去重: Sets 是天然的去重工具,因为它们只允许存储唯一元素。这使得它们非常适用于需要记录唯一项的场景,如统计网站访问者的IP地址、记录在线用户的ID等。
标签和分类: 利用集合,可以有效地对对象进行分类或打标签。例如,可以创建多个集合来存储不同类别或标签的新闻文章、产品或其他对象。
社交网络: 在社交网络中,集合可用于表示用户的关系,如朋友列表。由于提供了直接的集合操作命令,Redis 非常适合快速查询两个用户是否为朋友,或列出共同的朋友。
实现简单的发布/订阅模型: 集合可以用来管理订阅者列表,每个集合代表一个主题,集合中的元素代表订阅该主题的用户。这样,发布消息时,可以迅速找到需要接收消息的用户列表。
轻量级的实时分析: 集合可以用来进行一些简单的实时分析,如记录独立访问的用户数,或者计算一定时间内访问特定页面的用户数量等。
1、添加一个键值对
set add CeShi
2、获取key所关联的字符串值
get add
3、同时设置多个key-value
mset userName ZhangSan age 22 address HeNanZhengZhou
4、获取多个key对应的值
mget userName age address
运行结果
5、将给定的value追加到原值的末尾
append add ".com"
追加后效果
6、删除单个key
del SSSS
7、同时删除多个key
del 18 myjob
8、查询包含某个字符的key
keys *u*
运行结果
9、查询数据库中所有key
keys *
10、查询以某个字符开头的key
keys a??
运行结果
11、查询以某两个字符开头的key
keys a[d]*
运行结果
12、设置生存时间(默认以秒为单位)
如果想以毫秒为单位,在命令前加字母p
EXPIRE age 50
生存时间到期后效果
13、查看剩余生存时间
如果想以毫秒为单位,在命令前加字母p
ttl CeShi2
14、取消剩余生存时间
PERSIST CeShi2
15、将当前数据库的key移动到另一数据库
#将当前数据库中的CeShi4键值对移动到6号数据库
move CeShi4 6
16、切换数据库
#切换到0号数据库
select 0
17、重命名
#将userName重命名为name
rename userName name
二、List相关命令
Redis中的列表(List)数据结构是一个双向链表,可以在两端进行快速的插入和删除操作。这种数据结构的特性使其非常适用于以下几种场景:
实现队列和堆栈:
- 队列:Redis 列表可以作为队列使用,支持先进先出(FIFO)的数据处理模式。可以使用
LPUSH
命令向列表头部插入数据,使用RPOP
命令从列表尾部移除数据。- 堆栈:同时,Redis 列表也可以作为堆栈使用,支持后进先出(LIFO)的数据处理模式。可以使用
LPUSH
向列表头部插入数据,然后用LPOP
从头部移除数据。消息队列: Redis 列表适合作为消息队列使用,可以实现应用程序之间的消息传递。生产者可以将消息推送到列表中,而消费者则从列表中读取并处理这些消息。Redis 还支持阻塞读取操作(如
BLPOP
和BRPOP
),这使得消费者可以在没有新消息时等待,直到有消息到来。发布/订阅模型的消息缓冲: 在使用 Redis 的发布/订阅模式进行消息传递时,列表可以作为消息缓冲区来使用,确保即使在订阅者暂时不可用的情况下也不会丢失消息。
最近使用的项目列表(LRU Cache): 列表还可以用来实现简单的最近最少使用(LRU)缓存。通过限制列表的大小并在每次访问后将元素移动到列表的开始位置,可以确保列表只保留最常访问的元素。
时间线或活动日志: 列表结构适合存储按时间排序的事件,如用户的活动日志或时间线。可以轻松地将新事件推送到列表的前端,并通过
LRANGE
命令来获取最近的事件记录。数据流处理: 列表可以用于数据流的缓存,比如实时数据处理和批量处理。数据可以实时推入Redis列表,之后按需进行批量处理。
1、将一个或多个值插入到列表头部
lpush userName Zhangsan Lisi Wangwu Zhaoliu
运行效果
2、将一个或多个值插入到列表
lpush userName ZhangYang WangSan
插入后效果
3、移除并返回列表头部的元素
lpop userName
运行效果
成功返回ZhaoSi并移除
4、移除并返回列表尾部的元素
rpop userName
5、获取列表指定范围内的元素
#获取名为 userName 的列表从第 0 个到第 6 个元素
lrange userName 0 6
6、通过索引获取列表中的元素
#获取索引位置为5的元素(索引从第一个元素开始,0、1、2、3省略号)
lindex userName 5
7、获取列表长度
llen userName
8、通过索引设置列表元素的值
#将名为 userName 的列表中索引为 0 的元素设置为 CeShi
lset userName 0 CeShi
9、对一个列表进行修剪(trim)
让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
#只保留名为 userName 的列表中索引从 3 到 6 的元素
ltrim userName 3 6
10、查看List集合中的所有元素
lrange userName 0 -1
命令解释
LRANGE
是一个非常有用的命令,用于获取列表的子范围。- 第一个参数是列表的名称。
- 第二个参数
0
表示列表的起始位置。- 第三个参数
-1
表示列表的结束位置,其中-1
是一个特殊值,代表列表的最后一个元素。
三、Hash相关命令
Redis 中的散列(Hash)数据结构非常适合用来存储和管理对象或实体的多个字段和值。这使得散列在处理一些具体的应用场景时表现得非常高效和便捷。以下是一些适用于使用 Redis Hash 数据结构的场景:
存储对象数据: 散列非常适合存储对象或记录的属性,例如用户的个人资料、商品的详细信息等。例如,一个用户对象可能包括用户名、电子邮件、密码、注册日期等字段,这些可以作为键值对存入单个散列中。
缓存应用数据: 在Web应用中,常常需要缓存用户会话信息或其他频繁查询的对象。使用散列,可以轻松更新对象的单个字段而无需读取整个对象。
轻量级的结构存储: 相比于传统的关系数据库,Redis 的散列操作通常更快,占用的内存也更少。对于需要快速访问和更新的小型数据集,散列是一个很好的选择。
减少内存使用: 当存储相似结构的大量小对象时,使用散列比单独存储每个对象的每个字段作为独立的键会更加内存效率。Redis 对小散列进行了优化,使得它们使用更少的内存。
模拟其他结构: 散列可以用来模拟其他数据结构,如集合或列表。虽然这样做可能会失去一些特定数据结构的特性(如有序集合的自动排序),但在某些场景下可以作为一种简单的替代方案。
实时系统中的快速查找/更新: 散列允许对单个元素进行快速查找和更新,这对于实时系统来说非常重要,如在线游戏的玩家状态更新、实时交易系统中的账户信息更新等。
1、设置散列的字段的字符串值
#向名为 user:1000 的散列中添加或更新一个字段 name,值为 John
hset user:1000 name john
2、获取存储在指定键的散列中的字段的值
#获取 user:1000 散列中 name 字段的值
hget user:1000 name
运行结果
3、同时设置一个散列的多个字段
hmset user:1000 name john age 30 email ceshiceshi@qq.com
运行后效果
4、同时获取一个散列的多个字段的值
#获取name和age的值
hmget user:1000 name age
运行结果
5、获取在散列中的所有字段和值
hgetall user:1000
运行结果
6、删除一个或多个散列的字段
#删除 user:1000 散列中的 email 字段
hdel user:1000 email
7、检查散列中是否存在指定的字段
hexists user:1000 age
8、增加散列中的字段的数值(必须是整数)
#将年龄增加10
hincrby user:1000 age 10
9、获取散列中的所有字段名
hkeys user:1000
运行结果
10、获取散列中的所有值
hvals user:1000
运行结果
四、ZSET相关命令
Redis中的有序集合(Sorted Set,简称ZSet)是一种数据结构,它不仅存储成员,同时每个成员都关联一个双精度浮点数分数(score),这允许集合保持有序。这些成员是唯一的,但分数可以重复。ZSet适合用于需要按分数排序元素的场景,例如排行榜、带权重的队列等。
1、向有序集合添加一个或多个成员,或更新已存在成员的分数
#向名为 scores 的有序集合中添加成员 user1 和 user2,分数分别为 50 和 70
zadd scores 50 user1 70 user2 64 user3 27 user4
运行结果
2、按照分数从低到高的顺序返回有序集合中指定范围内的成员
#获取 scores 集合中从第一个到第四个成员(按照成绩从低到高排过之后的)
zrange scores 0 3
运行结果
3、按照分数从高到低的顺序返回有序集合中指定范围内的成员
##获取 scores 集合中从第一个到第四个成员(按照成绩从高到低排过之后的)
zrevrange scores 0 3
运行结果
4、返回有序集合中分数在指定区间内的成员
#获取 scores 集合中分数在 50 到 100 之间的所有成员
zrangebyscore scores 50 100
运行结果
5、移除有序集合中的一个或多个成员
#从 scores 集合中移除 user4
zrem scores user4
运行结果
6、增加有序集合中成员的分数
#将user2的成绩加20
zincrby scores 20 user2
运行结果
7、获取有序集合的成员数
zcard scores
运行结果
8、计算有序集合中分数在指定区间内的成员数
#统计成绩在50到100之间的人数
zcount scores 50 100
运行结果
9、获取有序集合中成员的分数
zscore scores user2
运行结果
10、获取有序集合中成员的排名
ZRANK
按分数从低到高,ZREVRANK
按分数从高到低
#获取 scores 集合中 user2 的排名(从高到低,排名需要+1)
zrevrank scores user2