最新消息: 关于Git&GitHub 版本控制你了解多少?
您现在的位置是:群英 > 数据库 >
Redis的数据结构与数据操作你知道多少?
PHP中文网发表于 2021-03-02 11:58 次浏览

推荐(免费):redis

Redis完成数据操作的速度能达到微秒级别,Redis能有这么突出的表现,主要原因有两个:

  • Redis是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快;
  • Redis拥有高效的数据类型和数据结构。

为了实现key到value的快速访问,Redis使用哈希表来存储键值对,哈希桶中entry保存了指向实际key和value的指针,即使值是一个集合,也可以通过value指针查找到。

当哈希表中数据越来越多后,会出现哈希冲突,也就是多个key的哈希值可能对应到同一个哈希桶中。Redis使用链式哈希来解决哈希冲突,就是将同一个哈希桶中的多个元素用一个链表来保存,元素之间依次用指针链接。

如果哈希冲突越来越多,会导致哈希冲突链过长,进而导致查找元素耗时长、效率低。为了解决这个问题,Redis会对哈希表进行rehash操作,将多个entry元素分散保存,减少单个哈希桶中的元素个数,从而减少单个桶中的冲突。

Redis默认使用两个全局哈希表来进行高效rehash,一开始默认使用哈希表1,哈希表2不分配空间,当数据不断增多时,redis通过如下步骤进行rehash:

  1. 给哈希表2分配更大的空间
  2. 把哈希表1中的数据拷贝到哈希表2中
  3. 释放哈希表1的空间,留作下一次rehash扩容备用

但是第2步如果一次性将大量数据进行拷贝,可能会造成Redis线程阻塞,无法服务其他请求,所以Redis采用了渐进式rehash,就是每处理一个请求,顺带将这个索引位置上的所有entry进行拷贝。

对于String类型的value来说,找到哈希桶就可以直接进行CRUD操作了,而对于集合来说,通过全局哈希表找到对应的哈希桶后,在集合中再进行CRUD。集合的操作效率与底层数据结构和操作复杂度有关。

  1. 单元素操作是基础,操作复杂度为O(1);
    • Hash:HGET、HSET、HDEL;
    • Set类型的SADD、SREM、SRANDMEMBER等。
  2. 范围操作非常耗时,操作复杂度为O(N)。
    • Hash:HGETALL;
    • Set:SMEMBERS;
    • List:LRANGE
    • ZSet:ZRANGE
  3. 统计操作通常高效,操作复杂度为O(1)。
  4. 例外情况只有几个,操作复杂度为O(1)。
    • List:LPOP、RPOP、LPUSH、RPUSH

以上就是详细分析Redis的数据结构与数据操作的详细内容,更多请关注群英网络其它相关文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
相关信息推荐
2021-09-02 17:45:00 关键词:navicat导出数据结构
摘要:在数据库的实际应用中,我们也需要经常导出sql的数据结构,因此这篇文章就给大家分享navicat中导出数据结构的方法和步骤,下文有详细的图文教程,有需要的朋友可以参考。..
2021-08-26 18:00:34 关键词:navicat怎么批量处理数据
摘要:这篇文章主要给大家分享的是navicat怎么批量处理数据的操作,小编觉得比较实用,因此分享给大家做个参考,下文有很详细的介绍,感兴趣的朋友就继续往下看吧。..
2021-08-24 17:51:30 关键词:Redis集群
摘要:这篇文章主要给大家分享的是Redis集群的内容,对于Redis集群,一般有三种模式,分别是主从模式、Sentinel模式和Cluster模式。下面我们就来分别看看他们有何不同?特点分别是什么。..
2021-06-10 16:25:48 关键词:redis,缓存,面试
摘要:本篇文章给大家分享一些关于redis缓存的面试题。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。..
2021-06-10 16:23:43 关键词:Redis,哨兵模式
摘要:本篇文章带大家了解一下Redis中的哨兵模式。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。..