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