系列文章目录
文章目录
前言
在这一小节中,小编整理的是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、混合持久化三种方式。