Redis的五种数据结构(String、Hash、List、Set、ZSet)

系列文章目录

第一节 Redis的安装



前言

在这一小节中,小编整理的是redis的五种数据结构,包含String、Hash、List、Set、ZSet,分别记录他们的一些常见命令和用法。


一、Redis是单线程吗?

首先redis不是严格意义上的单线程,它的单线程主要指的是redis的网络IO和键值对读写是由一个线程来完成的,也就是通俗来讲指的是执行客户端命令的那部分是由单线程来操作的,例如持久化操作(bgsave),集群数据同步等操作是由其它线程进行执行。

二、Redis单线程为什么能这么快?

主要是由于它所有的数据都是在内存中,所有的运算也就是在内存中进行运算,并且单线程的操作避免了多线程的上下文切换性能损耗,由于执行客户端命令都是单线程的,所以要小心耗时的指令(例如save,keys),需要小心使用,避免造成redis卡顿。

四、五种数据结构

在这里插入图片描述

1.String

SET  key  value 			        #存入字符串键值对
MSET  key  value [key value ...] 	#批量存储字符串键值对
SETNX  key  value 		    #存入一个不存在的字符串键值对
GET  key 			        #获取一个字符串键值
MGET  key  [key ...]	 	#批量获取字符串键值
DEL  key  [key ...] 		#删除一个键
EXPIRE  key  seconds 		#设置一个键的过期时间(秒)

INCR  key 			#将key中储存的数字值加1
DECR  key 			#将key中储存的数字值减1
INCRBY  key  increment 		#将key所储存的值加上increment
DECRBY  key  decrement 	    #将key所储存的值减去decrement

使用场景

1)单值缓存
set name zhangsang
get name

在这里插入图片描述

2)对象缓存

a.对象采用json格式进行存储

set user:1 '{"id":1,"name":"zhangsang","age":20}'
get user:1

在这里插入图片描述
b.使用批量MSET/MGET命令进行操作

mset user:1:id 1 user:1:name zhangsang user:1:age 20
mget user:1:id user:1:name user:1:age

在这里插入图片描述

3)简单的分布式锁

多个客户端锁定id为2000商品

#多条设置命令,当product:2000不存在设置成功返回1,存在设置失败返回0
setnx product:2000 true
setnx product:2000 true

#锁定成功之后,执行业务逻辑
.......
#执行完业务逻辑释放锁
del product:2000 

#为了防止程序意外终止导致死锁
setnx product:2000 true ex 10 nx

在这里插入图片描述

4)计数器
incr article:readcount:1001
get article:readcount:1001

在这里插入图片描述


2.Hash

HSET  key  field  value 			#存储一个哈希表key的键值
HSETNX  key  field  value 		    #存储一个不存在的哈希表key的键值
HMSET  key  field  value [field value ...] 	#在一个哈希表key中存储多个键值对
HGET  key  field 				    #获取哈希表key对应的field键值
HMGET  key  field  [field ...] 		#批量获取哈希表key中多个field键值
HDEL  key  field  [field ...] 		#删除哈希表key中的field键值
HLEN  key				            #返回哈希表key中field的数量
HGETALL  key				        #返回哈希表key中所有的键值

HINCRBY  key  field  increment 		#为哈希表key中field键的值加上增量increment

使用场景

1)对象缓存

用户为key
用户编号:用户属性为field

hmset user 1:name zhangsang 1:age 20
hmget user 1:name 1:age

在这里插入图片描述

2)购物车

用户id为key
商品id为field
商品数量为value

#添加商品
hset cart:1001 10001 1
#增加数量
hincrby cart:1001 10001 1
#商品总数
hlen cart:1001
#删除商品
hdel cart:1001 10001
#获取购物车所有的商品
hgetall cart:1001

在这里插入图片描述

3.List

在这里插入图片描述

LPUSH  key  value [value ...] 		#将一个或多个值value插入到key列表的表头(最左边)
RPUSH  key  value [value ...]	 	#将一个或多个值value插入到key列表的表尾(最右边)
LPOP  key			#移除并返回key列表的头元素
RPOP  key			#移除并返回key列表的尾元素
LRANGE  key  start  stop		#返回列表key中指定区间内的元素,区间以偏移量start和stop指定

BLPOP  key  [key ...]  timeout	#从key列表表头弹出一个元素,若列表中没有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待
BRPOP  key  [key ...]  timeout 	#从key列表表尾弹出一个元素,若列表中没有元素,阻塞等待					timeout秒,如果timeout=0,一直阻塞等待

使用场景

1)栈结构

