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进程优化,主从数据一致性,数据脏读,复制风暴
Logo

助力广东及东莞地区开发者,代码托管、在线学习与竞赛、技术交流与分享、资源共享、职业发展,成为松山湖开发者首选的工作与学习平台

更多推荐