1. Redis长久化策略

1.1 什么是长久化

阐明:Redis运行环境在内存中,如果redis服务器敞开,则内存数据将会失落.
需要:如何保留内存数据呢?
解决方案:能够定期将内存数据长久化到磁盘中.

长久化策略规定:
当redis失常运行时,定期的将数据保留到磁盘中,当reis服务器重启时,则依据配置文件中指定的长久化的形式,实现数据的复原.(读取数据,之后复原数据)

1.2 RDB模式

1.2.1RDB模式特点阐明

1).RDB模式是redis默认的策略.2).RDB模式可能定期(工夫距离)长久化.弊病:可能导致数据的失落3).RDB模式 记录的是内存数据的快照.长久化的效率较高.快照只保留最新的记录.

1.2.2 RDB模式命令

1.save命令: 将内存数据长久化到磁盘中 被动地操作 会造成线程的阻塞2.bgsave命令: 将内存数据采纳后盾运行的形式,长久化到文件中.不会造成阻塞3.默认的长久化机制save 900 1      如果在900秒内,执行了1次更新操作,则长久化一次save 300 10     如果在300秒内,执行了10次更新操作,则长久化一次save 60 10000   如果在60秒内,执行了10000次更新操作,则长久化一次

1.2.3 长久化文件配置

1).指定长久化文件

2).指定长久化文件目录

1.3 AOF模式

1.3.1 AOF模式特点

1).AOF模式默认条件下是敞开的.须要手动开启2).AOF模式记录的是用户的操作过程,所以能够实现实时长久化操作.3).AOF模式因为记录的是实时的操作过程,所以长久化文件较大.须要定期维护.

1.3.2 启动AOF模式

阐明:如果一旦开启AOF模式,则以AOF模式为准

1.4 对于长久化操作总结

1.当内存数据容许大量失落时,采纳RDB模式(快)2.当内存数据不容许失落时,采纳AOF模式(定期维护长久化文件)3.个别在工作中采纳RDB+AOF模式独特作用,保证数据的有效性

1.5 面试题

问题:如果小李在公司服务器执行了flushAll命令,问怎么办?
答: 须要找到AOF文件之后,删除flushAll命令 之后重启redis,执行save命令即可

2. 内存优化策略

2.1 为什么须要内存优化

阐明:因为redis在内存中保留数据.如果始终存储,则内存数据必然溢出.所以须要定期维护内存数据的大小.
保护策略:删除旧的不必的数据,保留新的罕用的数据

2.2 LRU算法

LRU是Least Recently Used的缩写,即最近起码应用,是一种罕用的页面置换算法,抉择最近最久未应用的页面予以淘汰。该算法赋予每个页面一个拜访字段,用来记录一个页面自上次被拜访以来所经验的工夫 t,当须淘汰一个页面时,抉择现有页面中其 t 值最大的,即最近起码应用的页面予以淘汰。

计算维度:工夫T
注意事项:LRU算法是迄今为止内存中最好用的数据置换算法

2.3 LFU算法

LFU(least frequently used (LFU) page-replacement algorithm)。即最不常常应用页置换算法,要求在页置换时置换援用计数最小的页,因为常常应用的页应该有一个较大的援用次数。然而有些页在开始时应用次数很多,但当前就不再应用,这类页将会长工夫留在内存中,因而能够将援用计数寄存器定时右移一位,造成指数衰减的均匀应用次数。

维度:应用次数

2.4 随机算法

随机算法.

2.5 TTL算法

依据残余的存活工夫,将马上要超时的数据提前删除.

2.6 配置内存优化策略

1.volatile=lru      在设定了超时工夫的数据中,采纳lru算法2.allkeys-lru       在所有的数据中,采纳lru算法3.volatile-lfu      在设定了超时工夫的数据中,采纳lfu算法4.allkeys-lfu       所有数据采纳lfu算法5.volatile-random   设置超时工夫数据的随机算法6.allkeys-random    所有数据的随机7.volatile-ttl      将设定了超时工夫的数据,提前删除8.noeviction        默认规定,如果设定了noeviction则不删除数据,间接报错返回

手动批改redis内存优化策略:

3. 对于缓存面试问题

问题出发点:
因为缓存生效,导致大量的用户的申请,间接拜访数据库服务器,导致负载过高,从而应发整体宕机的危险!!

3.1 缓存穿透

阐明:用户频繁拜访数据库中不存在的数据时,可能呈现缓存穿透的景象,如果该操作是高并发操作.则可能间接威逼数据库服务器

解决方案:    1.采纳IP限流的形式 升高用户拜访服务器次数. IP动静代理(一分钟变一次)    2.微服务的解决形式:利用断路器返回执行的业务数据即可,不执行数据库操作,从而爱护了数据库    3.微服务解决形式:API网关设计.不容许做非法操作

3.2 缓存击穿

阐明:因为redis中某个热点数据因为超时/删除等操作造成数据生效.同时用户高并发拜访该数据,则可能导致数据库宕机.该操作称之为 缓存击穿

解决方案:能够采纳多级缓存的设计.同时数据超时工夫采纳随机数的形式

3.3 缓存雪崩

阐明:因为redis内存数据大量生效.导致用户的拜访命中率太低.大量的用户间接拜访数据库,可能导致数据库服务器宕机.这种景象称之为缓存雪崩

