当前位置: 首页 > article >正文

Redis: 特色,业务场景举例,底层原理,持续进阶等问题梳理

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

http://www.kler.cn/news/317920.html

相关文章:

  • 基于C#+SQL Server(CS界面)学生选课及成绩查询管理系统
  • sql语法学习:关键点和详细解释
  • 软件开发人员利用Mendix推动GenAI战略
  • Frontiers出版社系列SCISSCI合集
  • Nginx配置负载均衡
  • 2024全国研究生数学建模竞赛(数学建模研赛)ABCDEF题深度建模+全解全析+完整文章
  • 机器翻译之多头注意力(MultiAttentionn)在Seq2Seq的应用
  • 如何使用Spring Cloud Gateway搭建网关系统
  • 怎么录制游戏视频?精选5款游戏录屏软件
  • 电源芯片测试系统如何完成欠压关断/欠压关断滞后?
  • 某花顺爬虫逆向分析
  • Leetcode 543. 124. 二叉树的直径 树形dp C++实现
  • 根据[国家统计局最新行政区规划]数据库代码
  • 研1日记15
  • 快速了解使用路由器
  • openssl-AES-128-CTR加解密char型数组分析
  • 代码随想录算法训练营||二叉树
  • 背景图鼠标放上去切换图片过渡效果
  • PHPMailer低版本用法(实例)
  • 深入解析Linux驱动开发中的I2C时序及I2C高频面试题
  • 前端vue-ref与document.querySelector的对比
  • 2024年9月24日---关于MyBatis框架(3)
  • Linux使用Clash,clash-for-linux
  • OpenCV多通道图像混合(六)
  • 【Linux 从基础到进阶】 QEMU 虚拟化配置与优化
  • OpenAI最新GPT-o1-preview测评
  • 关于事务的一些梳理
  • Springboot+Shiro+Mybatis+mysql实现权限安全认证
  • 深入解析:高性能 SSE 服务器的设计与实现
  • linux中crontab工具详解