二、redis中基础数据类型Hash、Set、SortedSet及其应用场景

导读

前面文章【一、深入理解redis之需要掌握的知识点 】中,我们对redis需要学习的内容框架进行了一个梳理。【二、redis中String和List两种数据类型和应用场景 】我们对redis中String和List两种数据类型做了一下讲解,并且对他们各自的应用场景进行了介绍。

本篇文章我们学习的是redis中剩余的三种基础数据类型Hash、Set和SortedSet,以及他们的应用场景。
如果大家在工作、学习、面试中针对redis还有什么疑问或者其他问题,可以评论区告诉我。
为了保证可以连续不间断的获取最新的技术分析及讲解,建议关注本博客。

在这里插入图片描述

Hash

Hash存储的是一组hash信息,类似java中的HashMap,可以存储Object信息。

Hash的应用场景为存储聚合信息,例如淘宝中商品的详情页的信息。

| HSET key field value 命令是往redis中存储键值对

(“Hset user:1000 username antirez”)

| HGET key field value 命令是从redis中获取存入的键值对

(“HGET user:1000 username”,返回antirez或者nil)

| HMSET key field value field… value…命令可以一次性给一个key赋值多个键值对

(“HMSET user:1000 username antirez birthyear 1977 verified 1”)

| HMGET key field…命令可以一次性获取key中的多个键对应的值

(“HMGET user:1000 username birthyear”返回“antirez 1977” )

| HGETALL key 命令可以一次性返回key中保存的所有键值对信息

(“HGETALL user:1000” 返回“ username antirez birthyear 1977 verified 1”)

| HINCRBY key field value命令可以对key中保存的某一个个指定的键值对的值进行数值加操作

(“HINCRBY user:1000 birthyear 10 ”返回 “1987” )

| HKEYS key 命令返回key中保存的所有键值对的键

(“HKEYS user:1000 ”返回“username bitthyear verified”)

| HVALS key 命令返回key中保存的所有键值对的值

(“HVALS user:1000” 返回 “antirez 1987 1”) |

Set

Set存储的是一个经过去重的无序集合。
这里面的序指的是根据特定值进行排序,而不是指像LIST一样,按照插入顺序进行排序。

| SADD key member…向redis中的SET存放多个数据;

(“SADD k1 ooxx xxoo xoxo oxox xoox oxxo
ooxx”返回“6”)通过以上命令可以发现,存入的值是7个,但是真实存入的却是6个,这个就理解到了SET的去重功能

| SMEMBERS key 命令获取redis中key对应存储的所有members;

(“SMEMBERS k1”返回“ooxx xxoo xoxo oxox xoox oxxo”)

| SET存储的数据是无序的,因此可以借用这个特性从SET中随机获取指定数量的值;这个特性对应的命令是SRANDMEMBERS key count; 在这个命令中cout的数值的大小和正负代表了不同的随机性;
cout的值是正数代表从SET中按照随机顺序取出cout个去重的数据,如果count的数值是正数且大于SET中的size也只会返回size个数据;
cout的值是负数代表从SET中按照随机顺序取出count个没有经过去重的数据,即使cout的值小于等于SET中size也会出现重复,如果count的数值是负数且大于SET中的size,那么就会返回count个没有经过去重的数据。
SRANDMEMBERS命令中count值的正负可以理解为抽奖的两种方式,一种是抽完后从池子中取出,一种是抽完后再放回池子,count的值的大小代表按照两种方式抽奖的次数。

| SPOP key 命令可以从SET集合中随机取出并删除一个元素;SPOP命令的应用场景为扑克牌系统。

SET的另一个操作为集合操作,并集、交集、差集等。

| SINTER key key…命令可以取指定多个key的交集(“SINTER k1 k2”)

| SUNION key key…命令可以取指定多个key的并集(“SUNION k1 k2”)

| SDIFF key key…命令可以取指定多个key的差集(“SDIFF k1 k2”);

