深入理解redis——五种经典数据类型介绍及运用

1.String类型及其应用
2.hash类型及其应用
3.list类型及其应用
4.set类型及其应用
5.Zset类型及其应用
6.总结
1.String类型及其应用
String类型是我们最常用的类型,有些人甚至只会用这一种类型。

//最常用的api //单个值操作 set key value get key //同时设置/获取多个键值 MSET key value [key value ....] MGET key [key ....] //数值增减 //递增数字 INCR key //增加指定的数字 INCRBY key increment //递减数字 DECR key //减少指定的整数 DECRBY key decrement //获取字符串长度 STRLEN key //分布式锁 set key value [EX seconds] [PX milliseconds] [NX|XX]

使用场景:
1)保存一般的json对象,可以用这个类型(比如从表里查出来的User信息)。
2)比如保存浏览量,点赞数等等,可以使用自增的功能(不用考虑线程安全性)。
3)分布式锁,就是一个有时间限制的key和value值,可以保证程序执行的串行化,是一种跨JVM的锁,后续会有文章进行系统介绍。
4)token等信息。
2.hash类型及其应用
hash类型转化成我们的JAVA数据结构,可以用Map>来形容。就是一个key,它的value是由多个key和value组成
//最常用的api
//一次设置一个字段值 HSET key field value //一次获取一个字段值 HGET key field //一次设置多个字段值 HMSET key field value [field value ...] //一次获取多个字段值 HMGET key field [field ....] //获取字段所有值 hgetall key //获取某个key内的全部数量 hlen //删除 hdel

假设我们现在要保存一个用户信息,最初我们可以用json的形式来保存:
深入理解redis——五种经典数据类型介绍及运用
文章图片

但是这样做之后我们发现,可能我们只需要用到用户的一个或者两个字段的数据,但是这样却每次都要对用户的所有信息进行序列/反序列化,增加了服务器的开销,有没有一个办法我们能够可以精确取出某一个我们需要的属性呢?这个时候就可以用hash:
深入理解redis——五种经典数据类型介绍及运用
文章图片

这样我们就可以精确获得用户信息的字段值了。
3.list类型及其应用
list在java中我们一定常用,但是在redis中,list是一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等。
常用api:
//向列表左边添加元素 LPUSH key value [value ...] //向列表右边添加元素 RPUSH key value [value ....] //查看列表 LRANGE key start stop //获取列表中元素的个数 LLEN key

应用场景:
1)微信公众号订阅的消息
深入理解redis——五种经典数据类型介绍及运用
文章图片

只要我关注的作者发布了新文章,就会广播到我的list里面,查看的文章的时候,一次显示10条,类似于分页:
lrange likearticle:UserId 0 9
不过数据一般不会保存太远古的数据,可能就保存两千条左右,再久远的数据就要去数据库里查询。
2)商品评论列表
针对一些商品发布的评论,可以放在一个list里面,然后时间按降序排列。
lpush items:comment:1001 {"id":1001,"name":"huawei","date":1600484283054,"content":"lasjfdljsa; fdlkajsd; lfjsa; ljf; lasjf; lasjfdlsad"}

3)保存分页信息
因为lrange命令就像limit一样,所以用这个命令,可以支持分页查询,先把数据准备好放入缓存中,再进行分页。
4)各种交易记录的下拉列表(近期数据)
这个原理也和第一条一样,重点就是一般redis只保存几千条,比如近一年的信息,再往前查就要去数据库里面查了。
4.set类型及其应用
set类型为哈希表实现,特点是元素不重复,同时对两个set也可以取交并差集合等等。
//常用api
//添加元素 SADD key member [member ...] //删除元素 SREM key member [member ...] //遍历集合中的所有元素 SMEMBERS key //判断元素是否在集合中 SISMEMBER key member //获取集合中的元素总数 SCARD key //从集合中随机弹出一个元素,元素不删除 SRANDMEMBER key [数字] //从集合中随机弹出一个元素,出一个删一个 SPOP key [数字]//集合运算 //集合的差集运算 A-B 属于A但不属于B的元素构成的集合 SDIFF key [key ...]//集合的交集运算 A∩B属于A同时也属于B的共同拥有的元素构成的集合 SINTER key [key ...] //集合的并集运算 A ∪ B 属于A或者属于B的元素合并后的集合 SUNION key [key ...]

使用场景:
1)抽奖场景
使用从集合中随机弹出元素的命令,可以用于抽奖,也可用数据库中的Order By RAND()。
2)微信朋友圈点赞
众所周知,微信朋友圈点赞只会出现共同的好友,所以此时就可以用取交集的方法来获取共同点赞的朋友。
深入理解redis——五种经典数据类型介绍及运用
文章图片

3)QQ可能认识的人
可以用集合的差集运算,来推荐。
深入理解redis——五种经典数据类型介绍及运用
文章图片

5.Zset类型及其应用
这是一个带分数的有集合,我们把zset和set对比着看,就会发现:
Zset与Set的区别在于每一个元素都有一个Score属性,并且存储时会将元素按照Score从低到高排列。这个score可以是时间等值。
//常用api
//添加元素 ZADD key score member [score member ...] //按照元素分数从小到大的顺序 //返回索引从start到stop之间的所有元素 ZRANGE key start stop [WITHSCORES] //获取元素的分数 ZSCORE key member //删除元素 ZREM key member [member ...] //获取指定分数范围的元素 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count] //增加某个元素的分数 ZINCRBY key increment member // 获取集合中元素的数量 ZCARD key //获得指定分数范围内的元素个数 ZCOUNT key min max //按照排名范围删除元素 ZREMRANGEBYRANK key start stop //获取元素的排名 从小到大 ZRANK key member //获取元素的排名 从大到小 ZREVRANK key member

使用场景:
1)商品评论列表。
我们在前面使用了list作为商品评论列表,其实在数据量比较大的情况下,会有bug,如果数据增加地够快:
当你翻第一页的时候,数据是第一页(正常)
当你翻第二页的时候,第一页的内容已经被顶到了第二页,数据就还是第一页(异常)
但是当我们使用zset,因为zset有个score字段,我们把这个字段设置为数据的创建时间,可以根据上次查出来的列表的最后一条时间,来进行搜索,这样,之前数据重复的问题就不会产生了。
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
2)根据商品销售对商品进行排序显示
因为自带排序功能,所以对于排名显示,这个类型非常好用。
【深入理解redis——五种经典数据类型介绍及运用】 6.总结
类型 介绍 使用场景
String 基础和常用类型 可以存储任何数据
Hash 键值对集合 可以对某个对象的一个属性进行操作
List 双向链表 可以存储分页数据
Set 不重复的元素集合 可以存储不重复的元素,可以取交并差集合
Sorted Set 不重复的可排序元素集合 可以存储不重复的元素,且对齐进行有序的排序

    推荐阅读