原创

Redis的5大Value的使用场景

String 类型

1.可以处理字符串

set k1 hello(为键k1设置值hello)
get k1(获取k1的键里面对应的值)
APPEND k1 aabb(为k1键追加内容)
STRLEN k1 (查询键k1的值的字符长度)

file

2.处理数值计算(数值的增减)

INCR  场景:统计,限流,点赞,
DECR

3.bitmap(二进制位的位图操作)

SETBIT k2 1 1(为k2做便宜量为1的位置设置为1,对应ascii码里面就是@字符)
getbit k2 1(获取k2的偏移量为1的位置的数值(二进制的数值))

set k3 8
setbit k3 7 1 (8对应ascii码里面是56,再在最后一位设置为1,那么k3就变成9了)

setbit k4 999 1(偏移量超过1个字节了,那么后面差的会自动补全(扩容))

bitcount k4 0 0(k4的第一个字节(8个二进制数据里面)有多少个1)

bitcount k4 0 -1 (k4的所有二进制中有多少个1)

file

setbit k1 1 1
setbit k1 7 1
setbit k2 1 1
setbit k2 6 1
(以上设置k1和k2分别为 0 1 0 0 0 0 0 1,0 1 0 0 0 0 1 0)


按位与,结果为  0 1 0 0 0 0 0 0
BITOP and keyAnd k1 k2

按位或,结果为 0 1 0 0 0 0 1 1
BITOP or keyOr k1 k2

file

使用场景一:
任意用户,任意时间窗口内,登录天数

setbit username1 2 1(代表在当年第2天登录了)
setbit username1 364 1 (代表在第365天登录了)
BITCOUNT username1 0 -1(获取全年登录的总天数)
STRLEN username1(获取当年的数据大小(46个字节,100年也就4k大小))

file

如果有2亿用户,需要在618附近登录的人就送礼物,问需要备多少份礼物?
分析:2亿用户有僵死用户,需要知道活跃用户数。最好是能够有任意时间窗口的数据。
做个数据的旋转,key为时间,value的偏移为用户

setbit 20200101 1 1(2020年1月1日,1号用户登录了)
setbit 20200101 8 1(2020年1月1日,8号用户登录了)
setbit 20200102 8 1(2020年1月2日,8号用户登录了)
BITOP or result 20200101 20200102(这两天按位或)
BITCOUNT result 0 -1(就是活跃用户的数)

file

List 类型

list是链表结构的,且key持有list的第一个元素和最后一个元素,所以list可以很快的从头部和尾部插入数据

lpush k1 a b c d e (他们压入的顺序是从左边压入,所以最终的效果是 e d c b a)
lrange k1 0 -1(打印出来的是e d c b a)
rpush k1 x y z(从右边压入)

弹出命令:
lpop k1(从左边弹出)
rpop k1(从右边弹出)

file

可以实现:
后进先出:栈
先进先出:队列
数组
链表

数组的例子:
LINDEX k1 3(模拟数组,取下标为3的数据)

LTRIM k1 0 -1(删除k1从0到-1之外的东西,此时没有删除任何东西)
LTRIM k1 0 3(只保留0到3的数据,类似于JAVA的subList())
应用:
评论列表,可以使用这种方式分页

可以将JAVA程序中的数组,迁出到redis里面去,这样如果多个tomcat容器里面就不存,使用tomcat集群的时候,就可以取redis里面去操作数组

Hash类型(类似于HashMap)

hset k1 name zz(为hash类型的设置name键的值为zz)
hset k1 age 18(为hash类型的设置age键的值为18)

hget k1 name(获取k1中的键为name的值)
hget k1 age(获取k1中的键为age的值)
hgetall  k1(获取k1的所有的键值对)
hkeys k1(获取k1的键的集合)
hvals k1(获取k1的值的集合)

hincrby k1 age -1(数值计算,将年龄-1)

file

应用场景:

商城商品详情页--聚合数据(商品,详情,订单,评价)

统计值范畴(粉丝数,点赞数,购物数)

Set 类型

集合:无序,不可重复

sadd k1 aabb bbaa abab baba abba baab aabb(给集合k1添加数据,此处的aabb是有两个,会自动去重)
smembers k1(可以拿到刚刚存进去的数据,结果为baba bbaa baab aabb abba abab,顺序已经打乱了)
OBJECT encoding k1(获取数据的类型,结果为hashtable)
type k1(k1的类型,结果为set)

SRANDMEMBER k1 3(最后一个数据,如果是正数且数值小于k1的集合长度就不会有重复值,如果是负数,就有重复值;
如果正数且集合长度超过set的集合长度,那只会给到集合的数量(因为不会重复),如果是负数,就会补齐输入的长度,可以有重复值)
应用场景:
抽奖

另外还可以使用SPOP来抽奖,一次抽取1个
spop k1(一次抽取1个)

file

场景:交并叉集
sadd k1 a b c d(如果是用户的好友列表,如果是商品)
sadd k2 c d e f
sunion k1 k2(k1和k2的并集)

sinter k1 k2(k1 k2的交集),共同的好友,那就是共同的商品

sdiff k1 k2(k1在前,就是左叉集)面向谁的可以推荐的好友,推荐的商品
sdiff k2 k1(k2在前,就是右叉集)

file

SortedSet(ZSet) 类型(有序集合)

特点:有序集合,多了一个维度(分值,score),还有个维度(rank)

zadd k1 3.2 apple 1.2 banana 4.3 orange(在Zset集合的k1里面添加单价为3.2元的苹果,1.2元的香蕉,4.3元的橘子)

zrange k1 0 -1 withscores 查看带分值的k1集合数据,从小大的数据

zrange k1 0 1 (取出从小到大的前两名)

zrevrange k1 0 1(取出从大到小的前两名)

file

应用场景:
分页排行榜,top n 的排行榜




SortedSet的底层实现;ziplist,skiplist(如果元素特别多或者元素长度大的时候,会从ziplist切换成skiplist)

ziplist(元素个数小于等于128或者元素的字节小于等于64byte),超过就切换成skiplist

skiplist:跳跃表
正文到此结束