共计 3155 个字符,预计需要花费 8 分钟才能阅读完成。
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 的模式来保留:
然而这样做之后咱们发现,可能咱们只须要用到用户的一个或者两个字段的数据,然而这样却每次都要对用户的所有信息进行序列 / 反序列化,减少了服务器的开销,有没有一个方法咱们可能能够准确取出某一个咱们须要的属性呢?这个时候就能够用 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)依据商品销售对商品进行排序显示
因为自带排序功能,所以对于排名显示,这个类型十分好用。
6. 总结
类型 | 介绍 | 应用场景 |
---|---|---|
String | 根底和罕用类型 | 能够存储任何数据 |
Hash | 键值对汇合 | 能够对某个对象的一个属性进行操作 |
List | 双向链表 | 能够存储分页数据 |
Set | 不反复的元素汇合 | 能够存储不反复的元素,能够取交并差汇合 |
Sorted Set | 不反复的可排序元素汇合 | 能够存储不反复的元素,且对齐进行有序的排序 |