首页 > 数据库 >redisOject 和 底层数据结构对应 学习笔记

redisOject 和 底层数据结构对应 学习笔记

时间:2022-11-28 12:00:48浏览次数:46  
标签:编码 对象 ziplist 笔记 embstr raw 集合 数据结构 redisOject

笔记摘抄自 https://pdai.tech/md/db/nosql-redis/db-redis-data-type-enc.html

redisObject 查看编码命令

set k1 1
object encoding k1

set k2 hello
object encoding k2

字符串对象

字符串是redis 最基本的数据类型,不仅所有的key都是字符串类型,其他几种数据类型构成的元素也是字符串,字符串的长度不能超过512M。

  • 编码
    字符串对象的编码可以是 int, raw 或者 embstr.

  • int 编码: 保存的可以是用long 类型表示的整数值

  • embstr 编码: 保存长度小于44字节的字符串

  • raw 编码: 保存长度大于44字节的字符串

  • raw 和 embstr 的区别
    embstr 使用只分配一次内存空间,而raw需要分配两次内存空间。因此与raw相比,embstr 的好处在于创建时少分配一次空间,删除时少释放一次空间,以及对象的所有数据连在一起,寻找方便。而embstr 的坏处很明显,字符串的长度增加需要重新分配内存时,整个redisObject对象和sds都需要重新分配空间

ps: redis中对于浮点数类型也是作为字符串保存的,在需要的时候在转换

  • 编码的转换
    当int 编码保存的值不再是整数,或者大小超过long的范围时,自动转为raw.
    对于embstr 编码,由于redis 没有任何的修改程序,在对embstr修改时,都会先转为raw在进行修改,因此,只要是修改embstr对象,修改后的对象一定是raw,无论是否达到了44个字节

列表对象

  • 编码
    列表对象的编码是quicklist
  • 内存布局

哈希对象

哈希对象的键是一个字符串类型,值是一个键值对集合

  • 编码
    哈希对象的编码可以是ziplist 或者 hashtable;对应的底层实现有两种,一种是ziplist ,一种是dict
  • 编码转换
    同事满足下面两个条件是,使用ziplist编码:
  1. 列表保存元素小于512个
  2. 每个元素长度小于64字节
    不能满足这两个条件的时候使用hashtable编码。以上两个条件可以通过redis配置文件 zset-max-ziplist-entries 和 zset-max-ziplist-value 进行修改

集合对象

集合对象set是string类型的无序集合。与列表的区别:集合中的元素是无序的,因此不能通过索引来操作元素,集合中的原始不能有重复。

  • 编码
    intset 或者 hashtable ,底层实现有两种,分别是intset 和 dict。显然intset作为底层实现的数据结构时,集合中存储的只能是数值数据,而且必须是整数;使用dict作为底层实现时,是将数据全部存储于dict的键中,值字段闲置不用
  • 编码转换
    当集合同时满足以下两个条件时,使用intset 编码:
  1. 集合对象所有元素都是整数
  2. 结合对象所有元素数量不超过512
    不能满足这两个条件的就是用hashtable编码。第二个条件可以通过配置文件的 set-max-intset-entries 进行配置

有序集合对象

和上面的集合对象相比,有序集合对象是有序的。与列表使用索引下表作为排序依据不同,有序集合为每个元素设置一个分数作为排序依据

  • 编码
    有序集合的底层实现有两种,一种是使用ziplist最为底层实现,另一种比较特殊,底层使用了两种数据结构:dict 与 skiplist。前者对应的编码值为ZIPLIST,后者为SKIPLIST
    其实有序集合单独使用字典或者跳跃表其中一种数据结构都可以实现,但是这里使用两种数据结构组合起来,原因是假如单独使用字典,虽然能以O(1)的时间复杂度查找成员的分值,但是因为字典是无序的方式来保存集合元素,所以每次进行范围操作的时候都要进行排序;假如单独使用跳跃表来实现,虽然能执行范围操作,但是查找操作由O(1)的复杂度变为了O(logN)。
  • 编码转换
    当有序集合对象同时满足以下两个条件时,对象使用ziplist编码:
  1. 保存的元素数量小于128;
  2. 保存的所有元素长度都小于64字节
    不满足上面两个条件使用skiplist编码。以上两个条件可以通过配置文件 zset-max-ziplist-entries 选项和 zset-max-ziplist-value 进行修改

标签:编码,对象,ziplist,笔记,embstr,raw,集合,数据结构,redisOject
From: https://www.cnblogs.com/youj/p/16931825.html

相关文章

  • 罗剑锋的C++实战笔记(学习笔记1)
    本系列文章记载学习一门在线课程罗剑锋的C++实战笔记过程中的心得体会,只会记录新增加的知识点,那些心中已熟透的知识点,不会重复记录。c++的主战场在Linux上,现在开发Wi......
  • 驱动开发学习笔记---阻塞和非阻塞IO
    一、阻塞和非阻塞简介当应用程序对设备驱动进行操作的时候,如果不能获取到设备资源,那么阻塞式IO就会将应用程序对应的线程挂起,直到设备资源可以获取为止。对于非阻塞IO......
  • 拓端数据tecdat|R语言进行数据结构化转换:Box-Cox变换、“凸规则”变换方法
     线性回归时若数据不服从正态分布,会给线性回归的最小二乘估计系数的结果带来误差,所以需要对数据进行结构化转换。在讨论回归模型中的变换时,我们通常会简单地使用Box-Cox变......
  • Django-课程介绍-笔记
    软件框架问题1:什么是软件框架?举个简单的例子,对于一个公司来说,公司中有各个职能部门,每个部门各司其职,通过部门之间的配合来完成工作,这些部门就形成了一个公司的组织架构。从......
  • Django-1.入门-笔记
    本节课是通过Django框架最终完成一个"图书-英雄"信息管理的小例子。目标对使用django框架有一个全面的认识,包括开发流程、基本概念要素,并不针对某个概念知识点详细拆解,后续......
  • Django-1.1搭建环境-笔记
    虚拟环境在开发过程中,当需要使用python的包时可以联网安装sudopip3install包名称使用如上命令,会将包安装到/usr/local/lib/python3.5/dist-packages下。产生的问题如果在......
  • Django-1.2创建项目-笔记
    创建图书管理项目我们以一个电商网站为例,网站上有跟用户有关的页面,有跟商品有关的页面,还有跟订单有关的页面,这样的一块内容其实就是网站的一个功能模块。在django中,项目的组......
  • 区块链学习笔记
    这是我学习北京大学肖臻老师《区块链技术与应用》公开课的学习笔记课程地址:北京大学肖臻老师《区块链技术与应用》公开课比特币比特币中的密码学原理比特币被称为加......
  • 20221128 语文笔记
    秋词要点区分:刘禹锡:梦得曹操:孟德自古逢秋悲寂寥,我言秋日胜春朝。(一二句运用了对比的写法(古人:悲秋、作者:颂秋),表达了作者乐观豁达的心境)晴空一鹤排云上,(义项:晴空、鹤......
  • React 学习笔记之二 - React 详解
    2.1为什么使用ReactReact.js只是一个JS库,而其整个技术栈是一个渐进式框架。渐进式的含义是:主张最少,也就是可以只用它其中的一部分,有了新的需求后再引入其他的类库。......