Redis基本数据类型应用场景及实现

本篇介绍的几种数据结构,虽然没有String使用的那么广泛,但他们有各自适用的场景。

数据结构

1、Hash

用于存储对象。

场景举例

购物车,常用操作包括: 1)往用户的购物车中添加商品 2)增加某人购物车某件商品的数量 3)删除购物车中指定商品 4)获取购物车中商品总数 5)获取购物车中所有商品

对应命令如下:

1)hset car-user1 product1 1

hset key filed value 其中key:car-user1,用来存储user1的购物车信息。

2)hincrby car-user1 product1 2
3)hdel car-user1 product

删除key中的某个filed

4)hlen car-user1
5)hgetall cart-user1

与String比较

针对需要频繁修改存储的对象的某个属性字段的场景下,用hash更方便。 举例说明,需修改用户的余额的字段。若使用string方式存储,需要先将value取出,反序列化成对象,修改,再序列化存储。但使用hash,一个命令就可以搞定了。

2、List

Redis的list结构提供了在列表头/尾插入、取出的操作,因此可以用来实现栈、队列、阻塞队列等数据结构。

其中要实现阻塞队列,需要使用lpush+brpop命令。brpop是阻塞式取出元素。

场景举例

常用操作:

1)给指定的用户发送消息 2)消息倒序排列,取最新的几条展示

对应命令如下:

1) lpush user1 a1 lpush user1 a2 lpush user1 a3
2) lrange user1 0 3

lrange key start stop 返回的结果是按插入时间倒序展示

3、Set

提供了元素的集合操作,比如交集、差集等。

场景举例

常用操作:

1)sinter myFocus mySet {‘a’}
2) sismember followerSet a 0 sismember followerSet b 1

sismember key member: 用来查询member元素是否在key集合中,若在,返回1,否则返回0。

3)sdiff hisSet mySet {‘c’,‘e’}

4、ZSet

有序集合

场景举例

微博的热搜榜单

常用操作:

1)当天最热的十条热搜 2)某条热搜的浏览量+1 3)七日搜索榜单计算 4)七日排行前十

对应命令如下: 前提假设,热搜的排行影响因素只有浏览量,浏览量越高越靠前。

1) 添加元素: zadd n:20210101 1 top1 zadd n:20210101 3 top2 zadd n:20210101 13 top3

查询前十: zrange n:20210101 0 10 withscores 按浏览量倒序排列取前十

2)zincrby n:20210101 1 top2

执行后查询:

3)新建zset集合20210102 zunionstore: 求多个有序集合的并集
4)重复步骤3操作,然后使用zrevrange查询前十即可。

5、String

最常用的一种类型,简单动态字符串。如果不考虑性能的话,可将任何类型数据序列化后存储进String中。

底层实现

Redis对外提供的这几种数据结构底层都是如何实现的呢? 由上图可以看出: Redis的基本数据类型,底层都不只有一种数据结构来实现。

以zset为例,就有压缩表和跳跃表两种方式,其中压缩表为默认实现,当数据超过一定范围后改用跳跃表。

有两种情况: 1)zset-max-ziplist-entries 元素超过多少个,会使用跳表。默认为128。 2) zset-max-ziplist-value 单个元素大小超过多少byte,会使用跳表。默认64byte。

小结

经验分享 程序员 微信小程序 职场和发展