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的形式来保存:
文章图片
但是这样做之后我们发现,可能我们只需要用到用户的一个或者两个字段的数据,但是这样却每次都要对用户的所有信息进行序列/反序列化,增加了服务器的开销,有没有一个办法我们能够可以精确取出某一个我们需要的属性呢?这个时候就可以用hash:
文章图片
这样我们就可以精确获得用户信息的字段值了。
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)微信公众号订阅的消息
文章图片
只要我关注的作者发布了新文章,就会广播到我的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)微信朋友圈点赞
众所周知,微信朋友圈点赞只会出现共同的好友,所以此时就可以用取交集的方法来获取共同点赞的朋友。
文章图片
3)QQ可能认识的人
可以用集合的差集运算,来推荐。
文章图片
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 | 不重复的可排序元素集合 | 可以存储不重复的元素,且对齐进行有序的排序 |
推荐阅读
- Redis|redis原理之布隆过滤器(Bloom Filter)
- redis安装与基本使用
- java|图解四种 IO 模型
- Redis|Redis性能解析--Redis为什么那么快()
- java|你跳一次涨多少(今天见识到跳槽天花板!!)
- java|送你一份大厂都这么解决Redis缓存问题,面试官必问!
- (免费领取红包封面)【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知
- redis优化(bigkey、hotkey)
- redis高可用(主从、哨兵、集群)
- 【Redis 系列】redis 学习四,set 集合,hash 哈希,zset 有序集合初步认知