Redis核心数据结构

本文介绍了Redis中的五种基础数据结构:String用于缓存和计数器,Hash适用于存储对象信息,List常用于消息流展示和消息队列,Set适用于存放唯一数据,如点赞功能,ZSet则提供有序集合功能,适用于排行榜等场景。此外,还展示了各种数据结构的基本操作和应用场景。
摘要由CSDN通过智能技术生成

一,5种基础数据结构

1,String(字符串)

介绍

像java中HashMap一样使用,设置key - value,通过key获取value。

常用用命令

命令介绍
set  key  value设置指定key值
setnx  key  valuekey不存在时才成功设置key值
mset  key1  value1  key2  vaule2批量设置key值
get  key获取key值
mget  key1  key2批量获取key值
incr  keykey值增加1
incrby  key  incrementkey值增加 increment
decr  keykey值减1
decrby  key  incrementkey值减  increment
del  key删除key
expire  key  seconds 为key设置过期时间
exists  key判断key是否存在

基本操作


// 测试  set  setnx  mset
127.0.0.1:6379> set zs 10
OK
127.0.0.1:6379> get zs
"10"
127.0.0.1:6379> mset li 20 ww 30
OK
127.0.0.1:6379> mget li ww
1) "20"
2) "30"
127.0.0.1:6379> setnx zs 10
(integer) 0
127.0.0.1:6379> setnx zl 10
(integer) 1


// 测试 incr  decr incrby  decrby
127.0.0.1:6379> get zs
"10"
127.0.0.1:6379> incr zs
(integer) 11
127.0.0.1:6379> decr zs
(integer) 10
127.0.0.1:6379> incrby zs 10
(integer) 20
127.0.0.1:6379> decrby zs 20
(integer) 0

// 测试  del  expire
127.0.0.1:6379> get ls
"20"
127.0.0.1:6379> del ls
(integer) 1
127.0.0.1:6379> get ls
(nil)
127.0.0.1:6379> set ls 10
OK
127.0.0.1:6379> expire ls 30
(integer) 1
127.0.0.1:6379> get ls
"10"
127.0.0.1:6379> get ls   // 30s后
(nil)

应用场景

缓存:如缓存session,token,查询信息等。

计数器:如文章阅读量, incr  bookId:id

分布式锁: 可以通过 setnx key 的返回结果,判断是否获得锁成功。

2,Hash(哈希)

介绍

Hash相对于String类型,但是value也是以key-value形式存储。即  key  field  value。

 可以理解为通过key找到指定的hashmap,在通过field找到hashmap中的key。

常用用命令

命令介绍
hset  key  field  value设置指定哈希表中指定字段的值
hsetnx   key  field  value只有指定字段不存在时设置指定字段的值
hmset   key  field1  value1  field2  value2同时将一个或多个 field-value (域-值)对设置到指定哈希表中
hget  key  field获取指定哈希表中指定字段的值
hmget  key  field1  field2..获取指定哈希表中一个或者多个指定字段的值
hgetall  key获取指h定哈希表中所有的键值对
hexists   key  field查看指定哈希表中指定的字段是否存在
hdel  key  field删除一个或多个哈希表字段
hlen  key  获取指定哈希表中字段的数量
hincrby  key  field  increment指定哈希表中指定字段加 increment

基本操作

// 测试  hset  hsetnx  hmset  hget  hmget 
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> hset user name zs
(integer) 1
127.0.0.1:6379> hsetnx user name zs
(integer) 0
127.0.0.1:6379> hmset user age 3 address shanghai
OK
127.0.0.1:6379> hget user name
"zs"
127.0.0.1:6379> hmget user name age address
1) "zs"
2) "3"
3) "shanghai"

// 测试 hgetall
127.0.0.1:6379> hgetall user
1) "name"
2) "zs"
3) "age"
4) "3"
5) "address"
6) "shanghai"

// 测试 hexists  hlen  hincrby  注意:hincr 这个命令是没有的
127.0.0.1:6379> hexists user name
(integer) 1
127.0.0.1:6379> hlen user
(integer) 3
127.0.0.1:6379> hincrby user age 10
(integer) 13

应用场景

对象数据存储:用户信息,商品信息,购物车信息

3,List(队列)

介绍

List 就是一个双端队列,队列两边都可以进行放和取。

常用用命令

命令介绍
lpush  key  value1  value2在指定列表的尾部(左边)添加一个或多个元素
rpush  key  value1  value2在指定列表的尾部(右边)添加一个或多个元素
lset  key  index  value将指定列表索引 index 位置的值设置为 value
lpop  key移除并获取指定列表的第一个元素(最左边)
rpop  key 移除并获取指定列表的第一个元素(最右边)
llen  key获取列表元素数量
lrange  key  start  end获取列表 start 和 end 之间 的元素
blpop  key  timeout

从key列表左边弹出一个元素,若列表中没有元素,

阻塞等待timeout秒,如果timeout=0,一直阻塞等待

基础操作

// 测试 lpush  rpush  lrange
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> lpush user zs li ww 
(integer) 3
127.0.0.1:6379> lrange user 0 4
1) "ww"
2) "li"
3) "zs"
127.0.0.1:6379> rpush user zl
(integer) 4
127.0.0.1:6379> lrange user 0 4
1) "ww"
2) "li"
3) "zs"
4) "zl"

// 测试 lpop  rpop
127.0.0.1:6379> lpop user
"ww"
127.0.0.1:6379> rpop user
"zl"

应用场景

消息流展示:如最新消息,最新动态。

例如:发布消息就往队列放数据,Lpush,而拉消息就从同一侧取数据,LPop,这样拉出来的就是最新消息列表。

消息队列:只能做简单的消息队列,有很多缺陷。

