1
关闭服务 开启集群
服务都无一开好了
今日任务 整合集群在Springboot中
redis集群的说明
redis数据存储的原理
说明: RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]%16384)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据**.根据主节点的个数,均衡划分区间.**
算法:哈希函数: Hash()=CRC16[key]%16384
当向redis集群中插入数据时,首先将key进行计算.之后将计算结果匹配到具体的某一个槽的区间内,之后再将数据set到管理该槽的节点中.
槽位问题 9.56前
Spring整合Redis集群
配置文件
配置类
aop修改
自我实现
配置文件
配置类
AOP修改注入
package com.jt.aop;
import com.jt.anno.CacheFind;
import com.jt.util.ObjectMapperUtil;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.JedisCluster;
import java.util.Arrays;
@Component //将对象交给spring容器管理
@Aspect //标识我是一个切面
public class CacheAOP {
//1.注入缓存redis对象
@Autowired
//private Jedis jedis;
//private ShardedJedis jedis;
private JedisCluster jedis;
/**
* 要求: 拦截注解方法
* 打印:
* 1.打印目标对象的类型
* 2.打印方法的参数
* 3.获取目标对象的名称及方法的名称
* @param joinPoint
*/
@Before("@annotation(com.jt.anno.CacheFind)")
public void before(JoinPoint joinPoint){
Object target = joinPoint.getTarget(); //获取目标对象
Object[] args = joinPoint.getArgs(); //获取方法参数的
String targetName =
joinPoint.getSignature().getDeclaringTypeName(); //获取目标对象的名称
//获取目标对象的类型
Class targetClass = joinPoint.getSignature().getDeclaringType();
//获取目标方法的名称
String methodName = joinPoint.getSignature().getName();
System.out.println(target);
System.out.println(args);
System.out.println(targetName);
System.out.println(targetClass);
System.out.println(methodName);
}
/**
* 拦截@CacheFind注解标识的方法.
* 通知选择: 缓存的实现应该选用环绕通知
* 步骤:
* 1.动态生成key 用户填写的key+用户提交的参数
*/
@Around("@annotation(cacheFind)")
public Object around(ProceedingJoinPoint joinPoint,CacheFind cacheFind){
//1.如何获取用户在注解中填写的内容呢??? 如何获取注解对象....
String key = cacheFind.key(); //前缀 ITEM_CAT_PARENTID
//2.如何获取目标对象的参数呢???
Object[] array = joinPoint.getArgs();
key += "::"+Arrays.toString(array); // "ITEM_CAT_PARENTID::[0]"
//3.从redis中获取数据
Object result = null;
if(jedis.exists(key)){
//需要获取json数据之后,直接转化为对象返回!!
String json = jedis.get(key);
//如何获取返回值类型
MethodSignature methodSignature =
(MethodSignature) joinPoint.getSignature();
Class targetClass = methodSignature.getReturnType();
result = ObjectMapperUtil.toObject(json,targetClass);
System.out.println("AOP实现缓存的查询!!!");
}else{
//key不存在,应该查询数据库
try {
result = joinPoint.proceed(); //执行目标方法,获取返回值结果
String json = ObjectMapperUtil.toJSON(result);
if(cacheFind.seconds()>0){ //判断是否需要超时时间
jedis.setex(key, cacheFind.seconds(), json);
}else{
jedis.set(key,json);
}
System.out.println("AOP执行数据库操作!!!");
} catch (Throwable throwable) {
throwable.printStackTrace();
throw new RuntimeException(throwable);
}
}
// return null;
return result;
}
/**
* AOP = 切入点表达式 + 通知方法.
*
* 拦截需求:
* 1.要求拦截itemCatServiceImpl的bean
* 2.拦截com.jt.service下的所有的类
* 3.拦截com.jt.service下的所有类及方法
* 3.1拦截com.jt.service的所有的类.返回值为int类型的.并且add开头
* 的方法.并且参数一个 为String类型
*/
//@Pointcut(value = "bean(itemCatServiceImpl)")
//@Pointcut("within(com.jt.service..*)")
//拦截com.jt.service下的所有类的所有方法的任意参数类型
//@Pointcut("execution(int com.jt.service..*.add*(String))")
/* @Pointcut("execution(int com.jt.service..*.add*(String))")
public void pointcut(){
}
//定义前置通知
@Before("pointcut()")
public void before(){
System.out.println("我是前置通知");
}*/
}
效果实现
第二次
Redis持久化策略说明
RDB模式
l
删除持久化文件之后 就没有数据了
**
持久化策略说明
**
vim redis.conf
如下图是默认持久化的方式
LG:save 900 1 redis在900秒内执行一次set操作时则持久化一次
总结
AOF模式
开启AOF模式
AOF模式的持久化策略
公司 实际的持久化 怎么去选择呢
小结
情景题
vim xxxxxxxxx
数据恢复
Redis内存优化说明
总结:一般都在数据层面进行优化 算法 ---------redis数据 log底层日志
如上图 证明key1很久没有使用了
然后
二维toto
直线 可靠性很高
证明
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 -> 不会删除数据,如果内存溢出报错返回.
下午
京淘项目架构图设计
项目创建
导入项目
配置文件
配置web项目的启动项
解决方案 不连接数据库
windows环境配置nginx代理
添加web的配置类
修改配置类
作用:要求springMVC可以拦截以.html为结尾的请求.
原本是默认得 告诉mvc 在内部添加一个模板
根据这个index请求 结合视图解析器得配置(默认配置) 实现当前页面得返回
如果不想走默认的index 像手写一个自己的index 晚上晚上
web的配置类 编辑配置类
作用:要求springMVC可以拦截以.html为结尾的请求.
为什么要有配置
16.13模板一番话
搜索引擎工作的原理
关于.html说明
一般搜索引擎只能检索静态页面信息不能检索.jsp等动态的页面结构,所以一般为了提高网站的曝光率,使得商品更加容易的被用户检索,所以一般的商品页面都是.html的.
搜索引擎的工作原理
需求:假设数据库中有1亿条记录,搜索引擎如何能够在1秒之后检索所有的数据,并且有效的返回呢?
倒排索引: 根据关键字检索文章的位置.
搜索引擎的工作原理
根据词找到准确的文字16.41
喵 内 嘎:
倒排索引为什么叫倒排索引?
英文原名Inverted index,大概因为 Invert 有颠倒的意思,就被翻译成了倒排。
但是倒排这个名称很容易让人理解为从A-Z颠倒成Z-A。
个人认为翻译成转置索引可能比较合适。
一个未经处理的数据库中,一般是以文档ID作为索引,以文档内容作为记录。
而Inverted index 指的是将单词或记录作为索引,将文档ID作为记录,这样便可以方便地通过单词或记录查找到其所在的文档。
key变成了关键字
为什么搜索引擎只能记录.html页面
伪静态
伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。伪静态技术是指展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。
概括: 以.html结尾的"动态页面"脚本技术. (.JSP/.html)
搜索引擎最好是检索静态索引(.html 比如商品页面)
一般实际来说 页面是静态 数据动态(后台服务器获取的)
延申
为什么要拦截.html 还有对应mvc去拦截呢
静态页面需要要一个对应页面 才能找到并展现不可能每个网页都有一个不同的页面,这样需要请很多个web工程师
需求就是 一个页面展现所有的商品信息(模板意识)
左边id号为动态的 拦截不到 右边可以 .html可以做到 拦截后缀
拦截后缀 后 才能动态去获取到id 才能查询到后台真实的数据 然后把查询到的数据在页面中进行真实的展现
如上图 看到的实际上是模板 固定了左边图片 中间标题尺码 右边推荐信息
将来把数据查询到以后(根据动态id) 进行如上图的动态填充即可 这就是springmvc要干的活(拦截后缀)
模板要有统一的模板 就放在
跳转页面 动态填充数据 就可以给用户成功的呈现
如上图 开启了后缀类型匹配 只要后缀就像 后期通过手动.html拼上去就可 加了.html就能够被拦截了