Redis(1部分)

    Redis 基础

1.什么是 Redis?(快,高并发,功能全)

是一个基于 C 语言开发的开源 NoSQL 数据库,Redis 的数据是保存在内存中的(内存数据库,支持持久化),因此读写速度非常快,被广泛应用于分布式缓存方向。并且,Redis 存储的是 KV 键值对数据。

2.Redis 为什么这么快?

  1. 基于内存的数据存储,内存的访问速度远超硬盘,这是 Redis 读写速度快的根本原因。
  2. 单线程模型,避免了线程切换和锁竞争带来的消耗。
  3. 高效的数据结构,(String)、(List)、(Set)、(Sorted Set)等
  4. IO 多路复⽤,该机制允许内核中同时存在多个监听套接字和已连接套接字,内核会一直监听这些套接字上的连接请求或者数据请求,一旦有请求到达,就会交给 Redis 处理,就实现了所谓的 Redis 单个线程处理多个 IO 读写的请求。

3.Redis 除了做缓存,还能做什么?

        1.分布式锁

        2.排行榜/计数器 :

                可以对 String 进行自增自减运算,从而实现计数器功能。Redis 这种内存型数据库的读写性能非常高,很适合存储频繁读写的计数量。

        3.限流

        4.消息队列:Redis 自带的 List 数据结构可以作为一个简单的队列使用。

        5.延时队列

4.Redis 常用的数据类型

- string:字符串数据类型:String 更适合存储对象数据,尤其是当对象结构简单且整体读写是主要操作时。

- hash:类似于对象,map的形式:需要频繁操作对象的部分字段或节省内存,Hash 可能是更好的选择。

- list:表示一种线性数据结构,队列或栈

- set:无序不可重复集合:文章点赞、动态点赞等等。多个数据源交集、并集和差集的场景:共同好友(交集)、共同粉丝(交集)

- zset:有序不可重复集合

Redis持久化机制详解

RDB(Redis DataBase)持久化和 AOF(Append Only File)持久化。这两种方式可以单独使用,也可以同时使用。

5.什么是 RDB 持久化?

持久化也就是将内存中的数据写入到硬盘中

RDB 持久化通过创建数据集的快照(snapshot)来工作,在指定的时间间隔内将 Redis 在某一时刻的数据状态保存到磁盘的一个 RDB 文件中。

  • Save: 同步保存操作,会阻塞 Redis 主线程;
  • Bgsave: fork 出一个子进程,子进程执行,不会阻塞 Redis 主线程,默认选项。

6.什么是 AOF 持久化?

AOF持久化 通过记录写操作命令,将其追加到 AOF 文件中来工作,恢复时通过重新执行这些命令来重建数据集。AOF 的主要作用是解决了数据持久化的实时性,目前已经是 Redis 持久化的主流方式。

四个步骤:命令写入、文件同步、文件重写、重启加载.

7.RDB 和 AOF 各自有什么优缺点?

RDB 是一个非常紧凑的单文件(二进制文件 dump.rdb),代表了 Redis 在某个时间点上的数据快照。非常适合用于备份数据,比如在夜间进行备份,然后将 RDB 文件复制到远程服务器。但可能会丢失最后一次持久化后的数据。缺点是数据安全性较低。

AOF 的最大优点是灵活,实时性好,可以设置不同的 fsync 策略,如每秒同步一次,每次写入命令就同步,或者完全由操作系统来决定何时同步。但 AOF 文件往往比较大,恢复速度慢,因为它记录了每个写操作。

8.Redis 给缓存数据设置过期时间有什么用?

内存是有限且珍贵的,如果不对缓存数据设置过期时间,那内存占用就会一直增长,最终可能会导致 OOM 问题。通过设置合理的过期时间,Redis 会自动删除暂时不需要的数据,为新的缓存数据腾出空间。

9.Redis 是如何判断数据是否过期的呢?

Redis 通过一个叫做过期字典来保存数据过期的时间。过期字典的键指向 Redis 数据库中的某个 key,过期字典的值是一个 long long 的整数,这个整数保存了 key 所指向的数据库键的过期时间。


Redis 内存管理

10.Redis报内存不足怎么处理?

Redis 内存不足有这么几种处理方式:

  • 修改配置文件的 maxmemory 参数,增加 Redis 可用内存
  • 也可以通过命令 set maxmemory 动态设置内存上限
  • 修改内存淘汰策略,及时释放内存空间
  • 使用 Redis 集群模式,进行横向扩容。

11.大 key 问题了解吗?

大 key 指的是存储了大量数据的键,比如:

  • 单个简单的 key 存储的 value 很大,size 超过 10KB

hash,set,zset,list 中存储过多的元素(以万为单位)

        大 key 会造成什么问题呢?

  • 客户端耗时增加,甚至超时
  • 对大 key 进行 IO 操作时,会严重占用带宽和 CPU
  • 造成 Redis 集群中数据倾斜
  • 主动删除、被动删等,可能会导致阻塞
                如何处理大 key?

                        ①、删除大 key

                        ②、压缩和拆分 key

