文章插图
文章插图
文章插图
文章插图
文章插图
文章插图
文章插图
文章插图
文章插图
文章插图
文章插图
文章插图
文章插图
文章插图
除此之外,string 类型的value还有一些CAS的原子操作,如:get、set、set value nx(如果不存在就设置)、set value xx(如果存在就设置) 。
String 类型是二进制安全的,也就是说在Redis中String类型可以包含各种数据,比如一张JPEG图片或者是一个序列化的Ruby对象 。一个String类型的值最大长度可以是512M 。
在Redis中String有很多有趣的用法
- 把String当做原子计数器,这可以使用INCR家族中的命令来实现:INCR, DECR, INCRBY 。
- 使用AppEND命令来给一个String追加内容 。
- 把String当做一个随机访问的向量(Vector),这可以使用GETRANGE和 SETRANGE命令来实现
- 使用GETBIT 和SETBIT方法,在一个很小的空间中编码大量的数据,或者创建一个基于Redis的Bloom Filter 算法 。
像微博粉丝,即可以list存储做缓存 。
key = 某大vvalue = https://www.isolves.com/it/sjk/Redis/2021-11-01/[zhangsan, lisi, wangwu]
所以可存储一些list型的数据结构,如:- 粉丝列表
- 文章的评论列表
搞个简单的消息队列,从list头推进去,从list尾拉出来 。
List类型中存储一系列String值,这些String按照插入顺序排序 。
5.1 内存数据结构List 类型的 value对象,由 linkedlist 或 ziplist 实现 。
当 List 元素个数少并且元素内容长度不大采用ziplist 实现,否则使用linkedlist
5.1.1 linkedlist实现链表的代码结构
typedef struct list {// 头结点listNode *head;// 尾节点listNode *tail;// 节点值复制函数void *(*dup)(void * ptr);// 节点值释放函数void *(*free)(void *ptr);// 节点值对比函数int (*match)(void *ptr, void *key);// 链表长度unsigned long len;} list;// Node节点结构typedef struct listNode { struct listNode *prev; struct listNode *next; void *value;} listNode;
linkedlist 结构图文章插图
5.1.2 ziplist实现存储在连续内存
文章插图
- zlbytes
ziplist 的总长度 - zltail
指向最末元素 。 - zllen
元素的个数 。 - entry
元素内容 。 - zlend
恒为0xFF,作为ziplist的定界符
- ziplist的lpush、lpop都会牵扯到所有数据的移动,时间复杂度为O(N)
由于List的元素少,体积小,这种情况还是可控的 。
推荐阅读
- 如何成为一名优秀的企业培训师
- 毕业证书|公共营养师,不会过时的职业
- 余秀华为什么被称为农民诗人?农村诗人余秀华走红_1
- 揭秘英伟达 GPU 架构演进近十年,从费米到安培
- 身份难辨,零信任架构下如何设置访问权限?
- 《斗罗大陆魂师对决》风笑天魂环怎样搭配?
- 减脂|韩红老师大学时期照片流出,五官精致发型干练,曾经是军艺校花
- 为什么是司马昭称帝而不是司马师?司马师司马昭谁能力强
- 教师|工作10年后才明白,公务员和教师的差距,希望你没选错
- 雕刻|一块原石,设计师雕刻成了翡翠白菜,价值马上提升翻倍