Redis中hash之ziplist与hashtable性能简单对比

  近来遇到一个问题,使用redis的哈希对象存储数据,发现redis的内存耗用是单纯存进去的数据的两倍多,希望能够找到有效的方法缩减这部分多出来的空间。

  经过一番研究,是由于存储的时候,具体的存储结构使用的是hashtable来存储的,hashtable使用的内存大小是数据的两倍。一开始的时候怀疑是SDS预留出来的空间,但是经过测试,发现SDS在初始创建对象的时候是不会预留空间的,只会在出现修改的情况下预留出一倍的空间(数据小于1M时)。具体去查看源代码去查找问题,奈何功底太差,呵呵,没看出在什么地方还有预留的空间。希望知道的人不吝赐教。

  由于我们的数据不是太大,仅仅只是value值的长度比默认的 hash-max-ziplist-value 多出了20个字节。所以,就在考虑着增大这个值,使用ziplist来存储数据。结果证明,确实是比hashtable少用了一半的空间。也就是说内存方面的问题确实可以通过这个问题解决,虽然没有弄明白hashtable多用出来的空间用在了什么地方。

  但是,还有一个问题需要考虑,那就是ziplist每次添加或者删除元素都会出现内存移动的问题,那么ziplist的效率是否跟hashtable会有比较大的差距。于是就有了下边的测试:

  1.  测试机器

    centos虚拟机,2G内存。

  2. redis版本

    redis-2.8.19,aof与rdb全部关闭。

  3. 测试程序

    java,使用20个线程连接redis操作数据。

  4. 数据

    数据量在140w大小,每条数据含有4条记录,与实际情况相近偏大一点。每条记录key为20个字节,value为86个字节。

  5. 结果

    除初始化使用了140条数据,剩余的操作都是使用了20w的数据。

  初始化(140w数据) hmset hgetall hmset + hgetall hdel hset 内存消耗
hashtable 168秒 24秒 24秒 49秒 24秒 23秒 1.29G
ziplist 166秒 24秒 24秒 47秒 23秒 23秒 620M

    看上面的结果,hashtable与ziplist在数据量很小的情况下,基本上性能是相差不多的,可以在数据量很小的情况下使用ziplist来缩小使用的内存,性能上是没有太大问题的。

    分析其原因,应该是使用ziplist仅仅只是在操作记录的时候进行了一次的memmove,但是由于数据太小,消耗也就很小了。

    当然,这个我暂时还没有测试单条数据在大数据量的情况下的性能,在这种情况下性能是否还相差不多就不好说了。

  

  如果上面的测试存在问题,请不吝赐教。

  

时间: 2024-10-14 08:00:20

Redis中hash之ziplist与hashtable性能简单对比的相关文章

[评测]低配环境下,PostgresQL和Mysql读写性能简单对比

[评测]低配环境下,PostgresQL和Mysql读写性能简单对比 原文链接:https://www.cnblogs.com/blog5277/p/10658426.html 原文作者:博客园--曲高终和寡 *******************如果你看到这一行,说明爬虫在本人还没有发布完成的时候就抓走了我的文章,导致内容不完整,请去上述的原文链接查看原文**************** 由于最近经过朋友启发,又有了一个写个人项目的小想法,在这次个人项目中准备学习并使用一些之前自己没有掌握的新

08 redis中hash结构及命令详解

Hash 哈希数据类型相关命令 hset key field value 作用: 把key中 filed域的值设为value 注:如果没有field域,直接添加,如果有,则覆盖原field域的值 hmset key field1 value1 [field2 value2 field3 value3 ......fieldn valuen] 作用: 设置field1->N 个域, 对应的值是value1->N (对应PHP理解为 $key = array(file1=>value1, f

redis中hash数据类型

remoteSelf:1>hset website google "www.google.com" "1" remoteSelf:1>hget website "ERR wrong number of arguments for 'hget' command" remoteSelf:1>hget website google "www.google.com" remoteSelf:1>hset webs

redis之Hash存储与String存储内存消耗对比

存储对象User String存储方式: SET media:1155315 939 GET media:1155315 > 939 String结构存储该对象 存储量 使用内存(KB) 使用时间(毫秒) 使用cpu 100 30.72 2983   100 30.72 1224   100 40.96 2638   100 40.96 1543   100 40.96 3335   4487 1934.62 21760 0.05 4487 1934.59 21732 0.05        

Redis中的主从复制

上一篇简单的介绍了Redis中的快照,那么这篇来了解一下redis中的主从复制,不得不说redis中的主从复制配置起来相当的简单,用来降低每个redis服务器的负载,并启动主从模式,一个服务器负载"写"数据,其他服务器负载"读"数据,并且主服务器数据会"自动"同步给从服务器. 下面就来简单的配置一下 同样需要编辑redis.conf文件 在上面指定从的ip和端口号即可,当然配置好后,那么默认的从服务器是没有写入的权限的,需要修改以下配置

redis的hash操作在集中式session中的应用

在集群部署时,为了高可用性的目的,往往把session进行共享,共享分为两种:session复制和集中式管理. redis在session集中式管理中可以起到比较大的作用. 制约session集中式共享的两大因素: 1. session必须有ha机制,集群中部分服务器发生故障时,保证session不丢失. 2. session的生命周期管理. 3. session的大小未知,整体的序列化和反序列化成本比较高. redis的解决方式 1. redis具有持久化功能,且sentiment具有ha功效

Redis中的数据结构

1. 底层数据结构, 与Redis Value Type之间的关系 对于Redis的使用者来说, Redis作为Key-Value型的内存数据库, 其Value有多种类型. String Hash List Set ZSet 这些Value的类型, 只是"Redis的用户认为的, Value存储数据的方式". 而在具体实现上, 各个Type的Value到底如何存储, 这对于Redis的使用者来说是不公开的. 举个粟子: 使用下面的命令创建一个Key-Value $ SET "

redis中各种数据类型的常用操作方法汇总

一.Redis的五大数据类型 1.String(字符串) string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value.string类型是二进制安全的.意思是redis的string可以包含任何数据.比如jpg图片或者序列化的对象 .string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M 2.Hash(哈希,类似java里的Map) Redis hash 是一个键值对集合.Redis hash是一个s

辛星浅析Redis中与key有关的命令

在Redis中,我们还可以直接对key直接操作,下面是我们常用的主要命令: (1)keypattern   它表示获取所有匹配pattern的keys,这里需要注意的是,我们应该避免使用该命令,因为对于大型数据库而言,该命令非常耗时,对Redis服务器的性能打击也是比较大的.它支持glob-style的通配符格式,比如用*表示任意一个或者多个字符,用?表示任意字符,用[xyz]表示方括号中的任意一个字母. (2)del   key ....   它是从数据库中删除参数中指定的keys,如果指定的