Redis: 高性能-非关系型数据库
(一)基础
1.数据结构 - 键值对
基本类型:String List HashMap Set ZSet
高级类型:BitMap Stream 布隆过滤器...
小总结:
读写速度非常快(数据存储在内存中,读10w/s 写8w/s,目前已知的最快k-v数据库)
分布式锁
支持事务、持久化、多种集群、LUA脚本、LRU驱动事件
优点:
1.读写性能优异
2.数据结构丰富
3.支持持久化
4.支持事务
5.支持主从复制
缺点:
1.容量受物理内存的限制
2.不具备自动容错和恢复功能
3.主机宕机,从机未同步数据,切换IP后引入数据不一致的问题,降低了系统的可用性
4.较难支持在线扩容
(二)提升
1.为什么要用缓存?为什么要用Redis
现状:读多写少,从磁盘数据库读取相对慢
缓存/Redis 将数据放在内存中,服务直接读取内存中的数据,速度明显快,高性能。
并且在高并发情况下极大的减少数据库的压力
【关键字】 内存 - 高性能,高并发
2.使用缓存的考虑:常用(命中率高)/主要数据/数据不宜过大
3.使用缓存会出现什么问题
3.1 缓存雪崩问题(数据失效/Redis挂掉)
3.1.1 事发前:实现Redis的高可用,避免挂
3.1.2 事发中:设置本地缓存+限流
3.1.3 事发后:Redis持久化,重启后自动加载恢复缓存数据
3.2 缓存穿透问题(大量不命中缓存而走数据库)
3.2.1 使用布隆过滤器提前拦截
3.2.2 将不存在的数据存在缓存中,设置较短过期时间
3.3 缓存和数据库双写一致性问题(更新不同步)
3.3.1 利用消息队列实现消息最终一致性的保证,加重试和宕机提醒机制
4. Redis为什么这么快
4.1 纯内存操作
4.2 单线程,无锁竞争
4.3 多路 I/O复用模型,非阻塞
4.4 高效的数据结构,加上底层做了大量优化
(三)数据结构:内部使用RedisObject表示所有对象,不同的数据类型对应不同的编码方式
1. String
SDS 相比于 C 的优化:记录字符长度,自动扩展空间,二进制保存(不过滤和限制)
******************** 难啃部分,待续 ********************
(四)持久化:防止突然宕机
1.持久化过程:
1.1 客户端向数据库发送写命令 - 数据在客户端内存中
1.2 数据库接收客户端的写请求 - 数据在服务器内存
1.3 数据库调用系统API将数据写入磁盘 - 数据在内核缓冲区
1.4 操作系统将写缓存区传输到磁盘控制器 - 数据在磁盘缓存中
1.5 操作系统的磁盘控制器将数据写入实际的物理媒介 - 磁盘
生产环境一般一秒强制fsync 一次,Linux默认30s
2.持久化方式
方式一: RDB快照
方式二:AOF
方式三:混合
******************** 待深入了解 ********************
(五)集群 (主从复制)
主节点写,从节点读
实际上是一种数据冗余方式,可用于故障恢复,从节点可以负载均衡,具备高可用性
哨兵模式:不保存任何数据,监控主从节点运作状态,主节点发生故障可从从节点选举出主节点
新节点选举机制:两轮淘汰制
1.标为主观下线、已断线、最后一次回复PING命令时长>5s -->淘汰
2.与失效主节点连接断开时间超过down-after选项指定时间的十倍 -->淘汰
3.复制偏移量最大 > 最小运行ID