体育直播网站开发数据源获取,怎么把产品快速宣传并推广,郑州企业服务公司,网页搭建流程一、为什么要使用Redis
缓解数据库访问压力mysql读请求进行磁盘I/O速度慢#xff0c;给数据库加Redis缓存#xff08;参考CPU缓存#xff09;#xff0c;将数据缓存在内存中#xff0c;省略了I/O操作
二、Redis数据管理
2.1 redis数据的删除
定时删除惰性删除内存淘汰…一、为什么要使用Redis
缓解数据库访问压力mysql读请求进行磁盘I/O速度慢给数据库加Redis缓存参考CPU缓存将数据缓存在内存中省略了I/O操作
二、Redis数据管理
2.1 redis数据的删除
定时删除惰性删除内存淘汰 问题1内存也是有空间限制的 方案1加超时时间 问题2超时数据量大无法一次性删除 方案2随机算法删除惰性删除 问题3有些超时数据运气好一直没有被随机匹配到 方案3在查询时判断是否过期确认为过期的数据被动式触发删除 问题4没有被随机删除也没有被查询的数据越来越多 方案4内存淘汰策略
2.2 特殊缓存处理
缓存穿透查询不存在的数据
方案缓存空结果null过期时间
缓存雪崩大量缓存同时失效大量不同的请求打到数据库
方案原有失效时间上增加随机值即过期时间均匀分布热点数据永不过期
缓存击穿超高并发访问一个正好失效的Key大量相同的请求打到数据库
方案加锁用户出现大并发访问的时候在查询缓存的时候和查询数据库的过程加锁只能第一个进来的请求进行执行当第一个请求把该数据放进缓存中接下来的访问就会直接集中缓存 热点数据永不过期不设置热点key的失效时间
2.3 热点key
热key在极短的时间内访问频次非常高的key
2.3.1 如何定位热点key
提前预测
凭业务经验
实时收集
独立的热key检测系统将该SDK引入到应用系统客户端收集Redis服务器有专门的客户端工具SDKRedisson可以对其进行改写封装理解二次开发缺点代码有入侵性维护成本高存在语言异构和版本升级问题在发送请求前进行收集采集并上报到统一的服务进行聚合计算。代理层收集如果Redis的请求都经过代理的话考虑改写proxy代码收集Redis定时扫描使用Redis的自带命令-Hotkeys参数Redis节点抓包通过tcpdump抓取一段时间内的流量并上报然后由一个外部的程序去解析并计算缺点流量高时抓包数据量过大负担大
2.3.2 解决方案 本地缓存guava cache或caffeine 发现热点key后将其加载到JVM中不用到DB或Redis中查询 理解 1 请求访问热点key先经过负载均衡器到达Nginx集群 2 再由Nginx通过负载均衡到达应用网关 3 网关转发到后端微服务 4 准备热key检测系统 1 管理后台dashboard管理热key的规则如userId活动id以及可视化。2 注册中心管理分布式服务集群。3 实时计算程序根据前端传来的key。4 SDK用于接入外部系统。由注册中心将这4块进行连接互通 5 计算得到的热key通过SDK传入系统并写入本地缓存 6 请求访问本地缓存如果存在热点key则读取Redis并写入本地缓存 7 此时前端再次访问时就可以直接从本地缓存拿到数据 冗余存储备份key 设计思想将热key分成不同的小key比如key拼接节点ID存储在不同的Redis节点上降低数据的倾斜通过小key分流分散请求到Redis节点 将热点key拼接节点ID去当前访问的Redis判断是否有值如果没有则读取数据库存入Redis并返回数据 限流熔断兜底方案 限流Nginx-集成lua脚本插件、网关、微服务-hystrix或sentinel对服务接口限流
三、Redis为什么这么快
Redis基于内存内存的访问速度是磁盘的上千倍Redis内置了多种优化后的数据结构实现性能高Redis基于reactor模式开发了一套高效的事件处理模型单线程事件循环IO多路复用类似netty网络通信
四、Redis的备份机制
Redis数据持久化
RDB在指定的时间间隔内生成数据集的时间点快照理解数据备份不同时间段的数据都放在一个RDB文件中 问题数据丢失。如果 Redis 宕机那么服务器将丢失最近写入、且仍未保存到快照中的那些数据。AOFappend-only file追加操作的文件记录服务器执行的所有写操作命令理解参考了MySQL的Binlog日志命令会暂存在Redis的aof_buf中从缓存中写入AOF。 在服务器启动时通过重新执行这些命令来还原数据集 问题1命令多 方案1指令合并 问题2耗时间 方案2fork出子进程进行处理指令合并 问题3子进程在重写期间如果进行了数据修改就会出现数据不一致 方案3aof_rewrite_buf从fork子进程起后面写入的命令也copy到重写缓存区等子线程重写结束将重写缓存区的命令写入AOF
五、Redis主从同步
主节点负责写从节点负责读当从节点宕机时主节点发送RDB文件给从节点进行数据同步为了进行快速同步主节点中设置缓存区并设置复制偏移量目的确认缺失的信息范围
六、Redis哨兵机制 解决主节点宕机问题实现高可用
sentinel哨兵负责统筹协调监控主节点定时去确认其响应能力哨兵集群规定数量认定主节点客观下线故障转移选择新的主节点规则复制偏移量最大的节点主节点进行数据同步将原主节点改为从节点
七、Redis集群 加入集群需要和其中一个RedisIP端口建立联系类似TCP三次握手Redis原集群内部进行同步确认 数据存储任务分配槽位slot类似哈希表内存空间大的占更多的槽位。 信息同步redis节点之间要同步自己所负责的槽位信息 问题1数据量大 方案1每个槽位用1bit表示自己负责的为1不负责的为0 问题2定位节点麻烦 方案2用一个超大的数组存储每个槽位空间换时间
struct clusterNode *slots[16384/8];集群工作确认请求的位置是不是自己负责如果不是则返回一个moved错误给请求端同时发出对应的负责节点的IP和端口