redis是一个非关系型数据库 是基于内存的nosql 数据库
    支持 分布式,持久化 键值对存储
    value 支持 字符串,队列 ,哈希,集合,有序集合
    key可以设置过期时间,不设置默认 永不过期
    过期策略
    过期策略有两种 惰性删除和定期删除(一般是一起使用)
    惰性删除
    是key到期之后 不会立即删除,而是下一次访问这个key的时候判断一下,如果已经到 期就删除
    这样的话会有一些key已经到期 没有访问导致一直存储在内存中
    定期删除
    redis默认每隔100ms随机抽取一部分设置了过期时间的key,检查是否过期,过期删 除,
    内存淘汰机制
    当redis内存占用过多,会进行内存淘汰
    会有数种机制可以选择配置,随机删除,随机删除使用少的,删除设置过期时间的
    持久化
    持久化分为两种 RDB 跟AOF redis默认开启RDB 重启数据会恢复,近期的可能会丢失
    RDB:
    将缓存数据已快照的形式保存在磁盘上 二级制文件 恢复快 但是快照时间内的数据会 丢失
    把某一时刻的所有数据快照保存 触发机制 三种 save(同步阻塞) bgsave(子任务,非阻塞)
    AOF:
    将缓存数据的操作命令写入到文件中,日志记录,恢复的时候依次执行命令就可以 文 件比较大
    也有触发机制,每次修改,每秒 ,不同no
    雪崩
    一般大量的请求查询落到缓存上,正常时可以访问的,假如大量的缓存key突然过期失效了,大量的请求直接进入到数据库,导致数据库挂掉,重启后又会被新的请求打死,进而影响所有相关的接口。报错,挂机
    设置key的过期时间随机数,保证不会同一时间失效,设置数据永不过期,有修改更新缓存
    击穿
    跟雪崩有点像,不过雪崩是大量的key失效,从而导致打死数据库,而击穿是单个key失效,请求击穿缓存,持续的大并发落到数据库,就像开了一个洞
    数据永不过期,互斥锁
    穿透
    指的是缓存跟数据库都不存在的数据,但是一直在请求,会导致数据库压力过大,严重还会拖垮数据库
    加上请求数据校验,拦截恶意请求,ip请求限制,或者将不存在的数据存入缓存,空或者什么,过期时间几十秒
    主从复制(主从模式)
    分担压力,进行读写分离,一主多从,mater->slave
    通过配置多台redis服务的配置文件进行主从关联,主服务器数据更新的同时从服务器同步数据,
    在主服务器开启持久化,不然自动重启会导致数据清空
    主从服务器断开连接后会自动重连,数据不准确通过标识 偏移量等参数,同步未同步 数据,保证数据准确性
    全量同步
    一般发生在lasve 的初始化阶段,将master上所有的数据复制一份(6个步骤。。。)基于持久化内存快照实现的,将快照发送到lasve上
    部分同步
    2.8版本以后的,一般主从服务器断掉后,会进行全量同步,但在2.8版本只有,再master增加了同步日志跟同步标识,slave同步的时候会带上标识跟同步位置,断掉后会自动尝试连接,如果标识存在master日志中,就从上次结束的地方开始操作,不存在则全量更新
    增量同步
    初始化后,正常工作时同步,主服务器执行的命令向从服务器发送同样的命令,从服务器执行
    哨兵模式(Sentinel)
    redis主从切换,一般主服务器宕机后,需要手动将一台从服务器切换为主服务器,会造成一段时间的服务不可用,所以使用哨兵
    一种特殊的模式,redis提供了哨兵的命令,一个独立的进程,原理是:哨兵通过发送命令等待redis服务器响应,监控运行多个redis服务器
    使用哨兵后客户端不在直接连接redis服务,而是使用sentinel代理获取redis服务,类似nginx的代理模式,
    作用:
    发送命令,让redis服务器返回监控以及运行,主从都包括
    当哨兵检测到master服务器宕机后,会自动切换salve成master,然后通过发布订阅模式通知其他从服务器修改配置文件,切换主机
    故障切换过程:
    单个哨兵进程可能会出现问题,一般使用多个(最少3个)进行监控,各个哨兵之间还会进行监控当一个哨兵发现主服务器宕机后,不会立即进行故障切换,仅仅是其中一个哨兵人为的(主观下线),当后边的哨兵也发现主服务器不可用时,数量达到一个数值 后,哨兵会进行一次投票,由其中一个哨兵发起,进行故障切换,成功后通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机(客观下线)
    分区/分表
    将一台redis服务 修改配置文件,执行多个实例,多个节点,当key存储的时候,经过处理算法确定存储在某个redis实例中,缓解内存的压力,redis 共有16384个槽位,按照范围可以分配给不同的数据节点,key根据哈希运算算出唯一的槽位,根据槽位找到对应的redis节点,分摊开每个redis服务的压力