redis性能高的原因:
-
数据存储在内存中,操作内存效率比较高
-
单线程,减少线程间切换的开销
-
支持多种不同数据结构,针对不同业务进行优化
-
支持集群化架构,通过分布式技术提升性能
高并发
提升每次处理最大人数
-
多启动几个服务,增强同时并行处理能力
-
提升处理效率
吞吐量 、qps、tps
吞吐量 : 系统每秒钟能处理请求量
qps : query per second 每秒查询量
tps : teansaction per second 每秒交易量 增删改对数据库有效操作
生产环境使用持久化 :
-
AOF、RDB 都是同时打开
-
RDB频率设置第一点,30分钟执行一次
-
AOF设置为默认每秒写一次磁盘
生产上有时候需要定位redis中哪些key特别大,哪些业务上key value 设置特别多数据 (商品存放了商品详情占了20G空间 )只能使用RDB文件去分析RDB-Tools
rdb-tools教程:
https://www.cnblogs.com/zhoujinyi/p/13276697.html
RDB可以作为主从全量同步的文件 进行使用
redis.4.0之后混合持久化功能 : 定期生成RDB文件,而两次RDB文件直接数据变化记录AOF
主从同步:
-
数据从主节点同步到从节点有两种方式: 全量同步(RDB文件),增量同步(缓冲区内存发送命令)
-
主从同步减少全量同步,增大缓冲区大小(环状数组长度增加)丶 使用主-从-从链式架构减少从主节点到从节点压力
sentinel哨兵
-
监控发送ping命令给master如果发现master在一定是假呢你没有响应,认为当前master主官下线,通过多个哨兵投票票数超过一半(可配置)标记成客观下线,启动故障转移流程
-
故障转移 slaveof no one 给 当前选中slave 发送slaverof 新master给其他节点
-
通知新主从地址信息发送给客户端
cluster集群
1.集群主要解决问题
-
海量数据存放到一个master上,内存和其他资源可能会不足
-
单个master支持不了高并发写入操作,扩展多个master
-
自动故障转移
2.集群采用散列插槽机制完成分片
-
散列插槽主要保证新增和删除master节点尽量减少数据迁移
-
散列插槽一共16384个,添加数据,根据数据crc16值计算属于哪个插槽,找到对应master节点
-
客户端写数据的时候不用考虑当前连接哪个master,多个master之间采用gossip算法互相通讯传递散列插槽信息,自动重定向到准确master
缓存穿透、击穿、雪崩
1.穿透:
当用户访问不存在的redis key,如果使用cache-aside,访问数据库数据但是数据库中也不存在,再把数据写入redis.如果用户一直访问不存在的key,请求全部回落到数据库中,增加数据库压力
解决方案:
-
数据库中如果不存在数据,往redis中存在一个空值"" 设置过期时间,在这段时间内获取到空串返回前端,让前端提示数据不存在,避免访问数据库.无法避免请求模拟不同数据
-
布隆过滤器, 通过分槽将存在数据在槽中打上标记1,数据不存在在槽中默认值为0.当一个数据过来计算hash值找到对应槽,如果槽数据为1,就认为数据在数据库中是存在的,如果为0,数据不存在直接拒绝.
布隆过滤器认为数据存在,不一定存在。
布隆过滤器认为数据不存在,一定不存在.
数据删除不是特别好实现,可以选择不处理,降低命中率.
2.雪崩
放数据到redis时候一般都会设置过期时间,如果所有商品失效时间都一样.导致所有商品都需要从数据库获取,增大数据库压力.
解决方案
将商品设置过期时间假如随机数,让商品不要再同一时间过期
3.击穿
击穿针对的是一个key,失效时由于并发量过大,在key失效过程中,所有请求都向数据库获取数据.
解决方案:
将key在活动期间设置为不失效,同时使用定时任务,定期将数据库中数据同步到redis