一日三餐不可少,好友宴请炊烟袅,干煸烘烤一起炒,String、list、hash、set不难搞!话说张三近日寻得一新东家,近期就要上任了,特于周末宴请自己的同事到小窝吃饭,张三为显诚意,特地在家自制晚餐招待大家,同事大大是老前辈了,率先提出让大家就今天的饭菜制作过程和菜品来谈一谈redis的value类型大大:想必大家都用过redis,但总共有哪些存储结构的数据类型呢?可可:我知道,redis的value类型有字符串, 散列, 列表, 集合, 有序集合string不不:张三这会正在戳面团,我就这个面来谈一谈String类型,面粉可以衍生出多种常吃食物比如包子、馒头、面条、面包、抄手等等。我们平常都会说一坨面或者一团面,那其实就像是我们大多数时候往redis里放的数据结构k,v->k是String类型,value是Object类型,管他三七二十一,将想要缓存的对象用这种方式放到redis,需要时直接取出来使用,当我们装好redis服务端并用客户端连接上后,在redis客户端对String常用的操作有set k1 aabbget k1还可以help set查看跟哪些参数set k1 helloset k1 ooxx nx #这个nx表示当k1这个key不存在时才去设置,应用场景比如分布式锁get k1这个nx比如一堆连接去创建某个Key,但是只有一个会返回成功,其他都会失败set k2 hello xx #xx表示只能更新,就是说这个Key是预先存在的mset 这个命令后面可以跟多个key-valuemget 对应多个key取出更多的可以直接 help@string来查看更多命令比如APPEND GETRANGESTRLEN k1 取长度就说面粉做的那个小笼包,外面基本上都是蒸笼一笼一笼的重着放,我们可以把最上面的一笼标记为1也可以把最下面的一笼标记为1,在redis对String类型处理中就类似的情况是正反向索引我们可以通过0到-1来遍历整个字符串type命令 可以查看key的value类型,属于哪个分组就是哪个类型OBJECT 命令可以查看key的encoding,查看更多关于object可以 输入object help查看帮助object简单使用在key的结构里除了存储key的名字还存储了vaule的type以及encoding,客户端如java代码对某些key操作时,比如类型不匹配可以直接报错继续拿这个面粉说事,我每天早上去办公室楼下买早餐,里面卖的各色馅的包子,花卷,馒头都是有价格的,柜台流水关于这个包子等都是一个一个相加的,也就是说可以进行计算,redis也设计了这个数值类型的String,可以直接在redis侧进行数值计算INCR继续看个小实验,我们将k2用字符和数值的方式都来搞一下可以看见k2的type会根据操作进行变换继续跟着实验set k3 astrlen k3 # 结果为1APPEND k3 中strlen k3 #长度为4,为什么?因为二进制安全,当前用的xshell连接的字符集是utf-8,一个中占3个字节,a一个字节二进制安全redis在存储时使用的是字节流,是二进制安全的,所以比如java代码在设置和取值时就要约定好编码解码的字符集。
我们分别在utf-8和GBK的字符下set一个中字,结果在utf-8下长度为3,GBK下长度为2我们再看一下value的存储字节加上参数raw后它就会按照utf-8进行结果输出bitmap你们看张三做的那个红糖锅盔和红糖糍粑就像是二进制的0101010100011这样的,不禁就想到了redis的String当中还有一种bitmap的操作,我们先来看下有关它的操作setbitsetbit是对位进行操作置1,取值是二进制对应的ASCII码,01000000对应@,01000001对应Abitpos*,找的是二进制字符流指定的位置,结果是二进制的位的位置命令bitcount统计key的字节里包含1的个数命令bitop对两个Key进行按位与、或、非、异或bitop应用场景比如:统计某个网站的用户一年365天某个随即时间段的登录天数比如京东是我们在开发,现在有个需求双十一要给用户送礼物,京东总共有2亿用户要准备多少礼品呢?这就涉及到到底有多少活跃用户做个小结并把刚刚bitop应用简单说明一下List哔哔:刚刚不不讲解了String类型的value,我来讲讲这个list吧。
话说张三刚刚做凉虾的时候我看那个米浆糊糊是挨着密漏一点点的往下挤到盆里,这个过程是连续的并且是先挨着出口的先出,后挨着出口的后出,就像是一个链先进先出就像队列一样描述队列,反向命令lpush rpop张三穿的烧烤肉块串在吃的时候是先吃的最后穿上去的,就像是栈一样后进先出描述栈的命令有lpush lpop rpush rpop,后进先出,同向命令接下来我们看看有关一些list的操作命令LRANGE遍历listlist也是有正负向索引的LINDEX 根据索引取值LSET根据索引更新LINSERT插入操作LREM移除元素,中间的count有正数负数和零,正数就是从左数LLEN统计长度,BLPOP,BRPOP阻塞的,一直等着有元素了就pop出来,模拟一下就是我开redis3个客户端,第一个和第二个使用blpop ooxx 0,这时候2个都阻塞着了,第三个客户端使用rpush ooxx hello,第一个拿到元素,第二个还是阻塞,第三个客户端重复压入数据,第二个拿到元素。