后进先出(LIFO)
stack=lpush + lpop
在这里插入图片描述

2)队列结构

先进先出(FIFO)
queue=lpush + rpop
在这里插入图片描述

3)阻塞队列

blockqueue=lpush + brpop
在这里插入图片描述


4.Set

SADD  key  member  [member ...]			#往集合key中存入元素,元素存在则忽略,若key不存在则新建
SREM  key  member  [member ...]			#从集合key中删除元素
SMEMBERS  key					    #获取集合key中所有元素
SCARD  key					        #获取集合key的元素个数
SISMEMBER  key  member			    #判断member元素是否存在于集合key中
SRANDMEMBER  key  [count]			#从集合key中选出count个元素,元素不从key中删除
SPOP  key  [count]				    #从集合key中选出count个元素,元素从key中删除

SINTER  key  [key ...] 				         #交集运算
SINTERSTORE  destination  key  [key ..]		 #将交集结果存入新集合destination中
SUNION  key  [key ..] 				         #并集运算
SUNIONSTORE  destination  key  [key ...]	 #将并集结果存入新集合destination中
SDIFF  key  [key ...] 				         #差集运算
SDIFFSTORE  destination  key  [key ...]		 #将差集结果存入新集合destination中

使用场景

1)抽奖小程序
#将用户ID为1001,1002,1003加入奖池
sadd jackpot 1001 1002 1003
#查询奖池内参与抽奖的所有用户
smembers jackpot
#抽取1个中奖者并不删除
srandmember jackpot 1
#抽取1个中奖者并删除
spop jackpot 1

在这里插入图片描述

2)用户点赞、收藏、标签
#给消息ID为001进行点赞
sadd like:001 1001
sadd like:001 1002
sadd like:001 1003
#取消点赞
srem like:001 1001
#检查用户是否点过赞,存在返回1,不存在返回0
sismember like:001 1001
#获取点赞的用户列表
smembers like:001
#点赞的用户个数
scard like:001

在这里插入图片描述

3)微博微信关注模型(集合操作)
#张三关注的人
zhangsangSet -> {lisi,wangwu,liubei}
#李四关注的人
lisiSet -> {zhangsang,wangwu,wangmazi,liubei,zhangfei}
#王五关注的人
wangwuSet -> {zhangsang,lisi,liubei,zhangfei}
#张三和李四共同关注的人(交集)
sinter zhangsangSet lisiSet -> {wangwu,liubei}
#张三关注的人也关注了李四(去关注的人set里面进行检查是否关注了李四)
sismember wangwuSet lisi
sismember liubeiSet lisi
#张三可能认识的人(差集),张三关注的人的集合与张三自己关注的人的差集
sdiff lisiSet zhangsangSet -> {zhangsang,wangmazi,zhangfei}

在这里插入图片描述
在这里插入图片描述


5.ZSet(有序集合)

ZADD key score member [[score member]]	#往有序集合key中加入带分值元素
ZREM key member [member …]		        #从有序集合key中删除元素
ZSCORE key member 			            #返回有序集合key中元素member的分值
ZINCRBY key increment member		    #为有序集合key中元素member的分值加上increment 
ZCARD key				                #返回有序集合key中元素个数
ZRANGE key start stop [WITHSCORES]	    #正序获取有序集合key从start下标到stop下标的元素
ZREVRANGE key start stop [WITHSCORES]	#倒序获取有序集合key从start下标到stop下标的元素

ZUNIONSTORE destkey numkeys key [key ...] 	#并集计算
ZINTERSTORE destkey numkeys key [key …]	    #交集计算

使用场景

1)新闻排行榜单

6月20日上海再封1个月?官方辟谣新

#添加新闻元素
zadd hotNews:20220605 100 神舟十四号载人飞船发射成功
zadd hotNews:20220605 90 6月20日上海再封1个月?官方辟谣新
#点击新闻分值加1
zincrby hotNews:20220605 1 神舟十四号载人飞船发射成功
#展示当日排行前10的新闻(WITHSCORES会返回分值)
zrevrange hotNews:20220605 0 9 WITHSCORES
#7日搜索榜单计算
zunionstore hostNews:20220530-20220605 7 hotNews:20220530 hotNews:20220531 ... hotNews:20220605
#展示7日排行前10
zrevrange hostNews:20220530-20220605 0 9 WITHSCORES

在这里插入图片描述


总结

以上就是小编整理的Redis五种数据结构的一些基础命令以及简单的使用场景,后面一节将整理一下redis的持久化知识,包含RDB快照、AOF、混合持久化三种方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值