`
ChristmasLin
  • 浏览: 41319 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

redis数据类型改进和补充:zip2list和uintset

 
阅读更多

 

    ziplist和intset是redis的两种value格式。顾名思义,ziplist是压缩的list,intset是存放int的set。元素在里面都是被编成bytes。

ziplist的大概思路是如果存放的字符串可以被解析成int,则以int的编码保存,节省内存。编码成int时,head包含一个字节encoding,代表int的长度,分别是2bytes,4bytes,8bytes。具体的编码格式:

        * |00pppppp| - 1 byte 

        *  String value with length less than or equal to 63 bytes (6 bits). 

        * |01pppppp|qqqqqqqq| - 2 bytes 

        *  String value with length less than or equal to 16383 bytes (14 bits). 

        * |10______|qqqqqqqq|rrrrrrrr|ssssssss|tttttttt| - 5 bytes 

        *  String value with length greater than or equal to 16384 bytes. 

        * |1100____| - 1 byte 

        *  Integer encoded as int16_t (2 bytes). 

        * |1101____| - 1 byte 

        *  Integer encoded as int32_t (4 bytes). 

        * |1110____| - 1 byte 

        *  Integer encoded as int64_t (8 bytes). 

 

intset以固定的长度编码int,有3种长度,int16,int32,int64。整个set的元素都用同一种编码,不需要元素head。这样节省一个head,当put一个int时,如果set的编码不足以容纳该元素,那么需要向上提升set的长度编码。并把存在的int重新编码拓展。这样就存在一个问题,如果set的元素大小参差不齐,那么浪费的空间会较多。

对于这两种类型的详细实现,有兴趣的同学去抠下代码或g下,网上很多分析,就不写重复的东西了。

 

最近的空闲时间在尝试做些redis的改进,一些想法见 http://christmaslin.iteye.com/blog/1273189。实现一个ziplist的改进版zip2list,另外实现一个新的类型,uintset,在较多的场景里,都是使用uint。为uint专门优化还是值得的。

ziplist对int编码时,只是使用了encoding的4bit,另外的4bit浪费了。在zip2list,充分使用encoding的bit。具体的编码如下:

  * |1100 0000|- 0 byte 

        *      Integer 0. 

        * |1100 0001| - 1 byte 

        *      +Integer encoded 1 bytes.(1~255) 

        * |1100 0010| - 2 byte 

        *      +Integer encoded 2 bytes. 

        * |1100 0011| - 3 byte 

        *      +Integer encoded 3 bytes. 

        * |1100 0100| - 4 byte 

        *      +Integer encoded 4 bytes. 

        * |1100 0101| - 5 byte 

        *      +Integer encoded 5 bytes. 

        * |1100 0110| - 6 byte 

        *      +Integer encoded 6 bytes. 

        * |1100 0111| - 7 byte 

        *      +Integer encoded 7 bytes. 

        * |1100 1000| - 8 byte 

        *      +Integer encoded 8 bytes. 

        * 

        * |1110 0001| - 1 byte 

        *      -Integer encoded 1 bytes.-(1-255) 

        * |1110 0010| - 2 byte 

        *      -Integer encoded 2 bytes. 

        * |1110 0011| - 3 byte 

        *      -Integer encoded 3 bytes. 

        * |1110 0100| - 4 byte 

        *      -Integer encoded 4 bytes. 

        * |1110 0101| - 5 byte 

        *      -Integer encoded 5 bytes. 

        * |1110 0110| - 6 byte 

        *      -Integer encoded 6 bytes. 

        * |1110 0111| - 7 byte 

        *      -Integer encoded 7 bytes. 

        * |1110 1000| - 8 byte 

        *      -Integer encoded 8 bytes. 

|1100 ----| ,value>= 0,|1110 ----| value 0,所有的value都编成uint,encoding已经带符号位了。 例如 value{1} 编成 [|1100 0001| 0000 0001],value{-1} 编成 [|1110 0001| 0000 0001]. 这种编码方式一个字节都不会浪费。

 

对于uintset里的uint,则使用可变长编码,同样不需要使用head。可变长编码,一个int64的长度是1~10bytes。可变长编码的大概思路是一个byte只使用7bit,最后1bit用来代表是否编码结束,如果0,则结束,否则为1.这个小技巧在leveldb和Tokyo Cabinet都可以见到。(题外话,leveldb的思路和实现都值得一看,通过数据的版本号来解决读写的并发,精简的mvcc。此外,还像个单机版的hbase)。这个方案避免参差的int造成的浪费。当然,它可能也需要付出额外的字节。但在大部分情况下,对内存的利用应该比定长编码更优。当然,在性能上比intset,可能会有所损耗。对set的插入,删除,读取都需要查找,为了增加查找速度,int在里面是排序的,intet和uintset都是这样。但是intset的int编码长度固定,容易定位元素,2分查找是非常方便。而uintset的uint长度未知。在二分时不是针对uint的数目二分,而是针对set编码后的一个大byte array做2分。有2点可能造成性能损失:不是准确的二分和定位到一个byte时,要向前扫描找到uint的起始byte,虽然最多扫描不超过10byte。此外,要获取指定序号的uint,只能从起点向后或终点向前扫描(视乎序号更接近起点还是终点)。

在内存紧缺的情况下,uintset还是有存在的价值的。

这两种类型已经实现,相关的想法也提到官方社区。

分享到:
评论

相关推荐

    3.Redis数据类型之List类型

    3.Redis数据类型之List类型

    Redis集群管理工具Redis::Sentinel.zip

    Redis-sentinel是Redis的作者antirez完成的,因为Redis实例在各个大公司的应用,每个公司都需要一个Redis集群的管理工具,被迫都自己写管理工具来管理Redis集群,antirez考虑到社区的急迫需要(详情),花了几个星期写...

    Redis-x64-5.0.9.zip

    Redis下载,Redis Server,Redis-x64-5.0.9.zip

    Redis3_win.zip:一款高性能的NOSQL系列的非关系型数据库

    redis是一款特殊的数据库软件,它是一款高性能的NOSQL系列的非关系型...和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)

    redis2json:以JSON格式导出Redis数据

    redis2json 这是一个快速而肮脏的脚本,它将redis转储到RAM中并打印出相应的JSON。用途您可以通过gzip通过管道传输输出并将其发送到文件,以进行快速的非redis数据备份或导出/迁移到另一个系统。 例如: ./redis_to_...

    Redis数据类型视频

    在本课程中,你将了解Redis是什么、能干什么、如何用,了解NoSQL的使用场景和概念,快速掌握Redis的安装配置、五大数据类型、常用操作命令、Redis持久化、主从复制、事务控制以及用Jedis操作进行Java开发等知识。...

    Redis数据类型.docx

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

    redis数据类型指令整理

    Redis数据类型以及指令整理, 1. string 2. list 3. SET集合 4. sorted set 5. hash

    SpringBoot+Vue+Redis+Mysql实现水果商城.zip

    SpringBoot+Vue+Redis+Mysql实现水果商城.zip SpringBoot+Vue+Redis+Mysql实现水果商城.zip SpringBoot+Vue+Redis+Mysql实现水果商城.zip SpringBoot+Vue+Redis+Mysql实现水果商城.zip SpringBoot+Vue+Redis+...

    最新版windows Redis-x64-5.0.14.zip

    最新版windows Redis-x64-5.0.14.zip最新版windows Redis-x64-5.0.14.zip

    redis学习课件.zip

    Redis(Remote Dictionary Server)是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。以下是一些学习Redis的基本步骤和要点: 了解Redis的基本概念和特性: Redis是一个基于内存的key...

    Syske#person-learning-note#Redis数据类型1

    Redis 数据类型Redis支持五种数据类型:String(字符串)string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个

    Redis-x64-3.0.503_bak.zip

    redis.exceptions.ConnectionError: Error 10061 connecting to 127.0.0.1:6379. 由于目标计算机积极拒绝,无法连接。安装这个包即可,给的github链接地址给下载奇慢

    redis面试题之数据类型.zip

    redis面试题 redis面试题之数据类型

    redis-6.2.1-x64-for-windows-bin.zip

    Redis 6.2.1 现已发布,该版本升级迫切性程度为低:修复了编译问题。具体更新内容如下: Bug 修复 修复带有已删除记录的 stream 的 sanitize-dump-payload(#8568) 防止将 client-query-buffer-limit 配置设置为...

    基于springboot+shiro+jwt+vue+redis的后台管理系统源码.zip

    1、基于springboot+shiro+jwt+vue+redis的后台管理系统源码.zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目,作为参考资料...

    redis-6.2.6_win10.zip

    目前redis6版本没有win版本,这里通过Cygwin64进行编译成win10可执行的redis软件包。

    基于springboot+mybatis redis构建的在线抽奖系统.zip

    基于springboot+mybatis redis构建的在线抽奖系统.zip基于springboot+mybatis redis构建的在线抽奖系统.zip基于springboot+mybatis redis构建的在线抽奖系统.zip基于springboot+mybatis redis构建的在线抽奖系统.zip...

    Redis 数据类型的详解

    Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个...

    最新版windows Redis-x64-5.0.10.zip

    最新版windows Redis-x64-5.0.10.zip最新版windows Redis-x64-5.0.10.zip

Global site tag (gtag.js) - Google Analytics