解决:    1.采纳多级缓存    2.设定不同的超时工夫    3.禁止直行flushAll等敏感操作

4. Redis分片机制

阐明:如果须要Redis存储海量的内存数据,应用单台redis不能满足用户的需要,所以能够采纳Redis分片机制实现数据存储.

注意事项    如果有多台redis,则其中的数据都是不一样的…

4.2 Redis部署

端口:6379/6380/6381

4.2.1 筹备配置文件

6379.conf 6380.conf 6381.conf

4.2.2 批改端口号

只批改80/81的端口号即可

4.3 Redis分片测试

@Test    public void testShards(){        List<JedisShardInfo> shards = new ArrayList<>();        shards.add(new JedisShardInfo("192.168.126.129", 6379));        shards.add(new JedisShardInfo("192.168.126.129", 6380));        shards.add(new JedisShardInfo("192.168.126.129", 6381));        ShardedJedis shardedJedis = new ShardedJedis(shards);        shardedJedis.set("shards", "redis分片操作!!!");        System.out.println(shardedJedis.get("shards"));    }

4.4 一致性HASH算法

4.4.1 概念

一致性哈希算法在1997年由麻省理工学院提出,是一种非凡的哈希算法,目标是解决分布式缓存的问题。 在移除或者增加一个服务器时,可能尽可能小地扭转已存在的服务申请与解决申请服务器之间的映射关系。一致性哈希解决了简略哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动静伸缩等问题 。

4.4.2 原理阐明

常识温习:
1.惯例hash由多少位16进制数组成? 8位16进制数 232次方
2.如果对雷同的数据进行hash计算是否雷同? 后果必然雷同

4.4.3 个性一平衡性

①平衡性是指hash的后果应该平均分配到各个节点,这样从算法上解决了负载平衡问题.
实现平衡性的计划:引入虚构节点

4.4.3 个性二枯燥性

②枯燥性是指在新增或者删减节点时,不影响零碎失常运行
特点:在进行数据迁徙时,要求尽可能小的扭转数据

4.4.4 个性三分散性

③分散性是指数据应该扩散地寄存在分布式集群中的各个节点(节点本人能够有备份),不用每个节点都存储所有的数据.
俗语:鸡蛋不要放到一个篮子里

4.5 SpringBoot整合Redis分片

4.5.1 编辑propertiers配置文件

# 配置单台redis服务器#redis.host=192.168.126.129#redis.port=6379##配置redis分片redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381

4.5.2 编辑配置类

package com.jt.config;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import redis.clients.jedis.JedisShardInfo;import redis.clients.jedis.ShardedJedis;import java.util.ArrayList;import java.util.List;@Configuration //标识我是配置类@PropertySource("classpath:/properties/redis.properties")public class RedisConfig {    /** * SpringBoot整合Redis分片,本质:ShardedJedis对象,交给容器治理 */ @Value("${redis.nodes}")    private String nodes;   //node,node,node @Bean public ShardedJedis shardedJedis(){        List<JedisShardInfo> shards = new ArrayList<>();        String[] nodeArray = nodes.split(",");        for(String node : nodeArray){ //node=ip:port String host = node.split(":")[0];            int port = Integer.parseInt(node.split(":")[1]);            //筹备分片节点信息 JedisShardInfo info = new JedisShardInfo(host,port);            shards.add(info);        }        return new ShardedJedis(shards);    }   /* @Value("${redis.host}") private String host; @Value("${redis.port}") private Integer port; @Bean public Jedis jedis(){ return new Jedis(host,port); }*/}

4.5.3 批改AOP缓存注入

阐明:将AOP中的注入对象切换为分片对象

5 Redis哨兵机制

5.1 分片机制存在的问题

阐明:redis分片次要的作用是实现内存数据的扩容.然而如果redis分片中有一个节点宕机,则间接影响所有节点的运行,是否优化?
实现策略: 采纳Redis哨兵机制实现Redis节点高可用

5.2 Redis节点主从配置

5.2.1 筹备主从节点

阐明:敞开redis分片的节点,之后复制配置文件筹备哨兵的配置

2).复制分片的目录 改名为sentinel

3).删除多余的长久化文件,保留redis配置文件

4).启动3台Redis服务器

5.2.2 实现Redis主从

命令: info replication 查看redis节点的状态信息

节点划分: 6379当主机 6380/81 当从机

命令二:实现主从挂载 slaveof host port

3).查看6379的状态

论断:redis所有节点都能够互相通信,并且门路以后的主从状态

数据主从同步的状态

5.3 哨兵机制工作原理

1).当哨兵启动时,会连贯redis主节点,同时获取所有节点的状态信息
2).当哨兵间断3次通过心跳检测(PING-PONG),如果发现主机宕机,则开始选举.
3).哨兵外部通过随机算法筛选一台丛集入选新的主句,其余的节点应该入选新主机的从

5.4 哨兵机制配置

5.4.1 敞开保护模式

5.4.2 开启后盾运行

5.4.3 配置投票机制

5.4.4 批改投票工夫

主机宕机3秒之后开始选举

5.5 哨兵高可用测试

1).启动哨兵 redis-sentinel sentinel.conf

2).查看哨兵配置

3)将主机宕机,之后查看从机是否入选主机

4).启动之前的主机,查看是否入选新主机的从

5).如果搭建异样 则删除重做
敞开所有redis服务器.