玖叶教程网

前端编程开发入门

二、redis中Hash、Set、SortedSet应用场景

导读

前面文章【一、深入理解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之需要掌握的知识点

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

后续还需要学习的内容




发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言