Redis 的特色
- Redis 是目前使用非常广泛的中间件,在于它功能强大,持续改进,经久不衰
- 主要体现在以下几点
- 1 ) 高性能: Redis 的底层是C语言编写的,它的定位是内存型数据库
- 而且 Redis 的作者对操作系统也非常的精通
- 它通讯方式采用了epoll 非阻塞 / IO多路复用的机制,提高了访问性
- 2 ) 线程安全:Redis的操作都是单线程的, 保证了原子操作
- 注意,最新版本都到版本8了,这都多线程的,怎么还单线程呢
- 多线程,其实体现在的是网络协议解析和同步数据上
- 对于它底层内部的核心操作,还是由单线程来完成的
- 这样可以避免在高并发场景下数据不安全的问题
- 3 )功能丰富:比如它的数据结构
- 它的基本数据结构有:String、List、HashSet、SortedSet
- 它的高阶数据结构有:GEO、BitMap、HyperLogLog
- Redis 的数据都是存在内存中的, 但是在某些场景下
- 可能也希望把这些数据给它存储起来, Redis 也提供了对应的持久化机制
- 它有: RDB 持久化、AOF持久化、RDB-AOF混合持久化
- 随着互联网的发展,网民越来越多,如果应用做的非常好
- 并发肯定是需要解决的一个问题,Redis提供了Master/Slave主从模式
- 可以通过这个模式来解决并发的问题, 需要考虑:主节点不能故障
- 由此,我们要解决主节点的一个单点故障的问题
- 可以使用 Sentinel 哨兵机制,通过哨兵监控主节点
- 主节点故障之后,自动的完成主从切换
- 随着我们的项目越来越庞大,数据集越来越多
- 数据存储的一个压力问题也会成为我们的一个核心问题
- 关于数据存储问题,可以通过cluster集群
- 使用分片存储的方式来进行解决
- Redis 在 4.0 的时候,还引入了模块化机制
- 可以让我们自定义实现在项目中的一些个性化需求
- 当然它还有很多的一些功能, 正因为它有这么多的丰富的功能
- 所以, Redis 是能够支撑很多的互联网应用场景的
- 比如: 缓存、分布式锁、队列、集合、GEO、BitMap操作等等
Redis 场景举例
- 我们通过一个美食社交App来举例
1 )业务场景
- 这里有典型的 Redis 使用场景
- 会用到丰富的数据类型
- 还会用到一些新特性,如:多线程IO
- 最终通过微服务和分布式来部署搭建
2 ) 最终架构
- 我们将应用服务化注册制注册中心,然后采用网关统一的进行认证访问
- 我们的重点还是在Redis这里,目标是搭建一个三主三从的 Redis 集群
- 对于Redis的架构升级,我们并不一定要一步到位,我们可以
- 先从单节点开始,再到主从再到哨兵
- 最后才是集群
3 )核心步骤举例
- 3.1 比如按照Java的模式,通过SpringBoot整合Redis 以及 SpringCloud 搭建微服务,也可以选择自己喜欢的编程语言
- 3.2 系统搭建好了,但是响应很慢怎么办?
- 我们采用最合适的数据类型来缓存
- 因为Redis的底层,针对于它的这些不同的数据类型存储的时候会做一个优化处理
- 最后通过查看慢日志,优化BigKey,使用连接池等相关的方式进行优化
- 3.2 缓存异常了,怎么办?
- 使用限流,分布式锁,LUR淘汰算法来解决这方面的问题
- 这里还涉及了缓存区分,缓存穿透,缓存击穿等问题的解决方案
- 3.3 数据丢失不安全,怎么办?
- 数据丢失,数据不安全,数据一致性等等问题
- 可以使用RDB-AOF混合持续化的机制
- 而且在主从模式下,还需要考虑什么时候全量复制
- 什么时候增量复制或部分复制,出现了这个复制风暴之后,怎么解决优化
- 在主从模式下那数据一致性的问题,脏读等等问题
- 3.4 主从复制故障的问题
- 这时候哨兵来救场
- 哨兵监控主节点可以自动完成主从切换
- 哨兵是如何工作的,以及它的底层原理
- 故障如何自动转移的
- 3.5 存储不够用,怎么办?
- 随着项目的发展,最终数据集越来越多
- 肯定是要考虑怎么来更好的去存储我们的数据
- 可以使用集群的分片存储来解决这个问题,包括集群内部的原理
- 集群内部其实也是有哨兵机制的
- 它跟我们单独搭建哨兵,又有什么不同
- 3.6 服务器宕机了,怎么办?
- 集群动态收缩,MOVED/ASK转项
- 故障演示和恢复方案
- 3.7 底层原理是什么?
- 网络底层
- 事务处理
- 持久化原理
- 主从复制原理
- 哨兵机制
- 分片存储原理
- 3.8 涉及的底层算法有哪些?
- Sorted Set 底层
- Bitmap、Geo 算法
- 数据过期淘汰算法
- Leader 选举流程
- 槽位定位算法
- 备份迁移及其算法
- 3.9 性能提升方案
- Key与Value的设计规范
- 避免 BigKey
- 避免耗时操作
- Pipeline管道操作
- 连接池性能优化
- 子进程的开销与优化
- 3.10 故障解决方案
- 数据延迟
- 数据脏读
- 数据抖动
- 数据一致性
- 热点数据存储
- RDB文件损坏
Redis 进阶建议
- 对于小白,先来研究基础语法使用技巧
- 对于了解日常操作的同学,多看底层原理部分的内容
- 比如持久化原理,主从原理, 哨兵监控机制, 集群分片存储等原理
- 对于工作中常用 Redis 的同学, 多看看故障解决方案及性能优化的部分
- 比如慢日志查询,Fork进程优化,主从数据一致性,数据脏读,复制风暴