Redis原理简述

这篇具有很好参考价值的文章主要介绍了Redis原理简述。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Redis原理简述

Redis 有哪些特性

1. 特性

  • key-value 型内存数据库
  • 单线程——原子化操作
  • 支持lua脚本
  • 发布与订阅
  • 可持久化
  • 逐出与过期
  • ……

2. 持久化

  • RDB:经过压缩的二进制文件;fork子进程进行操作
  • AOF:保存所有写命令;先写缓存再同步至AOF文件;文件过大时会触发AOF重写

3. 过期:key到达了TTL时间

  • 惰性删除 - 读、写操作前判断
  • 定期删除 - 在定时事件中删除
  • 抽样删除:配置为定期删除时,每次只选择一部分key来判断是否已经过期

4. 逐出:执行write但内存达到上限时,强制将一些key删除

  • 逐出范围:allkeys、volatile
  • 逐出策略:LRU、random、ttl
  • 每次写入前都会判断,逐出会阻塞请求
  • 抽样删除:LRU和ttl都是抽样进行计算的

Redis 启动与初始化

Redis原理简述,redis,数据库,缓存

Redis内部数据结构

  • 对外暴露的数据结构:string、list、hash、set、sortedSet
  • 内部数据结构:dict、robj、sds、ziplist、quicklist、skiplist、intset
  • 关注点:存储效率、响应速度

dict

Redis原理简述,redis,数据库,缓存

  • 拉链法解决冲突(线性探测、多重哈希、公共溢出区……)
  • entry的value是union类型,如果是uint64_t、int64_t或double类型时,value存储数据本身,其他类型时value是指向真实数据的指针
  • 负载因子:used / size >= 1
  • 增量式重哈希:将重哈希的过程分散到对哈希表的每一次操作中。保证每个请求的响应速度。

Redis原理简述,redis,数据库,缓存

  • 在 rehash 时,字典会同时使用两个哈希表,所以在这期间的所有查找、删除等操作,除了在 ht[0] 上进行,还需要在 ht[1] 上进行。插入操作直接在ht[1]上进行。
  • 一个database中的所有key-value的映射、hash、sortedSet等

robj

Redis原理简述,redis,数据库,缓存

  • string的编码过程:
    • 可以表示成long型——OBJ_ENCODING_INT:0-10000内共享对象,*ptr存储数值
    • 大小小于44字节——OBJ_ENCODING_EMBSTR:把robj和sds放在连续内存值,减少内存碎片
    • OBJ_ENCODING_RAW:即 sds

sds

Redis原理简述,redis,数据库,缓存

Redis原理简述,redis,数据库,缓存

  • 可动态扩展内存
  • 兼容传统C字符串
  • 可存储任意二进制数据
  • 有5中不同类型的header,不同长度的字符串使用不同的header
  • 预分配空间:需要对sds扩容时,会分配比实际所需要的更多空间,减少内存重新分配

ziplist 压缩列表

Redis原理简述,redis,数据库,缓存

  • zlbytes:4字节,32位
  • zlend:结束标志固定值255
  • previous_entry_length:变长编码,可能为1个字节(前一节点长度小于254)或者5个字节(大于254)
  • 相比于普通链表:没有双向指针,节省了空间;连续内存块,减少了内存碎片。
  • 当节点数量较少时,hash使用ziplist实现。配置:hash-max-ziplist-entries、hash-max-ziplist-value。

quicklist——A doubly linked list of ziplists

Redis原理简述,redis,数据库,缓存

  • 支持压缩
  • list-max-ziplist-size:控制每个ziplist的长度或大小
  • 插入操作:
  • 当前ziplist大小没有超限:直接插入到ziplist中
  • 当前ziplist大小超限,插入位置在ziplist的两端,且相邻的ziplist大小没有超限:插入到相邻的ziplist中
  • 当前ziplist大小超限,插入位置在ziplist的两端,且相邻的ziplist大小也超限了:新建ziplist
  • 其他:将当前ziplist拆分为两个ziplist

skiplist – 跳表

Redis原理简述,redis,数据库,缓存

  • 查找时间复杂度:O(logN)
  • 平均每个节点的层数1/(1-p),即redis中平均每个节点包含1.33个指针
  • redis中第一层是双向链表
  • 跳表与平衡树、哈希表相比:
    • 跳表和平衡树元素有序,适合做范围查找。哈希表只能做单个key查找
    • 平衡树的范围查找比跳表复杂,需要进行中序遍历。
    • 平衡树的插入和删除可能会导致子树的调整,比跳表复杂。
    • 平衡树需要至少2个指针,比跳表多
    • 平衡树实现算法比跳表复杂
  • sortedSet实现:
    • 数据较少时:ziplist实现,数据在前,score在后
    • 数据较多时:zset实现,zset包含一个dict和一个skiplist

