CGB2005 0911 jt13

1整合总结
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

复习
命令怎么敲 方法就怎么调
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
json是特殊的数据交换格式 一个是数组 一个是单个的

在这里插入图片描述
在这里插入图片描述

AOP实现redis缓存

现有代码的分析 重讲aop

在这里插入图片描述
在这里插入图片描述
会导致业务层和redis代码绑死 不便于扩展
service只想完成业务逻辑

所以提出需求

在这里插入图片描述

AOP

AOP说明

名称:面向切面编程

一句话总结:在不改变原有代码的条件下,对里面的功能进行扩展

公式:AOP = 切入点表达式 + (做业务拓展的) 通知方法

专业术语:
1.连接点:在执行正常的业务过程中满足了切入点表达式时进入切面的点.(织入) 多个
2.通知: 在切面中执行的具体的业务 方法
3.切入点:能够进入切面的一个判断 if判断 一个
4.目标方法:将要执行的真实业务逻辑在这里插入图片描述
切面是一个类 class
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

关于通知说明:

在这里插入图片描述
在这里插入图片描述
一般使用上述的四大通知类型,不能控制目标方法是否执行都是用来记录程序的执行状态 (记录参数是什么xxxx)
在这里插入图片描述
环绕通知proceed()
晚上10.22前

在这里插入图片描述
5.环绕通知: 在目标方法执行前后都要执行的通知方法. 控制目标方法是否执行.并且环绕通知的功能最为强大.
目标方法是真实业务逻辑

切入点表达式说明

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3)execution(返回值类型 包名.类名.方法名(参数列表) ) 细 颗粒
在这里插入图片描述
4.@annotation(包名.注解名) 按注解进行拦截.

案例 切面

AOP demo复习

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
下图和上图对应
在这里插入图片描述在这里插入图片描述
aop入门案例自我实现
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
控制台如下也是

第二步
在这里插入图片描述

在这里插入图片描述

最常用的execution 第三个

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.1案例练习

在这里插入图片描述
第三个练习 自我实现
暂时redis在impl里面 还没写入aop并替换 所以树状目录查询是用到redis的(缓存)
在这里插入图片描述

ps:
好像并不需要启动虚拟机的数据库服务
在这里插入图片描述
在这里插入图片描述
那之前不启动报502是什么鬼???

关了 一直试着运行8 试试

AOP实现Redis缓存

在这里插入图片描述

需求分析

1.自定义注解CacheFind
在这里插入图片描述
在这里插入图片描述
为了区分 谁是谁的缓存
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如上图 最好动态生成
在这里插入图片描述
缺了一个 博客看 第三点?

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

aop编写

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自我实现 暂时只有一半
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

错误 还是能显示出来
在这里插入图片描述

修正
在这里插入图片描述
在这里插入图片描述
如上图 效果完美实现

初步案例总结 重要!!

注解是切入点表达式 如下图
在这里插入图片描述
标注在impl 在哪个位置实现
在这里插入图片描述
最后 通知方法
在这里插入图片描述

结束
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
以后可以自动拼接 类似::的 redis set规范
在这里插入图片描述
对应11.49 晚上(over)

本来应该是注解的全名 api 要什么样的注解 把注解放在参数当中 然后形参和拦截的挂钩 如下

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

自我实现 拼接理解

在这里插入图片描述

package com.jt.aop;

import com.jt.anno.CacheFind;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;

import java.util.Arrays;

@Component  //将对象交给spring容器管理
@Aspect     //标识我是一个切面
public class CacheAOP {

    //1.注入缓存redis对象
    @Autowired
    private Jedis jedis;

    /**
     * 拦截@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]"
        System.out.println(key);
        return null;
    }











    /**
     * 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("我是前置通知");
    }*/
}

在这里插入图片描述
在这里插入图片描述
下午
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
14.09 晚上

断点调试

在这里插入图片描述
自我实现
在这里插入图片描述

在这里插入图片描述
继续
在这里插入图片描述
在这里插入图片描述
如上返回值类型不能写死
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
面向接口编程
在这里插入图片描述
新增执行redis查询

@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 result;
    }


记下这个新的api joinPoint.getSignature()
在这里插入图片描述
实现了数据库的查询
在这里插入图片描述
实现了redis查询
在这里插入图片描述
扩展
aop的逻辑才是需要考虑的问题
在这里插入图片描述
spring给动态赋的值
在这里插入图片描述

Around环绕说明

15.07晚上 为什么放在第一位 和下标相关array[0]
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
示例
在这里插入图片描述
前置通知 拦截注解
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
识别为拼接而不是分组

key 后跟:: 是规范 表示业务逻辑下具体的id
在这里插入图片描述

继续

叶子类目的redis缓存优化

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
自我实现
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

redis分片机制

在这里插入图片描述
在这里插入图片描述

redis分片说明

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

redis分片的准备

先关闭redis服务
在这里插入图片描述
在这里插入图片描述

redis分配策略在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
:wq保存
在这里插入图片描述
在这里插入图片描述
自我实现

分步执行conf 然后检验状态ps -ef |grep redis
在这里插入图片描述

在这里插入图片描述
进入端口成功 变成了3倍内存
在这里插入图片描述

怎么去操作三台redis的API

案例测试
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

自我实现
需要两个接口??
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

检查服务器存哪了

在这里插入图片描述
不在79

在这里插入图片描述
不在80
在这里插入图片描述
如上图 在81了

他们有规律嘛 有算法管理

在这里插入图片描述
在这里插入图片描述
一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。 [1] 在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题

常识介绍

1.常见的hash有多少位16进制数? 8位16进制数
2.16进制数取值有哪些 0-9 A-F 共16个数
3.hash的取值范围是从 00000000~~FFFFFFFF
4.上述取值的个数共有多少个??? 要求以2为底 2^32次幂
在这里插入图片描述
hash(key存值)
博客 找截图(晚上)

一致性hash说明

步骤:
1.首先计算node节点
2.将用户的key进行hash计算,之后按照顺时针的方向找到最近的node节点之后链接,执行set操作.
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值