问答

redis列表的问题

作者:admin 2021-07-19 我要评论

redis的列表在元素的个数比较小的时候使用的是压缩列表,元素比较多的时候就是链表了。那么在转化的过程中是渐进式的还是一下子就转换过来了?如果是一下子就转...

在说正事之前,我要推荐一个福利:你还在原价购买阿里云、腾讯云、华为云服务器吗?那太亏啦!来这里,新购、升级、续费都打折,能够为您省60%的钱呢!2核4G企业级云服务器低至69元/年,点击进去看看吧>>>)

redis的列表在元素的个数比较小的时候使用的是压缩列表,元素比较多的时候就是链表了。那么在转化的过程中是渐进式的还是一下子就转换过来了?如果是一下子就转换过来了会不会有效率问题,会不会阻塞用户的请求?

###

同步的,会阻塞。就算阻塞了人家性能也是比绝大多数程序员写的那玩意儿要高。

别瞎猜,看源码。

// 以 Hash 的 HSET 命令为例;List 的 LPUSH 命令你可以自己看
void hsetCommand(client *c) {
    int update;
    robj *o;
    // 1. 查找 key 是否存在,不存在则新建一个,然后在其上进行数据操作
    if ((o = hashTypeLookupWriteOrCreate(c, c->argv[1])) == NULL) return;
    // 2. 检查 2-3个 参数是否需要将 ZipList 转换为 LinkedList,转换后的哈希表通过 o->ptr 获取
    hashTypeTryConversion(o, c->argv, 2, 3);
    // 3. 添加键值到哈希表中
    update = hashTypeSet(o, c->argv[2]->ptr, c->argv[3]->ptr, HASH_SET_COPY);
    addReply(c, update ? shared.czero : shared.cone);
    // 4. 变更命令传播
    signalModifiedKey(c->db, c->argv[1]);
    notifyKeyspaceEvent(NOTIFY_HASH, "hset", c->argv[1], c->db->id);
    server.dirty++;
}

P.S. 3.2 之后 ziplist 已经被 quicklist 替代。

###

当列表中存储的数据量比较小时,列表会采用压缩列表的方式实现,但需要满足一下两个条件:

  • 列表中保存的单个数据小于64字节
  • 列表中数据个数小于512

如果上述任意条件不满足,列表的底层数据结构会转换为双向循环链表链表。
底层数据结构转换是同步完成的,会阻塞,但数据量较少,对客户端影响可忽略。

版权声明:本文转载自网络,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。本站转载出于传播更多优秀技术知识之目的,如有侵权请联系QQ/微信:153890879删除

相关文章
  • redis列表的问题

    redis列表的问题

  • angualr2+ng-zorro打印页面指定位置

    angualr2+ng-zorro打印页面指定位置

  • 如何解决 vmware 安装 mac 虚拟机 安装

    如何解决 vmware 安装 mac 虚拟机 安装

  • 数字序号在火狐浏览器中样式大小不同怎

    数字序号在火狐浏览器中样式大小不同怎

腾讯云代理商
海外云服务器