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的优点:在高并发下,实测,效率较稳定和优越。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值