Redis集合[持续更新]

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

数据结构

1. string 字符串

字符串类型是 Redis 最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的。字符串类型实际上可以是字符串:简单的字符串、XML、JSON;数字:整数、浮点数;二进制:图片、音频、视频。

使用场景:缓存、计数器、共享 Session、限速。

2. Hash(哈希)

在 Redis中哈希类型是指键本身是一种键值对结构,如 value={{field1,value1},……{fieldN,valueN}}

使用场景:哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。所以常常用于用户信息等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而 Redis 去模拟关系型复杂查询开发困难且维护成本高。

3. List(列表)

列表类型是用来储存多个有序的字符串,列表中的每个字符串成为元素,一个列表最多可以储存 2 ^ 32 – 1 个元素,在 Redis 中,可以队列表两端插入和弹出,还可以获取指定范围的元素列表、获取指定索引下的元素等,列表是一种比较灵活的数据结构,它可以充当栈和队列的角色。

使用场景:Redis 的 lpush + brpop 命令组合即可实现阻塞队列,生产者客户端是用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。

image-20210608011814007

4. Set(集合)

集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素,并且集合中的元素是无序的,不能通过索引下标获取元素,Redis 除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。合理的使用好集合类型,能在实际开发中解决很多实际问题。

使用场景:如:一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。

5. zset(sorted set:有序集合)

有序集合和集合有着必然的联系,它保留了集合不能有重复成员的特性,但不同得是,有序集合中的元素是可以排序的,但是它和列表的使用索引下标作为排序依据不同的是:它给每个元素设置一个分数,作为排序的依据。

使用场景:排行榜是有序集合经典的使用场景。例如:视频网站需要对用户上传的文件做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。

缓存穿透

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。

形成原因:

  • 业务代码或数据出现问题,比如读写key不一致

  • 网络爬虫或恶意攻击

解决方法:

  • 缓存空对象:对于查询不到的数据给它设置一个空值进行缓存。

    带来的问题:

    1、需要更多的内存空间,比较有效的方法是针对这类数据设置一个较短的过期时间,让其自动剔除。这种方法使用与数据经常变化,实时性较高的场景。

    2、缓存和存储的数据会有一段时间窗口的不一致,可能会对业务有一定影响。例如:过期时间设置为 5分钟,如果此时存储添加了这个数据,那此段时间就会出现缓存和存储数据的不一致,此时可以利用消息系统或者其他方式清除掉缓存层中的空对象。
  • 布隆过滤器拦截:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对底层存储系统的查询压力。这种方法适用于数据命中不高、数据相对固定、实时性低的应用场景,代码维护较为复杂,但是缓存空间占用少。

缓存击穿

某个key成为一个热点(如商品秒杀)时,这样处于一个集中式高并发的情况下,如果key突然失效一瞬间,请求就会马上击穿缓存层,直接请求数据库,这样后端负载会很快过载甚至崩溃。

解决办法:

1,根据实际情况设置二级缓存或者热点缓存永不过期。

2,设置分布式互斥锁,只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据

缓存雪崩

当缓存层由于某些原因不可用(宕机)或者大量缓存由于超时时间相同在同一时间段失效(大批key失效/热点数据失效),大量请求直接到达存储层,存储层压力过大导致系统雪崩。

解决办法:

  1. 设置多级缓存,不同的缓存设置不同的过期时间。
  2. 加锁排队:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个 key 只允许一个线程查询数据和写缓存,其他线程等待;
  3. 数据预热:可以通过缓存 reload 机制,预先去更新缓存,再即将发生大并发访问前手动触发加载缓存不同的 key,设置不同的过期时间,让缓存失效的时间点尽量均匀;
  4. 将缓存层设计为高可用,例如使用sentinel哨兵模式或者cluster,这样即使个别节点或机器宕机也不会影响缓存效果实现。
  5. 将缓存的过期时间设置随机分布的,避免在同一时间内缓存集体失效。

持久化

RDB

RDB 是 Redis DataBase 的缩写。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即 Snapshot 快照存储,对应产生的数据文件为 dump.rdb,通过配置文件中的 save 参数来定义快照的周期。核心函数:rdbSave(生成 RDB 文件)和 rdbLoad(从文件加载内存)两个函数。

image-20210608012429690

AOF

AOF 是 Append-only file 的缩写。Redis会将每一个收到的写命令都通过 Write 函数追加到文件最后,类似于 MySQL 的 binlog。当 Redis 重启是会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。每当执行服务器(定时)任务或者函数时,flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作:

  • WRITE:根据条件,将 aof_buf 中的缓存写入到 AOF 文件;
  • SAVE:根据条件,调用 fsync 或 fdatasync 函数,将 AOF 文件保存到磁盘中。

image-20210608012457207

RDB 和 AOF 的区别:

  1. AOF 文件比 RDB 更新频率高,优先使用 AOF 还原数据;

  2. AOF比 RDB 更安全也更大;

  3. RDB 性能比 AOF 好;

  4. 如果两个都配了优先加载 AOF。

Redis zset底层实现,跳表查询数据的流程,如何拿到元素的分数值:

Redis 中的有序集合(Sorted Set)使用跳表(Skip List)作为底层实现。

跳表是一种有序的数据结构,类似于多级索引,可以实现快速的查找、插入和删除操作。

在跳表中,每个节点包含一个键值对(元素值和分数值),并且每个节点都包含多个指向下一个节点的指针,这些指针跨越多个级别。

查询数据的流程是从最高级别开始,逐级向下查找,直到找到目标元素或者确定目标元素不存在。

要获取元素的分数值,可以通过指定元素的键值来获取其分数值。

Redis主从复制流程,offset的作用,rdb文件的结构:

Redis 主从复制是指从一个 Redis 服务器(主服务器)复制数据到另一个 Redis 服务器(从服务器)的过程。

主从复制的流程分为三个阶段:

  1. 同步阶段: 从服务器连接到主服务器,并发送同步命令,主服务器开始将数据发送给从服务器。
  2. 复制阶段: 主服务器将数据库中的数据发送给从服务器,从服务器将数据保存到自己的内存中。
  3. 命令传播阶段: 主服务器将接收到的写命令发送给从服务器,从服务器执行相同的写命令,保持主从数据一致。

在主从复制中,offset 是指从服务器在复制过程中已经复制的字节数,用于记录从服务器已经接收到的数据位置,以便在断开连接后可以快速恢复。

RDB 文件是 Redis 数据持久化的一种方式,它保存了 Redis 在某个时间点的数据快照。RDB 文件的结构包括文件头、数据类型、键值对等信息

保证消息顺序性

对于 RabbitMQ 或类似的消息队列系统,可以通过以下方式来保证消息的顺序性:

  • 使用单个队列:将所有相关消息发送到同一个队列,这样就能保证它们按照发送的顺序被消费。
  • 使用单个消费者:在消费端只使用一个消费者来消费消息,这样可以确保消息按顺序被处理。
  • 使用消息序列号:在消息体中添加序列号,消费者在处理消息时按照序列号顺序进行处理。
  • 使用分区键:如果必须使用多个队列或多个消费者,可以根据消息的某个属性(如用户ID)进行分区,保证同一分区内的消息被顺序处理。
  • 11
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

惊雲浅谈天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值