12.Redis 阻塞?怎么解决?

API 或数据结构使用不合理:慢查询

  1. 发现慢查询: slowlog get{n}命令可以获取最近 的 n 条慢查询命令;
  2. 发现慢查询后,可以从两个方向去优化慢查询: 1)修改为低算法复杂度的命令,如 hgetall 改为 hmget 等,禁用 keys、sort 等命 令 2)调整大对象:缩减大对象数据或把大对象拆分为多个小对象,防止一次命令操作过多的数据。

CPU 饱和的问题:CPU 饱和是指 Redis 单核 CPU 使用率跑到接近 100%。

  1. 判断当前 Redis 并发量是否已经达到极限,可以使用统计命令 redis-cli-h{ip}-p{port}--stat 获取当前 Redis 使用情况
  2. 如果 Redis 的请求几万+,那么大概就是 Redis 的 OPS 已经到了极限,应该做集群化水品扩展来分摊 OPS 压力
  3. 如果只有几百几千,那么就得排查命令和内存的使用

持久化相关的阻塞

13. Redis的过期键的删除策略

过期策略通常有以下三种:
        定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可
以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响
缓存的响应时间和吞吐量。
        惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化 地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而 不会被清除,占用大量内存。
        定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。Redis中同时使用了惰性过期和定期过期两种过期策略。

14. Redis key的过期时间和永久有效分别怎么设置?

expire和persist命令。

15. 我们知道通过expire来设置key 的过期时间,那么对过期的数据怎么处理呢?

1、定时去清理过期的缓存;
2、当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得
到新数据并更新缓存。
两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断
缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。

16. MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都 是热点数据

redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

17. Redis的内存淘汰策略有哪些

Redis的内存淘汰策略是指在Redis的用于缓存的内存不足时,怎么处理需要新写入且需要申请额外空间的数据。
全局的键空间选择性移除
        noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。
        allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。(这
个是最常用的)
        allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。设置过期时间的键空间选择性移除
        volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
        volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。
        volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。
总结
        Redis的内存淘汰策略的选取并不会影响过期的key的处理。内存淘汰策略用于处理内存不足时的需要申请额外空间的数据;过期策略用于处理过期的缓存数据。

18. Redis主要消耗什么物理资源?

内存。

19. Redis的内存用完了会发生什么?

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可

以配置内存淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。

20. Redis如何做内存优化?

        可以好好利用Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。尽可能使用散列表(hashes),散列表里面存储的数 使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应 该把这个用户的所有信息存储到一张散列表里面


21. Redis线程模型

        Redis 基于 Reactor 模式设计开发了一套高效的事件处理模型

22.既然是单线程,那怎么监听大量的客户端连接呢?

        I/O 多路复用技术的使用让 Redis 不需要额外创建多余的线程来监听客户端的大量连接,降低了资源的消耗

文件事件处理器(file event handler)主要是包含 4 个部分:

  • 多个 socket(客户端连接)
  • IO 多路复用程序(支持多个客户端连接的关键)
  • 文件事件分派器(将 socket 关联到相应的事件处理器)
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

23.为什么不使用多线程

  1. 使用单线程模型能带来更好的可维护性,方便开发和调试;
  2. 使用单线程模型也能并发的处理客户端的请求;
  3. Redis 服务中运行的绝大多数操作的性能瓶颈都不是 CPU,主要在内存和网络

事务

24.Redis事务的概念

        Redis事务功能是通过MULTI、EXEC、DISCARD和WATCH 四个原语实现的。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,

25.Redis 事务支持原子性吗?

        Redis 事务在运行错误的情况下,除了执行过程中出现错误的命令外,其他命令都能正常执行。并且,Redis 事务是不支持回滚操作的。因此,Redis 事务其实是不满足原子性的。

26.Redis事务支持隔离性吗

Redis 是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完

所有事务队列中的命令为止。因此,Redis 的事务是总是带有隔离性的。


高可用

Redis 除了单机部署外,还可以通过主从复制、哨兵模式和集群模式来实现高可用。

主从复制(Master-Slave Replication):允许一个 Redis 服务器(主节点)将数据复制到一个或多个 Redis 服务器(从节点)。这种方式可以实现读写分离,适合读多写少的场景。

哨兵模式(Sentinel):用于监控主节点和从节点的状态,实现自动故障转移和系统消息通知。如果主节点发生故障,哨兵可以自动将一个从节点升级为新的主节点,保证系统的可用性。

集群模式(Cluster):Redis 集群通过分片的方式存储数据,每个节点存储数据的一部分,用户请求可以并行处理。集群模式支持自动分区、故障转移,并且可以在不停机的情况下进行节点增加或删除。

28.主从复制了解吗

主从复制(Master-Slave Replication)是指将一台 Redis 服务器的数据,复制到其他的 Redis 服务器。前者称为主节点(master),后者称为从节点(slave)。且数据的复制是单向的,只能由主节点到从节点。主负责写,节点负责读

29.主从复制主要的作用是什么?

①、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

②、故障恢复:如果主节点挂掉了,可以将一个从节点提升为主节点,从而实现故障的快速恢复。