这里需要注意,在差集中存在左差集和右差集的区别;

例如存入“sadd k1 a b c d”、“sadd k2 a b e f”;“SDIFF k1 k2”返回“c d”;“SDIFF k2
k1”返回“e f”;

需要注意的是集合操作是非常耗时的,容易影响reids的性能,因此要尽量把需要做集合操作的服务放到一个单独的REDIS中 |

SET中这种集合操作(并集、交集、差集)的应用场景为推荐系统,共同好友(交集)、可能认识的人(外差集)、爱好等。

SortedSet

SORTEDSET(ZSET)是一个经过去重的有序的集合。有序集合的应用场景为按照指定权重(score分值)对内容进行排序。

例如按照水果的含糖量,商品的售价,商品的销售数量,另外还有排行榜,评论的翻页等。排序分为正序和倒序。

ZADD key score member score…
member…命令可以向redis中插入指定权重(score分值)的member(“ZADD k1 2.2 apple 3.3
banana 1 orange”)

| ZRANGE k1 start stop[WITHSCORES] 命令可以取出redis中指定数量的SET集合,该集合按照存入时候的权重(score分值)进行排序;

如果start stop 为正数则按照正序取出;

如果start stop为负数,则按照反序(注意是反序不是倒序)取出;WITHSCORES为可选项,表示是否携带权重分值;

“ZRANGE k1 0 -1 WITHSCORE”返回 “orange 1 apple 2.2 banana 3.3”;

注意ZRANGE命令获取的数据始终都是按照权重(score分值)的正序排列的,ZRANGE 命令中 start stop的正负代表的是从SET集合的左侧取还是右侧取

| 如果想按照权重(score分值)的倒序获取返回的数据,那么请使用ZREVRANGE key start stop[WITHSCORES];“ZREVRANGE k1 0 -1 WITHSCORE”返回“banana 3.3 apple 2.2 orange 1”

| ZINCRBY key increment member命令可以对SortedSet中的指定member的权重(score分值)进行增加指定数值,以实现动态排序;“ZINCRBY k1 4 orange”命令把k1有序集合中名为orange的member的权重(score分值)动态增加了4,由原来的1变更为了5,这个时候使用“ZRANGE k1 0 -1 WITHSCORES”返回的值为“apple 2.2 banana 3.3 orange 5”。

后续redis中将要讲解的内容梳理

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

往期文章

Redis

一、深入理解redis之需要掌握的知识点

二、redis中String和List两种数据类型和应用场景

Java集合

一、深入理解-Java集合初篇

二、Jdk1.7和1.8中HashMap数据结构及源码分析

三、JDK1.7和1.8HashMap数据结构及源码分析-续

四、深入理解Java中的HashMap「网易面试快答」

五、深入理解JDK1.7中HashMap哈希冲突解决方案

六、深入理解JDK1.8中HashMap哈希冲突解决方案

七、JDK1.7中HashMap扩容机制

八、JDK1.8中HashMap扩容机制
Java-IO体系

一、C10K问题经典问答
二、java.nio.ByteBuffer用法小结
三、Channel 通道
四、Selector选择器
五、Centos-Linux安装nc
六、windows环境下netcat的安装及使用
七、IDEA的maven项目的netty包的导入(其他jar同)
八、JAVA IO/NIO
九、网络IO原理-创建ServerSocket的过程
十、网络IO原理-彻底弄懂IO
十一、JAVA中ServerSocket调用Linux系统内核
十二、IO进化过程之BIO
十三、Java-IO进化过程之NIO
十四、使用Selector(多路复用器)实现Netty中Reactor单线程模型
十五、使用Selector(多路复用器)实现Netty中Reactor主从模型
十六、Netty入门服务端代码
十七、IO进化过程之EVENT(EPOLL-事件驱动异步模型)

如需了解更多更详细内容也可关注本人CSDN博客:不吃_花椒