华为架构师整理Redis数据结构的大厂最佳实践( 二 )



华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 

华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 
除此之外,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可从头部(左侧)加入元素,也可以从尾部(右侧)加入元素 。有序列表 。
像微博粉丝,即可以list存储做缓存 。
key = 某大vvalue = https://www.isolves.com/it/sjk/Redis/2021-11-01/[zhangsan, lisi, wangwu]所以可存储一些list型的数据结构,如:
  • 粉丝列表
  • 文章的评论列表
可通过lrange命令,即从某元素开始读取多少元素,可基于list实现分页查询,这就是基于redis实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西,性能高,就一页一页走 。
搞个简单的消息队列,从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 结构图
华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 
5.1.2 ziplist实现存储在连续内存
华为架构师整理Redis数据结构的大厂最佳实践

文章插图
 
  • zlbytes
    ziplist 的总长度
  • zltail
    指向最末元素 。
  • zllen
    元素的个数 。
  • entry
    元素内容 。
  • zlend
    恒为0xFF,作为ziplist的定界符
linkedlist和ziplist的rpush、rpop、llen的时间复杂度都是O(1):
  • ziplist的lpush、lpop都会牵扯到所有数据的移动,时间复杂度为O(N)
    由于List的元素少,体积小,这种情况还是可控的 。
ziplist的Entry结构:
华为架构师整理Redis数据结构的大厂最佳实践


推荐阅读