数据库
首页 > 数据库> > redis03-list/set/sorted_set/hash

redis03-list/set/sorted_set/hash

作者:互联网

自主学习: help @list   ->lpush k1 a b c d e f (list的push命令, 其中lpush的l是新来的左边放的意思,value可以是一个或者多个,所以是head->f->e->d->c->b->a) ->rpush k2 a b c d e f (head->a->b->...) ->lpop k1 ("f") ->lpop k1 ("e")   redis对k2实现栈,使用同向命令;如果实现队列,反向命令。(用redis的list实现 )   lrange:l是list的首字母 ->lrange k1 0 -1 (把k1区间内容显示出来 )   lindex、lset:给出list,给出一个index ->lindex k1 2 ->lindex k1 -1 ->lset k1 3 xxx (把list k1下标为3的元素更新为“xxx”)   lrem: remove elements from a list ->lpush k3 1 a 2 b 3 a 4 c 5 a 6 d ->lrange k3 0 -1 ->lrem k3 2(count,分正数/负数/零三种情况,正数,从左找count个a,负数从右找count个a,零不移除) a ->linsert key before|after pivot(这里是元素,不是索引) value ->linsert k3 after 6 a ( 如果有两个6,只在第一个6后边插) ->linsert k3 before 3 a ->lrem k3 -2 a ->llen k3   B开头的命令:阻塞... blpop: remove and get the first element in a list, or block until one is available brpop: remove and get the last element in a list, or block until one is available     redis支持阻塞队列/FIFO的单播队列,实验如下:   ->flushdb ->redis-cli (客户端1) ->redis-cli (客户端2) ->redis-cli (客户端3)   (客户端1)->blpop ooxx(key可以多个) 0(timeout,超时时间,阻塞多久的意思, 如果写0,会一直等着这里边有没有数据) (客户端2)->blpop ooxx 0 (客户端3)->rpush ooxx hello (客户端1拿到了hello) (客户端3)->rpush ooxx world (客户端2拿到了world)   ltrim命令: ->help ltrim ->ltrim key start stop (对一个区间两端的数据进行删除)   ->lpush k4 a b c d e f g ->ltrim k4 0 -1 (不删任何元素) ->ltrim k4 2 -2 (c d e f)   @hash  hash表示这个键值对里的value是hash类型,而hash本身等同于java的map(k,v),自身也是一个键值对。 ->help @hash   没学hash之前的做法: -> set sean::name 'cly' ->get sean:name ('cly') ->set sean::age 18 ->get sean::age (18) ->keys sean*  (“sean:name”,“sean:age”)   hash可以做的,key是sean,value是键值对; hash的命令一般是H开头的:   ->hset sean name zzl ->hmset sean age 18 address bj ->hget sean name ('zzl') ->hget sean age (18) ->hmget sean name age ->hkeys sean (name,age,address,用于生产表头) ->hvals sean (zzl,18,bj,生成json,封装表的内容) ->hgetall sean (name,zzl,age,18,address,bj,所有的键值对,既有title也有value) ->hincrbyfloat sean age 0.5 ->hincrbyfloat sean age -1 ->hget sean age   需求:商城有一个商品的详情页,客户端打开一个页面,关于一个商品会有很多很多详字段的信息,客户端要请求很多数据,访问数据还是redis。应用场景:减少调用次数,进行数值计算。   @Set(集合) list没有做排序(但有放入顺序),set是去重的集合,而且 里边不维护排序,也不维护插入的顺序,完全是乱序的,但是最优势的是去重。   集合操作用的相当多: ->help @set ->sadd k1 tom sean peter ooxx tom  xxoo ->smembers k1 ->srem k1 ooxx xxoo ->smembers k1 ->sadd k2 1 2 3 4 5 ->sadd k3 4 5 6 7 8 ->sinterstore(做交集,给目标key,服务端做好I/O) dest k2 k3 ->smembers dest ->sinter(做交集,不给目标key)  k2 k3 ->sunion(并集) k2 k3 ->sunionstore dest k2 k3 ->sdiff(差集) k2 k3 (差集是有方向性的,相当于k2-k3, k2在前,k3在后 ) ->sdiff k3 k2 (差集是有方向性的, 相当于k3-k2,k3在前,k2在后 )   随机事件: srandmember key [ count ,分正负零,count为 正数:取出一个去重的结果集 (不能超过已有集合), 负数:取出一个带重复的结果集 ,一定满足你要的数量,如果 为0,不返回 ] 使用场景:抽奖。如:10个奖品,用户分:>=10,<10,中奖分:是否重复,还可以解决家庭争斗。   微博抽奖: ->sadd k1 tom ooxx xxoo oxox xoxo oxxo xoox(key放粉丝的名字) ->srandmember k1 3(三个粉丝获奖,而且是去重的) -> srandmember k1 -3(负数可重复) ->srandmember k1 -20 (人少于礼物数,一定要加个负号)   -> spop k1(抽一个,并且弹出一个)     @sorted_set(有序集,对元素做排序,并且去重)   排序分字典序和数值序。 按什么排序:可以按属性排序   使用sorted_set排序,既要给出元素,又要给出分值;如果没有给分值,则按照名字的字典序排序。排序的顺序:按从大到小,还是从小到大。   -> help @sorted_set,因为S开头的方法被占用了,所以sorted_set的方法是Z开头的。   ->zadd k1 8 apple 7 banana 3 orange [score member] 默认左小右大物理内存摆放方式。且不随命令发生变化。 ->zrange k1  0[start] -1[end] ->zrange k1 0 -1 withscores ->zrangebyscore[按分值取] k1 3[min] 8[max] ->zrange k1 0 1(分值低到高取出前两名的水果) ->zrevrange k1 0 1(分值高到低取出前两名的水果) ->zrange k1 -2 -1 ->zscore k1 apple(取分值) ->zrank k1 apple(取排名) ->zincrby k1 2.5 banana   sorted_set的使用场景:歌曲的热度排行榜,某个人对某个元素的分值进行了改变,不同元素的排序位置交换来交换去,排行榜实时更新。 ->zrevrange k1 0 -1 withscores   跟set有区别的是,sorted_set因为是带着分值的,所以在做集合的交并差时,区别如下: sorted_set 更关注两个集合都有的元素,他们的分值怎么处理。   ->zunionstore destination numkeys key[key ...] [WEIGHT(要写) weight] [ aggregate(要写) sum|min|max] ->zadd k1 80 tom 60 sean 70 baby ->zadd k2 60 tom 100 sean 40 yiming ->zunionstore unkey 2 k1 k2 (先不给权重不给聚合) ->zrange unkey 0 -1 withscores (默认是sum,权重一比一) ->zunionstore unkey1 2 k1 k2 weight 1 0.5(权重设置为1,0.5,默认sum:k1*1+ k2*0.5)  ->zunionstore unkey1 2 k1 k2 aggregate max(分值取最大的)   sorted_set排序是怎么实现的(如何快速高效排序)?增删改查的速度如何? 使用到了 skip list跳跃表的概念), 多层(高层->低层),牺牲存储空间来提高查询速度。 skip list的优点:在高并发下,实测,效率较稳定和优越。                                        

标签:set,list,k3,k2,k1,sean,sorted
来源: https://blog.csdn.net/qq_33843429/article/details/114977572