这篇文章主要介绍redis中的常用基础对象有哪些,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一:前言

redis中有几种常用的基础对象,如string、hash、list、set、zset等,下面我们就来介绍下他们的底层实现数据结构与常见应用场景和特点。

二:redisobject

源码位置位于server.h文件中605行开始

typedefstructredisObject{unsignedtype:4;unsignedencoding:4;unsignedlru:LRU_BITS;intrefcount;void*ptr;}robj;

2.1 type

redis中实际的对象类型,分为5种0-4声明。位于文件server.h中466行

#defineOBJ_STRING0/*Stringobject.*/#defineOBJ_LIST1/*Listobject.*/#defineOBJ_SET2/*Setobject.*/#defineOBJ_ZSET3/*Sortedsetobject.*/#defineOBJ_HASH4/*Hashobject.*/

2.2 encoding

redis五种对象string、list、hash、set、zset会用到的八种编码格式,每一种编码都对应一个数据结构

#defineOBJ_ENCODING_RAW0#defineOBJ_ENCODING_INT1#defineOBJ_ENCODING_HT2#defineOBJ_ENCODING_ZIPLIST5#defineOBJ_ENCODING_INTSET6#defineOBJ_ENCODING_SKIPLIST7#defineOBJ_ENCODING_EMBSTR8#defineOBJ_ENCODING_QUICKLIST9

2.3 refcount

redis中内存的回收采用了比较简单的引用计数法进行,每个对象引用就refcount + 1,当这个引用计数减少为0时内存就会被回收

三:string

3.1 常用场景

分布式锁:分布式锁的实现基础就是采用string的命令setnx用户信息:很多时候用户信息都会序列化后存到redis中缓存,但是这里可以考虑下hash。如果仅仅使用用户数据部分信息,毕竟序列化与反序列化也是一笔开销

3.2 编码格式

int:当字符串中全是数字时会采用int编码,这是真正的二进制数据存储embstr:内存地址连续,内存一次申请。字符串长度小于44raw:底层采用sds实现,相对于embstr差别在于sds的创建与redisobject的创建分两次实现

3.3 常用命令

#存储setkeyvalue#互斥存储#已存在的key再次存入数据不会更改缓存setnxkeyvalue#过期存储,单位秒#设定key过期时间,到期自动删除setexkeysecondsvalue#过期存储,单位毫秒psetexkeymillisecondsvalue#批量存储msetkeyvalue[keyvalue...]#取值getkey#批量取值mgetkey[key...]#追加appendkeyvalue#长度strlenkey#自增,只能是int编码的字符串incrkey#自定义步长自增incrbykeyincrement#自减,只能是int编码的字符串#这个可以减到负数,秒杀扣减库存啥的想想能不能用这个命令decrkey#自定义步长自减decrbykeyincrement

四:list

4.1 常用场景

消息队列:一般不怎么用,毕竟各种MQ、Kafka都已经很成熟了。而且redis实现消息队列并不保证数据的安全排行榜计算:这种仅仅适用于定时计算更新,不能用于实时更新排行。比如美团每天计算区域入驻商家排行点赞列表:比如微信中的点赞(不知道咋做的,猜一下)

4.2 编码格式

quicklist:快速列表,之前版本有使用linkedlist和ziplist。目前使用的quicklist为两者结合体,详情可以查看Redis(一) -- 浅谈Redis中的数据结构

4.3 相关参数配置

配置参数位置位于redis.con文件中1083行和1099行

list-max-ziplist-size:配置单个ziplist大小list-compress-depth:配置LZF压缩算法开始节点

4.4 常用命令

#创建list并压入节点#压入节点位于链表头lpushkeyvalue#压入节点位于链表尾rpushkeyvalue#弹出list头节点lpopkey#弹出list尾节点rpopkey#删除节点#count>0从左开始搜索删除count数量的value#count<0从右开始搜索删除|count|数量的value#count=0删除list中所有valuelremkeycountvalue#范围保留#-1表示列表最后一个元素#-2表示倒数第二个,以此类推ltrimkeystartstop#计算长度llenkey#索引查询节点#index<0从右开始搜索#index>0从左开始搜索lindexkeyindex#范围查询#stop=-1表示所有lrangekeystartstop#阻塞弹出#队列中没有节点时会一直等待#多个key时表示挨着顺序依次检查,知道找到非空列表为止#timeout可以设置等待时间,0表示一直等待blpopkey[key...]timeoutbrpopkey[key...]timeout

五:Hash

5.1 常用场景