③、负载均衡:主节点提供写服务,由从节点提供读服务,尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高 Redis 服务器的并发量。

④、高可用基石:主从复制还是哨兵和集群能够实施的 基础

30.Redis 主从有几种常见的拓扑结构?

1.一主一从结构

2.一主多从结构

3.树状主从结构

31.Redis 的主从复制原理了解吗?

  1. 保存主节点        (master)信息 这一步只是保存主节点信息,保存主节点的 ip 和 port。
  2. 主从建立连接       从节点(slave)发现新的主节点后,会尝试和主节点建立网络连接。
  3. 发送 ping 命令    连接建立成功后从节点发送 ping 请求进行首次通信,主要是检测主从之间网络套接字是否可用、主节点当前是否可接受处理命令。
  4. 权限验证              如果主节点要求密码验证,从节点必须正确的密码才能通过验证。
  5. 同步数据集          主从复制连接正常通信后,主节点会把持有的数据全部发送给从节点。
  6. 命令持续复制      接下来主节点会持续地把写命令发送给从节点,保证主从数据一致性。

32.主从复制存在哪些问题呢?

主从复制虽好,但也存在一些问题:

  • 一旦主节点出现故障,需要手动将一个从节点晋升为主节点,同时需要修改应用方的主节点地址,还需要命令其他从节点去复制新的主节点,整个过程都需要人工干预。
  • 主节点的写能力受到单机的限制。
  • 主节点的存储能力受到单机的限制。

33.Redis 哨兵了解吗?sentinel

用于监控 Redis 的主从复制,以自动完成故障转移和通知管理员。

34.哨兵的主要功能:

  • 监控(Monitoring): 哨兵 Sentinel 会不断检查主节点和从节点是否正常工作。

  • 通知(Notification): Sentinel 可以向管理员或其他应用程序发送通知,告知 Redis 实例的状态变化。

  • 自动故障转移(Automatic failover):当 Sentinel 检测到主节点不可用时,会自动将一个从节点提升为新的主节点,并让其他从节点开始复制新的主节点。

  • 配置提供者(Configuration provider):如果故障转移发生了,通知 client 客户端新的 master 地址。

35.Redis 哨兵实现原理知道吗?

1.定时监控

2.主观下线和客观下线:主观下线就是哨兵节点认为某个节点有问题,客观下线就是超过一定数量的哨兵节点认为主节点有问题。

3.领导者 Sentinel 节点选举:Redis 使用了 Raft 算法实现领导者选举。

4.故障转移:领导者选举出的 Sentinel 节点负责故障转移

36.哨兵的核心知识

        1.哨兵至少需要 3 个实例,来保证自己的健壮性。

        2.哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。

        3.对于哨兵 + redis 主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练。

37.Sentinel 如何选择出新的 master(选举机制)?

  • 首先排除处于主观下线或客观下线状态的从节点。

  • 然后优先选择复制偏移量最大的从节点,因为它的数据最新。如果有多个从节点复制偏移量相同,则可能根据其他规则进一步选择,如选择运行 ID 较小的从节点。

38.Redis 集群了解吗?

        前面说到了主从存在高可用和分布式的问题,哨兵解决了高可用的问题,而集群就是终极方案,一举解决高可用和分布式问题。

39.为什么需要Redis Cluster?解决了什么问题?

  • 数据存储容量和内存限制问题

    单个Redis实例的内存是有限的,如果数据量不断增长,最终会超出单个实例的内存容量。Redis Cluster通过将数据分片存储在多个节点上,解决了数据存储容量的限制问题。
  • 高可用性和容错性问题

    单一的Redis节点存在单点故障风险,如果该节点出现故障,可能导致整个服务不可用。Redis Cluster通过多个节点组成集群,当部分节点出现故障时,其他节点仍然可以提供服务,提高了系统的高可用性和容错性。

40.有什么优势?

  • 可扩展性:可以方便地添加或删除节点来扩展或收缩集群规模,以适应不同的数据量和负载需求。

  • 高可用性:部分节点故障不会影响整个集群的正常运行,提供了更好的容错能力。

  • 负载均衡:数据均匀地分布在各个节点上,避免了单个节点数据过载的情况。

  • 数据分片:在Cluster模式下,Redis集群可以将数据分散在不同的节点上,从而突破单节点内存限制,实现更大规模的数据存储。

41.Redis Cluster是如何分片的?

  • Redis Cluster使用哈希槽(Hash Slot)来进行分片。

  • 整个哈希空间被划分为16384个哈希槽(0 - 16384)。

  • 当向Redis Cluster中插入一个键(key)时,通过对键进行CRC16算法计算,然后对16384取模,得到该键对应的哈希槽编号,从而确定该键应该存储在哪个节点上。

42.为什么Redis Cluster的哈希槽是16384个?

(1)如果槽位为65536,发送心跳信息的消息头达8k,发送的心跳包过于庞大。

(2)redis的集群主节点数量基本不可能超过1000个。

43.

44.

45.

46.

47.

48.

49.

50.

    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值