一日三餐不可少,好友宴请炊烟袅,干煸烘烤一起炒,String、list、hash、set不难搞!
欢迎关注公众号:Java面试教程 ,回复关键字qqq,领取2023面试大全资料
话说小面的朋友张三近日寻得一新东家,近期就要上任了,特于周末宴请自己的同事到小窝吃饭,张三为显诚意,特地在家自制晚餐招待大家,同事大大是老前辈了,率先提出让大家就今天的饭菜制作过程和菜品来谈一谈redis的value类型
大大:想必大家都用过redis,但总共有哪些存储结构的数据类型呢?
可可:我知道,redis的value类型有字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets)
string
不不:张三这会正在搓面团,我就这个面来谈一谈String类型,面粉可以衍生出多种常吃食物比如包子、馒头、面条、面包、抄手等等。我们平常都会说一坨面或者一团面,那其实就像是我们大多数时候往redis里放的数据结构k,v->k是String类型,value是Object类型,管他三七二十一,将想要缓存的对象用这种方式放到redis,需要时直接取出来使用,当我们装好redis服务端并用客户端连接上后,在redis客户端对String常用的操作有
setk1aabb
getk1
还可以help set查看跟哪些参数
setk1hello
setk1ooxxnx#这个nx表示当k1这个key不存在时才去设置,应用场景比如分布式锁
getk1
这个nx比如一堆连接去创建某个Key,但是只有一个会返回成功,其他都会失败
setk2helloxx#xx表示只能更新,就是说这个Key是预先存在的
mset这个命令后面可以跟多个key-valuemget对应多个key取出
更多的可以直接 help@string来查看更多命令 比如APPENDGETRANGESTRLENk1 取长度
就说面粉做的那个小笼包,外面基本上都是蒸笼一笼一笼的重着放,我们可以把最上面的一笼标记为1也可以把最下面的一笼标记为1,在redis对String类型处理中就类似的情况是正反向索引
type命令 可以查看key的value类型,属于哪个分组就是哪个类型OBJECT命令可以查看key的encoding,查看更多关于object可以 输入object help查看帮助
object简单使用
在key的结构里除了存储key的名字还存储了vaule的type以及encoding,客户端如java代码对某些key操作时,比如类型不匹配可以直接报错
继续拿这个面粉说事,我每天早上去办公室楼下买早餐,里面卖的各色馅的包子,花卷,馒头都是有价格的,柜台流水关于这个包子等都是一个一个相加的,也就是说可以进行计算,redis也设计了这个数值类型的String,可以直接在redis侧进行数值计算
INCR
setk3a
strlenk3#结果为1
APPENDk3中
strlen k3 #长度为4,为什么?因为二进制安全,当前用的xshell连接的字符集是utf-8,一个中占3个字节,a一个字节
二进制安全
redis在存储时使用的是字节流,是二进制安全的,所以比如java代码在设置和取值时就要约定好编码解码的字符集。我们分别在utf-8和GBK的字符下set一个中字,结果在utf-8下长度为3,GBK下长度为2
bitmap
你们看张三做的那个红糖锅盔和红糖糍粑就像是二进制的0101010100011这样的,不禁就想到了redis的String当中还有一种bitmap的操作,我们先来看下有关它的操作
setbit
- 统计某个网站的用户一年365天某个随即时间段的登录天数
- 比如京东是我们在开发,现在有个需求双十一要给用户送礼物,京东总共有2亿用户要准备多少礼品呢?这就涉及到到底有多少活跃用户
做个小结并把刚刚bitop应用简单说明一下
List
哔哔:刚刚不不讲解了String类型的value,我来讲讲这个list吧。话说张三刚刚做凉虾的时候我看那个米浆糊糊是挨着密漏一点点的往下挤到盆里,这个过程是连续的并且是先挨着出口的先出,后挨着出口的后出,就像是一个链先进先出就像队列一样 描述队列,反向命令lpush rpop
LINSERT插入操作
LREM移除元素,中间的count有正数负数和零,正数就是从左数
hash
点点:你们都说的挺好的,我看张三做的糖醋排骨非常香,总共有15块,颜色是红泛黑,每块大约30g重量共计450g,形状都是长方体非常的标准,有着浓浓的番茄酱香,说着都有点流口水了,我刚刚描述的糖醋排骨可以用redis中的hash来存储,我们把key设为糖醋排骨,它有数量、重量、颜色、香味、形状这几个特征,并且可以根据特征类型来赋予不同类型的值,接下来就简单谈一谈hash的操作
help @hash命令基本上可以理解为在string命令前加了Hhset hmset hget hmget hkeys hvals
HINCRBYFLOAThash也支持对数值的操作
set
赞赞:张三刚刚做的芋儿烧鸡中一个一个的芋儿是不重复的,每个都是独立的,一锅芋儿鸡中的芋儿是混乱的没有任何顺序可言,这个就像是redis中的set类型,接下来我来谈一谈set相关的操作
SADD 添加,SMEMBERS遍历
sorted_set
张三:接着刚刚赞赞说的这个芋儿,其实我们也可以给它排个序,我们可以根据每个芋儿的重量或者大小来进行排序,这个应用就可以用redis的sorted_set来实现,我就来谈谈它的相关操作吧 理解sorted_set要理解元素是根据排序依据来排序的,这个排序依据就是一些维度指标就比如我刚刚说的重量和大小,再比如我要把水果中的苹果、香蕉、鸭梨来排序,可以根据名称、含糖量、大小、价格、吃货热度来排序,在redis中会给出一个权重分手动的指定你想要的的排序规则
也支持交并差集,ZUNIONSTORE,不带权重、分值,默认是将分值相加
使用跳跃表,大致结果就是在链表的基础上增加层(基于二分),上面的每一层都像是链表,随机造层是牺牲存储空间来换取查询效率
sorted_set小结
点点:我们刚刚说了它的命令,我用java或者其他语言怎么用呢?
大大:这些redis客户端的命令都会了,还需要去学api吗?不需要的,api也不过是根据这些命令做的一个封装而已,到时候想用那种命令直接用对应的api结合命令试一下就出来了,实在不行在查资料
张三:就是就是,饭也做好了,今天的考题就到此结束,开饭!