详细分析Redis的数据结构与数据操作
Redis完成数据操作的速度能达到微秒级别,Redis能有这么突出的表现,主要原因有两个:
- Redis是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快;
- Redis拥有高效的数据类型和数据结构。

为了实现key到value的快速访问,Redis使用哈希表来存储键值对,哈希桶中entry保存了指向实际key和value的指针,即使值是一个集合,也可以通过value指针查找到。
当哈希表中数据越来越多后,会出现哈希冲突,也就是多个key的哈希值可能对应到同一个哈希桶中。Redis使用链式哈希来解决哈希冲突,就是将同一个哈希桶中的多个元素用一个链表来保存,元素之间依次用指针链接。
如果哈希冲突越来越多,会导致哈希冲突链过长,进而导致查找元素耗时长、效率低。为了解决这个问题,Redis会对哈希表进行rehash操作,将多个entry元素分散保存,减少单个哈希桶中的元素个数,从而减少单个桶中的冲突。
Redis默认使用两个全局哈希表来进行高效rehash,一开始默认使用哈希表1,哈希表2不分配空间,当数据不断增多时,redis通过如下步骤进行rehash:
- 给哈希表2分配更大的空间
- 把哈希表1中的数据拷贝到哈希表2中
- 释放哈希表1的空间,留作下一次rehash扩容备用
但是第2步如果一次性将大量数据进行拷贝,可能会造成Redis线程阻塞,无法服务其他请求,所以Redis采用了渐进式rehash,就是每处理一个请求,顺带将这个索引位置上的所有entry进行拷贝。
对于String类型的value来说,找到哈希桶就可以直接进行CRUD操作了,而对于集合来说,通过全局哈希表找到对应的哈希桶后,在集合中再进行CRUD。集合的操作效率与底层数据结构和操作复杂度有关。

- 单元素操作是基础,操作复杂度为O(1);
- Hash:HGET、HSET、HDEL;
- Set类型的SADD、SREM、SRANDMEMBER等。
- 范围操作非常耗时,操作复杂度为O(N)。
- Hash:HGETALL;
- Set:SMEMBERS;
- List:LRANGE
- ZSet:ZRANGE
- 统计操作通常高效,操作复杂度为O(1)。
- 例外情况只有几个,操作复杂度为O(1)。
- List:LPOP、RPOP、LPUSH、RPUSH
您可能感兴趣的文章
- 12-31hiredis从安装到项目实战操作
- 12-31phpmyadmin登录时怎么指定服务器ip和端口
- 12-31MySQL线上死锁分析实战
- 12-31MySQL 触发器的使用和理解
- 12-31MySQL 字段默认值该如何设置
- 12-31Redis主从同步配置的方法步骤(图文)
- 12-31MySQL 字符串拆分操作(含分隔符的字符串截取)
- 12-31redis 交集、并集、差集的具体使用
- 12-31MySQL精讲之二:DML数据操作语句
- 12-31PostgreSQL判断字符串是否包含目标字符串的多种方法


阅读排行
推荐教程
- 12-23PL/SQL登录Oracle数据库报错ORA-12154:TNS:无法解析指定的连接标识符
- 12-23使用imp和exp命令对Oracle数据库进行导入导出操作详解
- 12-11mysql代码执行结构实例分析【顺序、分支、循环结构】
- 12-08添加mysql的用户名和密码是什么语句?
- 12-23详解Oracle游标的简易用法
- 12-20PhpMyAdmin出现错误数据无法导出怎么办?
- 12-19Redis中实现查找某个值的范围
- 12-15浅析mysql迁移到clickhouse的5种方法
- 12-15CentOS7 64位下MySQL5.7安装与配置教程
- 12-14Mysql大型SQL文件快速恢复方案分享





