导读
前面文章【一、深入理解redis之需要掌握的知识点 】中,我们对redis需要学习的内容框架进行了一个梳理。【二、redis中String和List两种数据类型和应用场景 】我们对redis中String和List两种数据类型做了一下讲解,并且对他们各自的应用场景进行了介绍。
本篇文章我们学习的是redis中剩余的三种基础数据类型Hash、Set和SortedSet,以及他们的应用场景。
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中String和List两种数据类型和应用场景