兰山区住房和城乡建设局网站,广告品牌设计机构网站织梦模板,wordpress 文章锚点,做资源网站需要什么软件#x1f680; 优质资源分享 #x1f680;
学习路线指引#xff08;点击解锁#xff09;知识定位人群定位#x1f9e1; Python实战微信订餐小程序 #x1f9e1;进阶级本课程是python flask微信小程序的完美结合#xff0c;从项目搭建到腾讯云部署上线#xff0c;打造一… 优质资源分享
学习路线指引点击解锁知识定位人群定位 Python实战微信订餐小程序 进阶级本课程是python flask微信小程序的完美结合从项目搭建到腾讯云部署上线打造一个全栈订餐系统。Python量化交易实战入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
Redis的持久化机制
RDB: Redis DataBase 什么是RDB RDB∶每隔一段时间把内存中的数据写入磁盘的临时文件作为快照恢复的时候把快照文件读进内存。如果宕机重启那么内存里的数据肯定会没有的那么再次启动redis后则会恢复。 备份与恢复 内存备份–磁盘临时文件 临时文件–恢复到内存 RDB优劣势 优势 每隔一段时间备份全量备份灾备简单可以远程传输子进程备份的时候主进程不会有任何io操作不会有写入修改或删除保证备份数据的的完整性相对AOF来说当有更大文件的时候可以快速重启恢复 劣势 发生故障时有可能会丢失最后一次的备份数据子进程所占用的内存比会和父进程一模一样这会造成CPU负担由于定时全量备份是重量级操作所以对于实时备份就无法处理了。 RDB的配置 保存位置可以在redis.conf自定义∶/user/local/redis/working/dump.rdb保存机制∶
save 900 1 # 如果1个缓存更新则15分钟后备份
save 300 10 # 如果10个缓存更新则5分钟后备份
save 60 10000 # 如果10000个缓存更新则1分钟后备份
stop-writes-on-bgsave-error yes∶如果save过程出错则停止写操作no∶ 可能造成数据不一致 rdbcompression yes∶开启rdb压缩模式no∶关闭会节约cpu损耗但是文件会大道理同nginx rdbchecksum yes∶使用CRC64算法校验对rdb进行数据校验有10%性能损耗no∶不校验
总结 RDB适合大量数据的恢复但是数据的完整性和一致性可能会不足
AOF: Append Only File
RDB会丢失最后一次备份的rdb文件但是其实也无所谓其实也可以忽略不计毕竟是缓存丢了就丢了但是如果追求数据的完整性那就的考虑使用AOF了。 AOF特点
以日志的形式来记录用户请求的写操作。读操作不会记录因为写操作才会存存储。文件以追加的形式而不是修改的形式。redis的aof恢复其实就是把追加的文件从开始到结尾读取执行写操作。
优势
AOF更加耐用可以以秒级别为单位备份如果发生问题也只会丢失最后一秒的数据大大增加了可靠性和数据完整性。所以AOF可以每秒备份一次使用fsync操作。以log日志形式追加如果磁盘满了会执行redis-check-aof 工具当数据太大的时候redis可以在后台自动重写aof。当redis继续把日志追加到老的文件中去时重写也是非常安全的不会影响客户端的读写操作。AO日志包含了所有写操作会更加便于redis的解析恢复。
劣势
相同的数据同一份数据AOF比RDB大针对不同的同步机制AOF会比RDB慢因为AOF每秒都会备份做写操作这样相对与RDB来说就略低。 每秒备份fsync没毛病但是如果客户端的每次写入就做一次备份fsync 的话那么redis的性能就会下降。AOF发生过bug就是数据恢复的时候数据不完整这样显得AOF会比较脆弱容易出现bug因为AOF没有RDB那么简单但是呢为了防止bug的产生AOF就不会根据日的指令去重构而是根据当时缓存中存在的数据指令去做重构这样就更加健壮和可靠了。
AOF的配置
# AOF 默认关闭yes可以开启
appendonly no# A0F 的文件名
appendfilename appendonly.aof# no∶不同步
# everySec∶每秒备份推荐使用
# always∶每次操作都会备份安全并且数据完整但是慢性能差
appendfsync everysec# 重写的时候是否要同步no可以保证数据安全
no-appendfsync-on-rewrite no# 重写机制∶避免文件越来越大自动优化压缩指令会fork一个新的进程去完成重写动作新进程里的内存数据会被重写此时旧的aof文件不会被读取使用类似rdb
# 当前A0F文件的大小是上次AOF大小的100% 并且文件体积达到64m满足两者则触发重写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
到底采用RDB还是AOF呢?
如果你能接受一段时间的缓存丢失那么可以使用RDB如果你对实时性的数据比较care那么就用AOF使用RDB和AOF结合一起做持久化RDB做冷备可以在不同时期对不同版本做恢复AOF做热备保证数据仅仅只有1秒的损失。当AOF破损不可用了那么再用RDB恢复这样就做到了两者的相互结合也就是说Redis恢复会先加载AOF如果AOF有问题会再加载RDB这样就达到冷热备份的目的了。
Redis 缓存过期处理与内存淘汰机制
计算机内存有限越大越贵Redis的高并发高性能都是基于内存的用硬盘的话GG。
已过期的key如何处理? 设置了expire的key缓存过期了但是服务器的内存还是会被占用这是因为redis所基于的两种删除策略。 redis有两种策略∶
主动定时删除 定时随机的检查过期的key如果过期则清理删除。每秒检查次数在redis.conf中的hz配置 被动惰性删除 当客户端请求一个已经过期的key的时候那么redis会检查这个key是否过期如果过期了则删除然后返回一个nil。这种策略对cpu比较友好不会有太多的损耗但是内存占用会比较高。
所以虽然key过期了但是只要没有被redis清理那么其实内存还是会被占用着的。
那么如果内存被Redis缓存占用满了咋办? 内存占满了可以使用硬盘来保存但是没意义因为硬盘没有内存快会影响redis性能。所以当内存占用满了以后redis提供了一套缓存淘汰机制∶ ME MORY MANAGEMENT。 maxmemory ∶当内存已使用率到达则开始清理缓存
* noeviction∶旧缓存永不过期新缓存设置不了返回错误
* allkeys-lru∶清除最少用的旧缓存然后保存新的缓存推荐使用
* allkeys-random∶在所有的缓存中随机删除不推荐
* volatie-lru∶在那些设置了expire过期时间的缓存中清除最少用的旧缓存然后保存新的缓存
* volatile-random∶在那些设置了expire过期时间的缓存中随机删除缓存
* volatile-ttl∶在那些设置了expire过期时间的缓存中删除即将过期的
哨兵模式
Master挂了如何保证可用性实现继续读写 什么是哨兵 Sentinel哨兵是用于监控Redis集群中Master状态的工具是 Redis 高可用解决方案哨兵可以监视一个或者多个redis master服务以及这些master服务的所有从服务; 当某个master服务宕机后会把这个master下的某个从服务升级为master来替代已宕机的master继续工作。示例图
配置哨兵监控master 创建并且配置sentinel.conf∶
普通配置
port 26379
pidfile /usr/local/redis/sentinel/redis-sentinel.pid
dir /usr/local/redis/sentinel
daemonize yes
protected-mode no
logfile /usr/local/redis/sentinel/redis-sentinel.1og
核心配置
# 配置哨兵
sentinel monitor mymaster 127.0.0.1 6379 2
#密码
sentinel auth-pass
# master被sentinel认定为失效的间隔时间
sentinel down-after-milliseconds mymaster 30000
# 剩余的slaves重新和新的master做同步的并行个数
sentinel parallel-syncs mymaster 1
# 主备切换的超时时间哨兵要去做故障转移这个时候哨兵也是一个进程如果他没有去执行超过这个时间后会由其他的哨兵来处理
sentinel failover-timeout mymaster 180000
启动哨兵x3 redis-sentinel sentinel.conf
测试
master挂了看slave是否成为mastermaster恢复观察slave状态
结论master挂了以后由于哨兵监控剩余slave会进行选举选举后其中一个成为master当原来的master恢复后他会成为slave。
一般master数据无法同步给slave的方案检查为如下∶
网络通信问题要保证互相ping通内网互通。关闭防火墙对应的端口开放虚拟机中建议永久关闭防火墙云服务器的话需要保证内网互通。统一所有的密码通过逐台检查机器以防某个节点被遗漏。
哨兵信息检查
查看相关信息
# 查看reminis-master下的master节点信息
sentinel master reminis-master# 查看reminis-master下的slaves节点信息
sentinel slaves reminis-master# 查看reminis-master下的哨兵节点信息
sentinel sentinels reminis-master
SpringBoot集成Redis哨兵-配置
配置如下
spring:redis:database: 1 password: reminis sentinel:master: reminis-masternodes: 192.168.32.10:26379,192.168.32.12:26379,192.168.32.13:26379
Redis集群
前面我们一起学习了主从复制以及哨兵他们可以提高读的并发但是单个master容量有限数据达到一定程度会有瓶颈这个时候可以通过水平扩展为多master-slave成为集群。那么这一节开始我们就一起来学习redis-cluster∶他可以支撑多个master-slave支持海量数据实现高可用与高并发。
哨兵模式其实也是一种集群他能够提高读请求的并发但是容错方面可能会有一些问题比如master同步数据给slave的时候这其实是异步复制吧这个时候master挂了那么slave上的数据就没有master新数据同步需要时间的1-2秒的数据会丢失。master恢复并转换成slave后新数据则丢失。
特点
每个节点知道彼此之间的关系也会知道自己的角色当然他们也会知道自己存在于一个集群环境中他们彼此之间可以交互和通信比如ping pong。那么这些关系都会保存到某个配置文件中每个节点都有这个我们在搭建的时候需要做配置的。客户端要和集群建立连接的话只需要和其中一个建立关系就行。某个节点挂了也是通过超过半数的节点来进行的检测客观下线后主从切换和我们之前在哨兵模式中提到的是一个道理。Redis中存在很多的插槽又可以称之为槽节点用于存储数据这个先不管后面再说。
集群容错
构建Redis集群需要至少3个节点作为master以此组成一个高可用的集群此外每个master都需要配备一个slave所以整个集群需要6个节点这也是最经典的Redis集群也可以称之为三主三从容错性更佳。所以在搭建的时候需要有6台虚拟机。请各自准备6台虚拟机可以通过克隆去构建使用单实例的Redis 去克隆即可。
集群也可以在单服务器构建称之为伪集群但是生产环境肯定是真的所以建议用6台。克隆后务必关闭Redis。
构建Redis集群
redis.conf 配置
# 开启集群模式
cluster-enabled yes# 每一个节点需要有一个配置文件需要6份。每个节点处于集群的角色都需要告知其他所有节点彼此知道这个文件用于存储集群模式下的集群状态等信息这个文件是由redis自己维护我们不用管。如果你要重新创建集群那么把这个文件删了就行
cluster-config-file nodes-201.conf # 超时时间超时则认为master宕机随后主备切换
cluster-node-timeout 5000
# 开启AOFappendonly yes
启动6个redis实例
启动6台如果启动过程出错把rdb等文件删除清空
创建集群
####
# 注意1∶如果你使用的是redis3.x版本需要使用redis-trib.rb来构建集群最新版使用C语言来构建了这个要注意
# 注意2∶以下为新版的redis构建方式
##### 创建集群主节点和从节点比例为11-3为主4-6为从1和4.2和5 3和6分别对应为主从关系这也是最经典用的最多的集群模式
redis-cli --cluster create ip1:port1 ip2:port2 ip3:port 3 ip4:port4 ip5:port5 ip6:port6 --cluster-replicas 1
slots槽用于装数据主节点有从节点没有
检查集群信息:redis-cli--cluster check 192.168.25.64:6380
总结
最后让我们来看一下下方的思维导图进行梳理内容
复习
本阶段开篇讲述了分布式相关其实分布式和集群的概念在前期就介绍过了不同的节点做着不同的事就是分布式不同的节点做着相同的事就是集群。那么Redis是NoSql不仅仅是sql功能更强劲可以作为缓存写入内存提供高速访问为数据库做了一道屏障保护数据库把热点数据放入缓存从而提升项目的并发量与吞吐量。介绍完Redis后我们又一起搭建了单机单实例版的Redis需要注意Redis虽然可以在win或mac上搭建但是企业里都是linux所以我们一定要使用linux来搭建和配置。Redis提供命令行客户端工具也就是redis-cli进入命令行后可以进行相应的操作我们讲述了五大数据类型分别为∶stringlisthashset与zset。每个数据类型包含了一些操作指令这些没有必要去死记硬背遇到了就去查一下api,百度一下即可。Redis是单线程的但是他的性能却很高在这里我们讲述了Redis的单线程模型这一点往往在面试过程中会被问到。当单机的Redis安装配置完毕以后我们整合到了项目中结合了SpringBoot优化了首页的轮播图与分类因为这些完全可以放入缓存没有必要去查询数据库。当然对干前期单体阶段的购物车我们结合了redis实现了分布式购物车如此不论用户在任何电脑访问都能看到曾经的购物车数据并且我们也实现了登录后的同步购物车功能。Redis可以实现类似于MQ的发布与订阅是属于生产者与消费者模式但是正所谓专人做专事发布订阅机制没有必要用Redis来实现企业里都是使用的MQ。Redis的持久化机制RDB与AOF这两种模式大家一定要知道他们之间的区别一个是全量备份一个是增量定时各有各的好也有缺点面试过程中会被问到。单机Redis存在单点故障与读并发量的限制所以可以通过主从与哨兵来实现主从解决读写分离并且一主多从能够提升读的并发。哨兵提供监控机制一旦主挂了备则上位成为主如此实现高可用。在Redis中可以设置无磁盘化如果磁盘比较慢可以打开但是一般来说服务器都会采用ssd尤其针对数据存储类的。当key过期了你会发现内存占用率还是很高这是因为redis的机制有被动主动之分。这一点在面试中可能会被问到哟。此外对于内存写满后的kev淘汰机制我们也在这里提到过不同的策略都可以配置。Redis除了单机与哨兵模式外还能搭建集群最经典的还属三主三从搭建完毕后我们还整合了SpringBoot其实由于springboot的yml配置特性大大的减少了配置项如果你使用springmvcxml中的配置会有很多而yml中的配置也就2-3行的事。对于缓存来说我们还需要预防缓存穿透与雪崩穿透的话一般来说只需要针对空值缓存就行过期时间设置5-10分钟这样就流量就不会打在数据库上导致死机宕机。雪崩其实也可以做到提前预防那就是用到过期时间的key时间全部错开此外有些数据可以做永久保存的话那就直接保存好了这样就不会造成大面积的key失效了。最后有一点还需要说的就是当一次请求过来如果查询的key比较多能做到批量就批量如果是循环查询缓存的话一来吞吐量低而来比较low。