Redis第一天

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

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis基本数据结构

数据结构

字符串

SDS: redis定义了一种简单动态字符串用来保存数据库中的字符串值,该动态字符串还被用作缓冲区

与C字符串的区别

  1. 常数复杂度获取字符串长度
  2. 杜绝缓冲区溢出:对SDS修改时,API会先检查SDS的空间是否满足修改所需的要求,不满足,会扩展SDS的空间至需要的大小
  3. 减少修改字符串时带来的内存重分配次数,SDS会通过空间预分配和惰性空间释放的策略管理字符串。
  4. 二进制安全:SDS的保存字符串的结构是二进制数组
  5. 兼容部分C字符串函数
Redis链表

特点:

  1. 双端:链表节点带有prev和next指针
  2. 无环:表头节点的prev和表尾节点的next指向NULL
  3. 带表头指针和标为指针
  4. 带链表长度计数器
  5. 多态:链表节点使用void *指针保存节点值,并且可以通过list结构的dup、free、match三个属性为节点值设置类型特定函数,所以链表可以用于保存各种不同类型的值。
字典

Redis字典使用哈希表作为底层实现,一个哈希表里面可以有多个哈希表节点,而每个哈希表节点就保存了字典中的一个键值对。哈希表节点中有一个next属性,指向另一个哈希表节点的指针。

rehash:扩展和收缩哈希表

  • 执行扩展操作的时机:
  1. 服务器目前没有正在执行BGSAVE或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于1
  2. 服务器正在执行BGSAVE或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于5
  • 执行收缩操作的时机:
  1. 当哈希表负载因子小于0.1时,程序自动开始对哈希表执行收缩操作

负载因子=哈希表已保存节点数量 / 哈希表大小

跳跃表

有序数据结构通过在每个节点中维持多个指向其他节点指针,从而达到快速访问节点的目的。主要在有序集合建使用和集群节点中用作内部数据结构,当一个集合只包含整数值,并且这个集合的元素数量不多时,Redis就会使用整数集合作为集合键的底层实现。

压缩列表

当一个哈希键只包含少量键值对时,并且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,那么Redis就会使用压缩列表来做哈希键的底层实现,添加新节点到压缩列表,或者从压缩列表中删除节点,可能会引发连锁更新操作,但这种操作出现的机率不高。

对象

Redis并没有直接使用这些数据结构来实现键值对数据库,而是基于这些数据结构创建了一个对象系统,这个对象系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象。不同的对象可以使用不同的数据结构。

字符串对象

编码方式:

  • int:保存的是整数值,并且可以用long类型表示
  • raw: 保存的是字符串,并且长度大于39字节
  • embstr:保存的是字符串,并且长度小于等于39字节

raw和embstr编码一样,都使用redistObject和sdshlr结构来表示字符串对象,但raw编码调用两次内存分配函数,embstr调用一次内存分配函数来分配一块连续的内存空间,redis没有对embstr的修改函数,所以对embstr的修改,会把embstr转化为raw。

列表对象

列表对象的编码可以是ziplist或者linkedlist,当列表对象同时满足以下两个条件时,使用ziplist编码

  1. 列表对象保存的所有字符串元素长度都小于64字节
  2. 列表对象的元素数量小于512个字节,不能同时满足这两个条件的列表对象需要使用linkedlist编码。
    以上两个限制值可以通过配置文件的list-max-ziplist-value和list-max-ziplist-entries修改
哈希对象

编码可以是ziplist和hashtable,使用ziplist作为底层实现时,每当有新的键值对加入哈希对象,程序先将保存于建的压缩列表节点推入压缩列表末尾,再将保存了值的压缩列表节点推入压缩列表末尾。编码方式使用ziplist还是hashtable规则和列表对象类似,可以通过配置文件的hash-max-ziplist-value和hash-max-ziplist-entries修改

集合对象

集合对象的编码可以是intset或者hashtable,通过set-max-intset-entries修改

有序集合对象

编码可以是ziplist或者skiplist,有序集合对象zset同时使用zsl跳跃表和dict字典保存所有集合元素,两种数据结构都会通过指针共享相同元素的成员和分值,当有序集合保存的元素数量小于128个,且有序集合的元素成员长度小于64字节,使用ziplist编码。 可以通过配置文件的zset-max-ziplist-value和zset-max-ziplist-entries修改

类型检查

类型特定命令所进行的类型检查时通过redisObject的type属性实现的

键回收

OBJECT REFCOUNT : 查看对对象的引用计数
OBJECT IDLETIME:查看对象的空转时长,如果服务器打开了maxmemory选项,并且服务器用于回收内存的算法为volatile-lru或者allkeys-lru,那么当服务器占用的内存数超过maxmemory选项所设置的上限时,空转时长较高的那部分键会优先被服务器释放,从而回收内存。文章来源地址https://www.toymoban.com/news/detail-529549.html

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

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

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

相关文章

  • Redis---数据库和缓存如何保证一致性?

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

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

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

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

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

    2023年04月21日
    浏览(36)
  • 数据库缓存服务——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日
    浏览(36)
  • Redis数据库 | 发布订阅、主从复制、哨兵模式、缓存雪崩

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

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

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

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

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

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

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

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

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

    2024年02月14日
    浏览(41)
  • Redis 缓存与数据库双写不一致如何解决

    Redis缓存与数据库双写不一致是一个常见的挑战,但可以通过一些方法来解决或减轻这种不一致性。以下是一些可能的解决方案: 事务处理: 在进行缓存和数据库双写时,确保它们被包含在同一事务中。这可以通过使用支持事务的数据库和Redis事务来实现。这样,要么两者同

    2024年01月21日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包