商品对象、用户对象。这个场景需要验证性对待,如果商品对象、用户对象信息每次都需要全量的话不妨存string,但是仅仅部分使用就可以考虑使用hash结构SKU等信息,这个场景下hash就比较合适了。一个hash结构中存储某个商品所有sku

5.2 编码格式

ziplist:使用ziplist存储hash结构时一个数据会使用相邻两个ziplistEntry存储field和valuehashtable:当数据存储超过参数限制后就会将其底层结构由ziplist转换为dict进行存储

5.3 相关参数配置

hash-max-ziplist-entries:默认512,即ziplist节点为1024。当节点数量超过该值限制后底层数据结构转为dicthash-max-ziplist-value:默认64,当hash中插入任意一个长度超过该限制的value后底层数据结构转换为dict

5.4 常用命令

#存储hsetkeyfieldvalue#不允许更改存储#若field值存在则本次存储不会覆盖原有value值hsetnxkeyfieldvalue#批量存储hmsetkeyfieldvalue[fieldvalue...]#查询hgetkeyfield#批量查询hmgetkeyfield[field...]#全量查询hgetallkey#全量查询field值hkeyskey#全量查询value值hvalskey#删除fieldhdelkeyfield[field...]#计算键值对数量hlenkey#field存在判断hexistskeyfield#增量式迭代#cursor表示迭代开始的游标#count表示迭代返回数据数量#pattern表示正则匹配结果限制hscankeycursor[Countcount][Matchpattern]

六:Set

6.1 常用场景

推荐:通过sinter命令计算交集,比如美团给你推荐附近外卖时就可以根据你的外卖记录与附近商家计算交集推送安全提示:微信群成员保存在一个set中,用户好友也保存在set中。当用户加入群聊时可以提醒非好友用户注意安全

6.2 编码格式

intset:整数集合,用于存储set集合中所有value都是整数的数据hashtable:field用于存储set集合值

6.3 相关参数配置

set-max-inset-entries:默认512,表示当元素数量超过限定以后转换为hashtable编码

6.4 常用命令

#存储saddmember[member...]#弹出元素并返回spopkeycount#查询所有元素smemberskey[count]#计算元素数量scardkey#删除指定元素sremkeymember[member...]#判断元素存在sismemberkeymember#计算给定集合与后续集合差集#返回计算结果sdiffkey[key...]#计算给定集合与后续集合差集#存储结果到destination并返回sdiffstoredestinationkey[key...]#计算给定集合与后续集合交集#返回计算结果sinterkey[key...]#计算给定集合与后续集合差集#存储结果到destination并返回sinterstoredestinationkey[key...]#计算给定集合与后续集合差集#返回计算结果sunionkey[key...]#计算给定集合与后续集合差集#存储结果到destination并返回sunionstoredestinationkey[key...]

七:Zset

7.1 常用场景

排行榜:美团要做一个销量排行榜,就可以使用店家的订单做score,这个查询出来的结果就是有序的权重队列:score作为优先级,这样取出来的数据权重都是最大优先执行的延时任务:score作为任务启动执行时间,取值时判断该值执行即可

7.2 编码格式

ziplist:与hash有异曲同工之妙,都是使用相邻两个节点存储score和memberskiplist:跳跃表结构,可以查看Redis(一) -- 浅谈Redis中的数据结构

7.3 相关参数配置

zset-max-ziplist-entries:默认值128,指定ziplist存储元素最多128个。超过转换为skiplistzset-max-ziplist-value:默认值64,存储数据值最大64字节,超过转换为skiplist

7.4 常用命令

#存储#xx表示当zset中存在本次插入的member时才存储#nx表示当zset中不存在本次插入的member时才存储zaddkey[nx|xx]scoremember[scoremember...]#查询排序指定[start,stop]范围内元素#withscores查询结果顺带返回元素分数zrangekeystartstop[withscores]#查询指定元素分数zscorekeymember#元素数量统计zcardkey#返回score位于[min,max]区间的元素数量zcountkeyminmax#对指定元素分数增加incrment值zincrbykeyincrmentmember#返回指定分数区间范围内元素#withscores返回时携带分数一起返回#limitoffsetcount表示跳过offset数量结果再返回count数量结果zrangebyscorekeyminmax[withscores][limitoffsetcount]#倒序返回指定分数区间范围内元素#withscores返回时携带分数一起返回#limitoffsetcount表示跳过offset数量结果再返回count数量结果zrevrangebyscorekeymaxmin[withrescores][limitoffsetcount]#删除指定分数范围[min,max]内元素zremrangebyscorekeyminmax#移除指定元素zremkeymember

以上是“redis中的常用基础对象有哪些”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!