Redis知识点总结(更新中)

研二快要找工作了,自己整理一点常见面试题…
参考书目:《Redis开发与运维》

1.Redis简介

Redis是一种基于键值对(key-value)的NoSQL数据库,使用单线程架构和I/O多路复用模型来实现高性能的内存数据库服务。优点是速度快、基于键值对的数据结构服务器、功能丰富、简单稳定、客户端语言多、持久化、主从复制、支持高可用和分布式。Redis可以做缓存、排行榜系统、计数器应用、社交网络、消息队列系统等。

2. 5种数据结构

  1. String:字符串、整数或者浮点数,适合最简单的k-v存储;
  2. List:列表,可以从两端压入或者弹出元素,适合实现类似粉丝列表、文章评论之类的数据;
  3. Hash:包含键值对的无序列表;
  4. Set:无序集合,可实现交集、并集、差集;
  5. ZSet:有序集合,set的增强版本,增加了一个score参数,自动会根据score的值进行排序。

3.持久化

持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数据恢复。Redis支持RDB和AOF两种持久化机制。
RDB持久化是把当前进程数据生成快照保存到硬盘的过程,按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据快照,适合用于备份和全量复制场景。Redis加载RDB恢复数据远远快于AOF。但是RBD不适合实时持久化。
AOF持久化以独立日志的方式记录每次写明令,重启时再重新执行AOF文件中的命令达到恢复数据的目的。主要作用是解决数据持久化的实时性。

4.事务

Redis提供简单的事务功能,将一组需要一起执行的命令放到mutil和exec两个命令之间。mutil代表事务的开启,exec代表事务结束,它们之间的命令是原子顺序执行的。
Watch命令是一个乐观锁,用于监控一个或多个键,一旦其中有一个键被修改,之后的事务就不会执行。
Discard命令可以清空事务队列,放弃执行事务。

5.复制

全量复制:一般用于初次复制场景,它会把主节点全部数据一次性发送给从节点,当数据量较大时,会对主节点和网络造成很大的开销。
部分复制:用于处理在主从复制中殷网络闪断等原因造成的数据丢失场景,当从节点在此连接上主节点后,如果条件允许,主节点会补发丢失数据给从节点。因为补发的数据远小于全量复制,可以有效避免全量复制的过大开销。

6.哨兵

当主节点出现故障时,Redis Sentinel能自动完成故障发现和转移,并通知应用方,从而实现真正的高可用。
Redis Sentinel是一个分布式架构,其中包含若干个Sentinel节点和Redis数据节点,每个Sentinel节点会对数据节点和其余Sentinel节点进行监控,当它发现节点不可达时,会对节点做下划线标识。如果被标识的是主节点,它还会和其他Sentinel节点进行“协商”,当大多数Sentinel节点都认为主节点不可达时,他们会选出一个Sentinel节点来完成自动故障转移的工作,同时会将这个变化实时通知给Redis应用方。
Redis Sentinel功能:
监控:Sentinel节点会定期检测Redis数据节点、其余Sentinel节点是否可达;
通知:Sentinel节点会将故障转移的结果通知给应用方;
主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系;
配置提供者:在Redis Sentinel结构中,客户端在初始化的时候连接的是Sentinel节点的集合,从中获取主节点信息。

7.集群

Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。集群使用了主从复制模型,每个节点都会有n-1个复制品。
codis是目前用的最多的集群方案。

8.缓存问题

缓存预热:系统启动前,提前将相关的缓存数据直接加载到缓存系统,避免在用户请求的时候先查询数据库,然后再将数据缓存。用户直接查询事先被预热的缓存数据。
缓存雪崩:瞬间过期数据量太大,导致数据库服务器造成压力。
缓存击穿:单个高热数据过期的瞬间,数据访问量较大,未命中Redis后,发起大量对同一数据的数据库访问,导致对数据服务器造成压力。
缓存穿透:缓存和数据库中都没有的数据,导致所有的请求都落到了数据库上,造成数据库短时间内承受大量请求而崩掉。

9.内存回收策略

Redis的内存回收机制主要体现在以下两个方面:
删除到达过期时间的键对象;
内存使用达到maxmemory上限时触发内存溢出控制策略。

1.删除过期键对象
(1)惰性删除:用于当客户端读取带有超时属性的键时,如果已经超过键设置的过期时间,会执行删除操作并返回。
(2)定时任务删除:Redis内部维护一个定时任务,默认每秒运行10次。定时任务中删除过期键逻辑采用了自适应算法,根据键的过期比例、使用的快慢两种速率模式回收键。

2.内存溢出控制策略
(1) noeviction: 默认策略,不会删除任何数据,拒绝所有写入操作并返回客户端错误信息(error) OOM command not allowed when used memory, 此时Redis只响应读操作。
(2) volatile-lru :根据LRU算法删除设置了超时属性( expire)的键,直到腾出
足够空间为止。如果没有可删除的键对象,回退到noeviction策略。
(3) allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。
(4) allkeys-random:随机删除所有键,直到腾出足够空间为止。
(5) volatile-random:随机删除过期键,直到腾出足够空间为止。
(6) volatile-ttl :根据键值对象的ttl属性,删除最近将要过期数据。如果没有,
回退到noeviction策略。

扫描二维码关注公众号,回复: 10310520 查看本文章
发布了2 篇原创文章 · 获赞 1 · 访问量 32

猜你喜欢

转载自blog.csdn.net/weixin_45341772/article/details/105193131