入门案例测试
/**
* redis集群的入门案例
* jedisCluster 操作整个redis集群,链接redis的所有的节点
*/
@Test
public void testCluster(){
Set<HostAndPort> sets = new HashSet<>();
sets.add(new HostAndPort("192.168.126.129", 7000));
sets.add(new HostAndPort("192.168.126.129", 7001));
sets.add(new HostAndPort("192.168.126.129", 7002));
sets.add(new HostAndPort("192.168.126.129", 7003));
sets.add(new HostAndPort("192.168.126.129", 7004));
sets.add(new HostAndPort("192.168.126.129", 7005));
JedisCluster jedisCluster = new JedisCluster(sets);
jedisCluster.set("cluster", "集群测试");
System.out.println(jedisCluster.get("cluster"));
}
编辑pro配置文件
#添加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
#配置Redis集群
redis.nodes=192.168.126.129:7000,192.168.126.129:7001,192.168.126.129:7002,192.168.126.129:7003,192.168.126.129:7004,192.168.126.129:7005
编辑配置类
@Configuration //标识我是一个配置类
@PropertySource("classpath:/properties/redis.properties")
public class JedisConfig {
@Value("${redis.nodes}")
private String nodes; //node,node,node
@Bean //实例化集群的对象之后交给Spring容器管理
public JedisCluster jedisCluster(){
Set<HostAndPort> set = new HashSet<>();
String[] nodeArray = nodes.split(",");
for(String node : nodeArray){ //host:port
String[] nodeTemp = node.split(":");
String host = nodeTemp[0];
int port = Integer.parseInt(nodeTemp[1]);
HostAndPort hostAndPort = new HostAndPort(host, port);
set.add(hostAndPort);
}
return new JedisCluster(set);
}
}
修改CacheAOP注入对象
Redis持久化策略说明
持久化需求说明
说明:Redis数据都保存在内存中,如果内存断电则导致数据的丢失.为了保证用户的内存数据不丢失,需要开启持久化机制. 什么是持久化: 定期将内存中的数据保存到磁盘中.
Redis中持久化介绍
说明:Redis中的持久化方式主要有2种. 方式1: RDB模式 dump.rdb 默认的持久化方式 方式2: AOF模式 appendonly.aof 默认关闭的需要手动的开启.
RDB模式
说明: RDB模式是Redis中默认的持久化策略. 特点:
RDB模式可以实现定期的持久化,但是可能导致数据丢失.**RDB模式作的是内存数据的快照,**并且后拍摄的快照会覆盖之前的快照.所以持久化文件较小.恢复数据的速度较快. 工作的效率较高.
命令: 用户可以通过命令要求redis进行持久化操作. 1). save 是同步操作 要求redis立即执行持久化操作. 用户可能会陷入阻塞状态. 2). bgsave 是异步操作, 开启单独的线程执行持久化操作. 持久化时不会影响用户的使用. 不能保证立即马上执行.
持久化策略说明: LG: save 900 1 redis在900秒内执行一次set操作时则持久化一次. 用户操作越频繁则持久化的周期越短. 持久化目录: 可以执行持久化文件生成的位置. 持久化文件名称的设定
AOF模式
特点:
AOF模式默认的条件下是关闭状态,需要手动的开启.AOF模式记录的是用户的执行的状态.所以持久化文件占用空间相对较大.恢复数据的速度较慢.所以效率较低.可以保证用户的数据尽可能不丢失.
配置: 1.开启AOF配置 2.AOF模式的持久化策略
appendfsync always 如果用户执行的了一次set操作则持久化一次
appendfsync everysec aof每秒持久化一次
appendfsync no 不主动持久化.
于RDB/AOF模式特点
1.如果用户可以允许少量的数据丢失可以选用RDB模式(快). 2.如果用户不允许数据丢失则选用AOF模式. 3.实际开发过程中一般2种方式都会配置. 一般主机开启RDB模式,从机开启AOF模式.
关于Redis内存优化的说明
背景说明
Redis可以当做内存使用,但是如果一直往里存储不删除数据,则必然导致内存溢出. 想法:如何可以实现内存数据的维护呢? 可以让用户永远都可以存数据.
LRU算法
LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的页面予以淘汰。该算法赋予每个页面一个访问字段,用来记录一个页面自上次被访问以来所经历的时间 t,当须淘汰一个页面时,选择现有页面中其 t 值最大的,即最近最少使用的页面予以淘汰。 维度:时间T LRU算法是当下实现内存清理的最优算法.
LFU算法
LFU(least frequently used (LFU) page-replacement algorithm)。即最不经常使用页置换算法,要求在页置换时置换引用计数最小的页,因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,但以后就不再使用,这类页将会长时间留在内存中,因此可以将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数。 维度: 引用次数
Random算法
TTL算法
说明:监控剩余的存活时间,将存活时间少的数据提前删除.
Redis内存优化策略
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 -> 不会删除数据,如果内存溢出报错返回.
扩展知识
伪静态
伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。 概括: 以.html结尾的"动态页面"脚本技术. (.JSP/.html)
前提:在高并发的条件下由于引入缓存但是可能会引发如下的问题,导致数据库服务器宕机,影响用户的体验.
缓存-穿透
特点: 用户高并发的环境下,访问一个数据库中不存在的数据就叫缓存穿透!!! 解决方案: 限制用户单位时间内的访问次数 , 封禁IP地址. 网关过滤.
缓存-击穿
特点: 某些高频的访问数据由于操作不当导致缓存失效.从而使得大量的用户直接访问数据库. (一个) 解决方案: 配置多级缓存
缓存-雪崩
特点: 由于redis中的高频key在同一时间内大量的失效.导致用户的请求直接访问数据库,导致宕机的风险. (flushAll)
解决方案: 配置多级缓存,设定不同的超时时间.