例如发布订阅,我们订阅了一个公众号或微博,有两种实现方式,一种是发布者有消息推送就放在推送队列中,而所有订阅者记住这个队列,每次从里面取。另外一种是,发布者记住每个订阅者的队列,每次发消息都将消息放入所有队列中,订阅者可以直接从里面取。这两种方式,可以根据不同场景去使用。

4,Set(集合)

介绍

类型java中HashSet集合,将所有数据都放到里面。

常用用命令

命令介绍
sadd  key  value向指定集合添加一个或多个元素
srem  key  value删除指定元素
smembers  key查询集合所有元素
sismember  key  value判断所有元素是否存在
scard  key集合元素数量
srandmember  key  count集合中随机抽取count个元素,且元素还在集合
spop  key  count集合中随机抽取count个元素,且集合移除选中元素
sinter  key1  key2交集运算
sinterstore  key  key1  key2交集运算后放到key集合中
sunion  key1  key2并集运算
sunionstore  key  key1  key2并集运算后放到key集合中
sdiff  key1  key2差集运算
sdiffstore  key  key1  key2差集运算后放到key集合中

基础操作

// 测试 sadd  smembers  srem  scrad
keys *
(empty list or set)
127.0.0.1:6379> sadd list1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> smembers list1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> srem list1 1 2
(integer) 2
127.0.0.1:6379> smembers list1
1) "3"
2) "4"
3) "5"
127.0.0.1:6379> sismember list1 4
(integer) 1
127.0.0.1:6379> scard list1
(integer) 3

// 测试  srandmember  
127.0.0.1:6379> srandmember list1 2
1) "4"
2) "3"
127.0.0.1:6379> srandmember list1 2
1) "3"
2) "5"
127.0.0.1:6379> spop list1 1
1) "5"
127.0.0.1:6379> scard list1
(integer) 2
127.0.0.1:6379> smembers list1
1) "3"
2) "4"

应用场景

存放的数据不能重复的场景

如文章点赞,动态点赞

(1)点赞

sadd  like:{文章id}  {用户id}

 (2)取消点赞

srem  like:{文章id}  {用户id}

(3)点赞总数

scard  like:{文章id}

(4)用户是否点赞

sismember  like:{文章id}  {用户id}

(5)点赞用户列表

smembers  like:{文章id}

集合交,并,差使用的场景

如关注的人,共同好友等。

(1)共同好友

你的好友:sadd zs  {uId1}  {uId2} ...

你朋友的好友:sadd ls  {uId1}  {uId2} ...

共同好友:两个集合做交集    sinter   zs  ls

(2)关注的人

所有关注 JavaGuide 的用户: sadd  jg   {uId1}  {uId2} ...

你的所有朋友:sadd  zs   {uId1}  {uId2} ...

多少个朋友关注:即两个集合做交集    sinter   jg  zs    

随机抽取的场景

(1)将所有参与抽奖的用户都放入到集合中

SADD key {userlD}

(2)随机抽取

 SRANDMEMBER key [count]    或者    SPOP key [count]

5,ZSet(有序集合)

介绍

类似set,但是多了一个score字段,是得 zset 集合是有序的。

常用用命令

命令介绍
zadd  key  score  member  往有序集合key中加入带分值元素
zrem key  member从有序集合key中删除元素
zscore key  member 返回有序集合key中元素member的分值
zincrby  key increment member为有序集合key中元素member的分值加上increment 
zcrad  key返回有序集合key中元素个数
zrange  key  start  stop正序获取有序集合key从start下标到stop下标的元素
zreverange  key  start  stop  倒序获取有序集合key从start下标到stop下标的元素
zrevrank  key  member获取指定有序集合中指定元素的排名(score 从大到小排序)
zinterstore  destination  numkeys  key1  key2

将给定所有有序集合的交集存储在 destination 中,对相同元素

对应的 score 值进行 SUM 聚合操作,numkeys 为集

合数量

zunionstore  destination  numkeys  key1  key2求并集,其它和 zinterstore类似
zdiffstore  destination  numkeys  key1  key2求差集,其它和 zinterstore类似

基本操作

// 测试 zadd  zrange  zrevrange  
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> zadd student 10 zs 20 li 15 ww 60 zl
(integer) 4
127.0.0.1:6379> zrange sutdent 0 10
(empty list or set)
127.0.0.1:6379> zrange student 0 10
1) "zs"
2) "ww"
3) "li"
4) "zl"
127.0.0.1:6379> zrevrange student 0 10
1) "zl"
2) "li"
3) "ww"
4) "zs"

// 测试 zrem  zscore  zcard
127.0.0.1:6379> zrem student zs
(integer) 1
127.0.0.1:6379> zscore student ww
"15"
127.0.0.1:6379> zcard student
(integer) 3
127.0.0.1:6379> 

// 测试交集
127.0.0.1:6379> zrange stu1 0 10
1) "zs"
2) "li"
3) "zl"
127.0.0.1:6379> zrange stu2 0 10
1) "ww"
2) "zl"
127.0.0.1:6379> zinterstore st 2 stu1 stu2
(integer) 1
127.0.0.1:6379> zrange st 0 10
1) "zl"
127.0.0.1:6379> zscore st zl
"60"

应用场景

微博热搜排行榜

(1)点击新闻

zincrby  hotNews:20190819  1  守护香港

(2)当日排行前十

zrevrange  hotNews:20190819  0 9  withscores

(3)展示7日排行前十

统计7日榜单

zunionstore  hotNews:20190813-20190819  7  hotNews:20180813  ......

 展示7日排行前十

zrevrange  hotNews:20190813-20190819  0 9  withscores

二,3种特殊数据结构

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

隔山看水

你的鼓励与打赏是我创作的最大动

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值