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<String,Map<Object,Object>>来形容。就是一个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的形式来保存:
image.png
但是这样做之后我们发现,可能我们只需要用到用户的一个或者两个字段的数据,但是这样却每次都要对用户的所有信息进行序列/反序列化,增加了服务器的开销,有没有一个办法我们能够可以精确取出某一个我们需要的属性呢?这个时候就可以用hash:

image.png
这样我们就可以精确获得用户信息的字段值了。

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)微信公众号订阅的消息
image.png
只要我关注的作者发布了新文章,就会广播到我的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)微信朋友圈点赞
众所周知,微信朋友圈点赞只会出现共同的好友,所以此时就可以用取交集的方法来获取共同点赞的朋友。
image.png

3)QQ可能认识的人
可以用集合的差集运算,来推荐。
image.png

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)根据商品销售对商品进行排序显示
因为自带排序功能,所以对于排名显示,这个类型非常好用。

6.总结

类型介绍使用场景
String基础和常用类型可以存储任何数据
Hash键值对集合可以对某个对象的一个属性进行操作
List双向链表可以存储分页数据
Set不重复的元素集合可以存储不重复的元素,可以取交并差集合
Sorted Set不重复的可排序元素集合可以存储不重复的元素,且对齐进行有序的排序

苏凌峰
73 声望38 粉丝

你的迷惑在于想得太多而书读的太少。