Redis 5种数据结构及对应使用场景

2021/6/21 Redis

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。

# Redis基础数据结构

# 一、String(字符串)

在任何一种编程语言里,字符串String都是最基础的数据结构

  1. 应用场景:

存储key-value键值对,这个比较简单不细说了

  1. 字符串(String)常用的命令:
set   [key]  [value]   给指定key设置值(set 可覆盖老的值)
get  [key]   获取指定key 的值
del  [key]   删除指定key
exists  [key]  判断是否存在指定key
mset  [key1]  [value1]  [key2]  [value2] ...... 批量存键值对
mget  [key1]  [key2] ......   批量取key
expire [key]  [time]    给指定key 设置过期时间  单位秒
setex    [key]  [time]  [value]  等价于 set + expire 命令组合
setnx  [key]  [value]   如果key不存在则set 创建,否则返回0
incr   [key]           如果value为整数 可用 incr命令每次自增1
incrby  [key] [number]  使用incrby命令对整数值 进行增加 number
1
2
3
4
5
6
7
8
9
10
11

# 二、list(列表)

  1. 应用场景:

由于list它是一个按照插入顺序排序的列表,所以应用场景相对还较多的,例如:

  • 消息队列:lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能
  • 朋友圈的点赞列表、评论列表、排行榜:lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表。
  1. list操作的常用命名:
rpush  [key] [value1] [value2] ......    链表右侧插入
rpop    [key]  移除右侧列表头元素,并返回该元素
lpop   [key]    移除左侧列表头元素,并返回该元素
llen  [key]     返回该列表的元素个数
lrem [key] [count] [value]  删除列表中与value相等的元素,count是删除的个数。 count>0 表示从左侧开始查找,删除count个元素,count<0 表示从右侧开始查找,删除count个相同元素,count=0 表示删除全部相同的元素
(PS:   index 代表元素下标,index 可以为负数, index= 表示倒数第一个元素,同理 index=-2 表示倒数第二 个元素。)
lindex [key] [index]  获取list指定下标的元素 (需要遍历,时间复杂度为O(n))
lrange [key]  [start_index] [end_index]   获取list 区间内的所有元素 (时间复杂度为 O(n))
ltrim  [key]  [start_index] [end_index]   保留区间内的元素,其他元素删除(时间复杂度为 O(n))
1
2
3
4
5
6
7
8
9

# 三、hash (字典)

1、应用场景:

  • 购物车:hset [key] [field] [value] 命令, 可以实现以用户Id,商品Id为field,商品数量为value,恰好构成了购物车的3个要素。
  • 存储对象:hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。 2、hash常用的操作命令:
hset  [key]  [field] [value]    新建字段信息
hget  [key]  [field]    获取字段信息
hdel [key] [field]  删除字段
hlen  [key]   保存的字段个数
hgetall  [key]  获取指定key 字典里的所有字段和值 (字段信息过多,会导致慢查询 慎用:亲身经历 曾经用过这个这个指令导致线上服务故障)
hmset  [key]  [field1] [value1] [field2] [value2] ......   批量创建
hincr  [key] [field]   对字段值自增
hincrby [key] [field] [number] 对字段值增加number
1
2
3
4
5
6
7
8

# 四、set(集合)

  1. 应用场景:
  • 好友、关注、粉丝、感兴趣的人集合:
    • sinter命令可以获得A和B两个用户的共同好友;
    • sismember命令可以判断A是否是B的好友;
    • scard命令可以获取好友数量;
    • 关注时,smove命令可以将B从A的粉丝集合转移到A的好友集合
  • 首页展示随机:美团首页有很多推荐商家,但是并不能全部展示,set类型适合存放所有需要展示的内容,而srandmember命令则可以从中随机获取几个。
  • 存储某活动中中奖的用户ID ,因为有去重功能,可以保证同一个用户不会中奖两次。
  1. set的常用命令:
sadd  [key]  [value]  向指定key的set中添加元素
smembers [key]    获取指定key 集合中的所有元素
sismember [key] [value]   判断集合中是否存在某个value
scard [key]    获取集合的长度
spop  [key]   弹出一个元素
srem [key] [value]  删除指定元素
1
2
3
4
5
6

# 五、zset(有序集合)

  1. 应用场景:
  • zset 可以用做排行榜,但是和list不同的是zset它能够实现动态的排序,例如: 可以用来存储粉丝列表,value 值是粉丝的用户 ID,score 是关注时间,我们可以对粉丝列表按关注时间进行排序。
  • zset 还可以用来存储学生的成绩, value 值是学生的 ID, score 是他的考试成绩。 我们对成绩按分数进行排序就可以得到他的名次。
  1. zset有序集合的常用操作命令:
zadd [key] [score] [value] 向指定key的集合中增加元素
zrange [key] [start_index] [end_index] 获取下标范围内的元素列表,按score 排序输出
zrevrange [key] [start_index] [end_index]  获取范围内的元素列表 ,按score排序 逆序输出
zcard [key]  获取集合列表的元素个数
zrank [key] [value]  获取元素再集合中的排名
zrangebyscore [key] [score1] [score2]  输出score范围内的元素列表
zrem [key] [value]  删除元素
zscore [key] [value] 获取元素的score
1
2
3
4
5
6
7
8