intset——整数有序集合

Redis原理简述,redis,数据库,缓存文章来源地址https://www.toymoban.com/news/detail-646734.html

  • encoding会随着数据的添加而改变。创建时为2字节。
  • 二分查找,O(logN)
  • 插入时,先扩容,查找要插入的位置,再插入,O(N)
  • set:初始为inset,直到插入非数字、数字范围超限或者inset中数字个数超限,转换为dict(数据存储在dict的key中,value为null)

到了这里,关于Redis原理简述的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • redis的缓存更新策略以及如何保证redis与数据库的数据一致性

    redis的缓存更新策略有这么几种: 1、由应用直接和redis以及数据库相连接:         查询数据时,应用去redis中查询,查不到的话再由应用去数据库中查询,并将查询结果放在redis;         更新数据时,由应用去触发redis数据的删除以及数据库的update。 2、应用只跟redi

    2024年02月13日
    浏览(57)
  • Redis如何保证缓存和数据库一致性?

    现在我们在面向增删改查开发时,数据库数据量大时或者对响应要求较快,我们就需要用到Redis来拿取数据。 Redis:是一种高性能的内存数据库,它将数据以键值对的形式存储在内存中,具有读写速度快、支持多种数据类型、原子性操作、丰富的特性等优势。 优势: 性能极高

    2024年01月16日
    浏览(70)
  • Redis---数据库和缓存如何保证一致性?

    用「读 + 写」请求的并发的场景来分析: 假如某个用户数据在缓存中不存在,请求 A 读取数据时从数据库中查询到年龄为 20,在未写入缓存中时另一个请求 B 更新数据。它更新数据库中的年龄为 21,并且清空缓存。这时请求 A 把从数据库中读到的年龄为 20 的数据写入到缓存

    2024年01月24日
    浏览(57)
  • Redis如何保障缓存与数据库的数据一致性问题?

    目录 一.最经典的数据库加缓存的双写双删模式 二. 高并发场景下的缓存+数据库双写不一致问题分析与解决方案设计 三、上面高并发的场景下,该解决方案要注意的问题 1.1 Cache Aside Pattern概念以及读写逻辑 (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取

    2023年04月21日
    浏览(49)
  • 数据库缓存服务——NoSQL之Redis配置与优化

    目录 一、缓存概念 1.1 系统缓存 1.2 缓存保存位置及分层结构 1.2.1 DNS缓存 1.2.2 应用层缓存 1.2.3 数据层缓存 1.2.4 硬件缓存 二、关系型数据库与非关系型数据库 2.1 关系型数据库 2.2 非关系型数据库 2.3 关系型数据库和非关系型数据库区别: 2.4 非关系型数据库产生背景 2.5 总结

    2024年02月15日
    浏览(50)
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩

    💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息 Redis 客户端可以订阅任意数量的频道 Redis主从复制是指在Redis中设置一个主节点(Master)和一个或多个从节点(Slave),

    2024年02月15日
    浏览(57)
  • Springboot+Redis:实现缓存 减少对数据库的压力

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 Redis实战与进阶 本专栏讲解Redis从原理到实践 这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn.net/   目录 缓存如何实现?

    2024年03月24日
    浏览(59)
  • redis面试题目-如何保证数据库与缓存的数据一致性

    原视频:https://www.bilibili.com/video/BV1Km4y1r75f?p=62vd_source=fa75329ae3880aa55609265a0e9f5d34 由于缓存和数据库是分开的,无法做到原子性的同时进行数据修改,可能出现缓存更新失败,或者数据库更新失败的情况,这时候会出现数据不一致,影响前端业务 先更新数据库,再更新缓存。缓

    2024年02月05日
    浏览(64)
  • Redis缓存MySQL数据库存储二者如何保证数据一致性

    在大型互联网应用中,由于数据库读写频繁、压力大等原因,我们通常会使用缓存来减少数据库的访问次数,提高系统的性能。而Redis作为一个高性能的内存数据库,成为了缓存的首选方案之一。但是,缓存和数据库之间存在数据一致性的问题,如何解决这个问题呢?本文将

    2023年04月19日
    浏览(52)
  • 如何保证Redis缓存和数据库的一致性问题

    熟练掌握Redis缓存技术? 那么请问Redis缓存中有几种读写策略,又是如何保证与数据库的一致性问题 今天来聊一聊常用的三种缓存读写策略 首先我们来思考一个问题 写 先更新缓存 再更新数据库 首先如果缓存更新成功但数据库更新失败,会导致数据不一致的问题 其次当请求

    2024年02月14日
    浏览(51)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包