参考资料
GitHub - CyC2018/CS-Notes: 技术面试必备基础知识、Leetcode、计算机操作系统、计算机网络、系统设计https://github.com/CyC2018/CS-Notes帅地玩编程-校招|面试|学习路线,你都可以在这里找到 (iamshuaidi.com)https://www.iamshuaidi.com/#%E5%A4%A7%E5%8E%82%E9%9D%A2%E7%BB%8F(%E6%8C%89%E5%85%AC%E5%8F%B8%E5%88%86%E7%B1%BB)2021年Redis面试题(持续更新)_GEEK-BANANA-CSDN博客_redis面试题2021https://blog.csdn.net/qq1515312832/article/details/113880849?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164230194016780271914613%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164230194016780271914613&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-2-113880849.pc_search_insert_ulrmf&utm_term=redis%E9%9D%A2%E8%AF%95%E9%A2%98&spm=1018.2226.3001.4187Redis面试题(2020最新版)_ThinkWon的博客-CSDN博客_redis面试题https://blog.csdn.net/ThinkWon/article/details/103522351?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164230194016780271914613%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=164230194016780271914613&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-3-103522351.pc_search_insert_ulrmf&utm_term=redis%E9%9D%A2%E8%AF%95%E9%A2%98&spm=1018.2226.3001.4187
数据类型:
数据类型 | 可以存储的值 | 操作 |
---|---|---|
STRING | 字符串、整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行操作</br> 对整数和浮点数执行自增或者自减操作 |
LIST | 列表 | 从两端压入或者弹出元素 </br> 对单个或者多个元素进行修剪,</br> 只保留一个范围内的元素 |
SET | 无序集合 | 添加、获取、移除单个元素</br> 检查一个元素是否存在于集合中</br> 计算交集、并集、差集</br> 从集合里面随机获取元素 |
HASH | 包含键值对的无序散列表 | 添加、获取、移除单个键值对</br> 获取所有键值对</br> 检查某个键是否存在 |
ZSET | 有序集合 | 添加、获取、删除元素</br> 根据分值范围或者成员来获取元素</br> 计算一个键的排名 |
REDIS的使用场景
-
计数器:利用redis中原子性的自增操作,可以统计类似用户点赞、用户访问数等。
-
缓存:减轻mysql的查询压力,提升系统性能
-
排行榜:利用redis的有序集合实现
-
消息队列:List是要给双向链表
-
会话缓存
Redis和Memcached的区别
Redis | Memcached | |
数据类型 | 支持多种数据类型 | 仅支持字符串类型 |
数据持久化 | 支持RDB和AOF日志 | 不支持持久化 |
分布式 | 实现分布式支持 | 不支持分布式,只能通过客户端使用一致性哈希来实现分布式存储 |
内存管理机制 | 在 Redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘,而 Memcached 的数据则会一直在内存中。 | Memcached 将内存分割成特定长度的块来存储数据,以完全解决内存碎片的问题。但是这种方式会使得内存的利用率不高,例如块的大小为 128 bytes,只存储 100 bytes 的数据,那么剩下的 28 bytes 就浪费掉了。 |
Redis持久化
RDB
RDB持久化通过创建快照(压缩的二进制文件)的方式进行持久化,保存某个时间点的全量数据。RDB持久化是Redis默认的持久化方式。RDB持久化的出发包括手动触发和自动触发两种方式。
优点:
- 只有一个文件dump.rdb,方便持久化
- 容灾性好,一个文件可以保存到安全的磁盘
- 性能最大化,fork子进程来完成写操作,让主进程继续处理命令
- 型对于数据集大的时候,比AOF启动效率更高
缺点:
- 数据安全性低。RDB是间隔一段时间进行持久化,如果持久化之间redis发生故障,会导致数据丢失
AOF
AOF持久化记录所有变更数据库状态的指令,以append的形式追加保存到AOF文件中。在服务器下次启动的时候,就可以通过载入和执行AOF文件中保存的命令,还原服务器的数据库状态。
优点:
- 数据安全,AOF持久化可以配置appednsync属性为always,每进行一次命令操作就记录到aof文件中。
- 通过append模式写文件,即使是中途服务器宕机,可以通过redis-check-aof工具解决数据一致性问题
- AOF机制的rewrite模式。AOF文件没有被rewrite之前, 可以删除其中某些命令
缺点:
- AOF文件比RDB文件大,且回复速度慢
- 数据量大的时候,启动效率低
事件
Redis服务器是一个事件驱动程序
文件事件
服务器通过套接字与客户端或者其他服务器进行通信,文件事件就是对套接字操作的抽象。
Redis基于Reactor模式开发了自己的网络事件处理器,使用I/O多路复用程序来同时监听多个套接字,并将到达的事件传给文件事件分派器,分派器会根据套接字产生的发实践类型调用相应的事件处理器。
时间事件
服务器有一些操作需要在给定时间点执行,时间事件是对这类定时操作的抽象
时间事件分为
- 定时事件:是让一段程序在指定的时间内执行一次
- 周期性事件,是让一段程序每隔一段时间执行一次
Redis 将所有时间事件都放在一个无序链表中,通过遍历整个链表查找出已到达的时间事件,并调用相应的事件处理器。
哨兵模式
哨兵是 redis 集群机构中非常重要的一个组件,主要有以下功能:
- 集群监控:负责监控 redis master 和 slave 进程是否正常工作。
- 消息通知:如果某个 redis 实例有故障,那么哨兵负责发送消息作为报警通知给管理员。
- 故障转移:如果 master node 挂掉了,会自动转移到 slave node 上。
- 配置中心:如果故障转移发生了,通知 client 客户端新的 master 地址。
哨兵用于实现 redis 集群的高可用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作。
- 故障转移时,判断一个 master node 是否宕机了,需要大部分的哨兵都同意才行,涉及到了分布式选举的问题。
- 即使部分哨兵节点挂掉了,哨兵集群还是能正常工作的,因为如果一个作为高可用机制重要组成部分的故障转移系统本身是单点的,那就很坑爹了。
哨兵的核心知识
- 哨兵至少需要 3 个实例,来保证自己的健壮性。
- 哨兵 + redis 主从的部署架构,是不保证数据零丢失的,只能保证 redis 集群的高可用性。
- 对于哨兵 + redis 主从这种复杂的部署架构,尽量在测试环境和生产环境,都进行充足的测试和演练