前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >仿写Spring Boot缓存注解@Cacheable 添加删除

仿写Spring Boot缓存注解@Cacheable 添加删除

作者头像
分享干货的你
发布2021-04-06 17:08:20
9240
发布2021-04-06 17:08:20
举报
文章被收录于专栏:分享干货的你

最近在使用springboot 的缓存注解的时候,发现挺好用的。这里我们就来仿写一下。

1, 首先我们分析一下,要参数绑定,要做aop , 还要有redis的客户端。

2, 参数绑定要 符合spel 表达式,aop 做环绕通知, redis的客户端这里我们使用jedis。

首先新建一个springboot 工程 , pom.xml

在 创建两个自定义的注解

这是删除redis的缓存,

这是添加redis的缓存

在写aop 的 里面的实现

里面很简单,就是根据参数解析器和词法分析器。 拿到参数值。

首先判断有没有,没有在重新set 进去, 有的话就从缓存里面拿。

我们在写两个rest 接口测试一下

启动工程,postmain 测试一下添加

多试几次,看一下控制台

在调用删除接口

在重试几次添加

一个非常简单的@Cacheable 的功能就实现了。喜欢就关注啊。

这里在来说说一下 redis 的协议 rest 的协议。满足协议我们就能实现自己的redis客户端 ,

首先我们这道redis 是底层是socket 通信的,我们写一个socket 监听器

代码语言:javascript
复制
 public static void main(String[] args) throws IOException {
        ServerSocket serverSocket = new ServerSocket(6379);
        while (true) {
            Socket socket = serverSocket.accept();
            byte[] bytes = new byte[1024];
            socket.getInputStream().read(bytes);
            System.out.println(new String(bytes));
    }
   
 }

在写一个测试,

控制台显示

*3 代表三个参数 $3代表 第一次参数的长度 ,$ 2 代表 第二个参数的长度,后一个$2 也代表参数的长度。

我们这边仿写一个redis的客户端试一下

代码语言:javascript
复制
    public SimpleJedis() {
        try {
            socket = new Socket("xxxxxx", 6379);

            socket.setReuseAddress(true);
            socket.setKeepAlive(true);
            socket.setTcpNoDelay(true);
            socket.setSoLinger(true, 0);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    public String set(final String key, String value) throws IOException {

        StringBuilder stringBuilder = new StringBuilder();

        stringBuilder.append("*3").append("\r\n");

        stringBuilder.append("$3").append("\r\n");

        stringBuilder.append("SET").append("\r\n");

        stringBuilder.append("$").append(key.length()).append("\r\n");

        stringBuilder.append(key).append("\r\n");

        stringBuilder.append("$").append(value.length()).append("\r\n");

        stringBuilder.append(value).append("\r\n");
        socket.getOutputStream().write(stringBuilder.toString().getBytes());

        InputStream inputStream = socket.getInputStream();
        byte b[] = new byte[inputStream.available()];
        inputStream.read(b);
        return new String(b);
    }

运行一下,在看数据库

好的,完美解决

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-07-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 分享干货的你 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档