https://www.bilibili.com/video/BV1LQ4y127n4?p=153
1、保证mysql与redis数据一致性?
双清缓存、
2、什么情况下会出现不一致性,如何避免
高并发:redis抖动
jvm时间差(失效瞬间的多线程读写)
3、redis扩容(集群与主从的优缺点)
集群:能横向扩展(>=3台,费用高)稳定性强,理论上没有负载瓶颈
主从:只能纵向扩展(2台机器即可),有上限(主库即为负载上限)一旦阻塞(keys),其他请求全部排队
4、redis性能问题(瓶颈)
5、为啥单线程快?
内存调用,优秀的数据结构:hash表、跳表,多路复用机制:IO多路复用指一个线程处理多个IO流,linux的select和epoll机制(一个线程肩痛不同事件:读、写、链接等事件,放在不同的处理函数中,redis只做了监听事件和调用不同函数),调用函数是和linux的回调机制完成:select、epoll机制一旦检测到相应套接字是否请求到达,从而触发对应事件
单线程指的是网络处理,读写操作是单线程的
5、生成分布式唯一id
单机版:
集群版:采用步长(默认5,可根据集群个数算)
缺点,依赖redis集群(高科用会被限制)
雪花算法:Twitter分布式自增id算法snowflake
优化多机器时钟不一致导致的id重复的优化方案
类似es分片机制
redis插槽机制://TODO
redis持久化:
RDB持久化:其实就是通过生成备份/快照文件 (执行save命令:主线程执行,redis单线程,bgsave:子线程后台运行)退出后自动保存|也可以配置定时执行,save 60 10 (60秒内被修改10次)
bgsave原理(主进程操作虚拟内存[页表],操作系统根据映射关系修改/读取内存):通过拷贝页表实现内存读取
AOF持久化:
追加文件(类似binlog)将执行命令,来恢复数据
AOF(记录过程)比RDB(记录最终结果)大很多,可通过bgrewriteaof(重写命令,实现命令缩减和压缩)
更消耗IO,数据更安全
slaveof指定主从
1、第一次从找主要:rdb文件同步
第二次将repl_baklog(增量数据) 同步给从
通过replicationId确定是否第一次同步,
offset:偏移量,记录当前同步进度
全量同步优化:
1、设置无磁盘复制,通过网络复制
2、redis单节点内存占用不要太大,减少rdb过多IO
3、提高repl_backlog大小(减少导致宕机后同步数据被覆盖)
4、
主从同步全量条件:1、第一次,2、宕机较旧repl_backlog被重写
散裂插槽:数据与插槽绑定(key进行hash % 16384=卡槽) 通过{}将同一业务进行分配同一插槽
16384=2k=2*8*1024
(例:设置redis.setnx的缓存通知指定过期时间),同时后台检查锁,进行续期(30秒到15秒时,进行续期到30秒),采用版本号:解决delete 操作的是否自己当初设置的key