CGB2005 0914 jt15

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就能够被拦截了

总结 如下图 有了 xxxx(id).html 结尾的 这个请求才会被controller动态接收 才能进行动态跳转 展现要查询的商品信息(动态显现)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值