最近在使用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("rn");
stringBuilder.append("$3").append("rn");
stringBuilder.append("SET").append("rn");
stringBuilder.append("$").append(key.length()).append("rn");
stringBuilder.append(key).append("rn");
stringBuilder.append("$").append(value.length()).append("rn");
stringBuilder.append(value).append("rn");
socket.getOutputStream().write(stringBuilder.toString().getBytes());
InputStream inputStream = socket.getInputStream();
byte b[] = new byte[inputStream.available()];
inputStream.read(b);
return new String(b);
}
运行一下,在看数据库
好的,完美解决