java通过代理使用redis,redis自动关闭连接,释放资源
java使用redis一般都是通过redis.clients.jedis.Jedis来连接redis服务器,通过redis.clients.jedis.Jedis提供的方法使用redis
但是每次执行完jedis里面的方法之后必须关闭链接,释放资源,否则链接一旦用完下次再使用redis程序会堵塞,但是手动关闭链接或出现很多的重复代码,并且有些时候也会忘记关闭
解决方法就是使用代理模式来解决这一问题
代理有两种:java的Proxy类和Spring的Enhancer
区别就是前者只能代理基于接口的类,也就是说代理的类必须是接口,否则无法代理
后者是Spring的代理类,弥补java的Proxy只能代理接口的缺陷
Enhancer使用非常简单,只要使用了Spring就会有,全类目是org.springframework.cglib.proxy.Enhancer
package com.xiaogang.report.proxy;import com.xiaogang.report.handler.JedisHandler;
import org.springframework.cglib.proxy.Callback;
import org.springframework.cglib.proxy.Enhancer;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;/*** jedis代理,自动关闭jedis连接*/
public class JedisProxy {private JedisPool jedisPool;public JedisProxy(JedisPool jedisPool) {this.jedisPool = jedisPool;}public Jedis createProxy() throws Exception{Enhancer enhancer = new Enhancer();//设置代理的父类,就设置需要代理的类enhancer.setSuperclass(Jedis.class);//设置自定义的代理方法Callback callback = new JedisHandler(jedisPool);enhancer.setCallback(callback);Object o = enhancer.create();Jedis jedis = null;if (o instanceof Jedis){jedis = (Jedis) o;}return jedis;}}
package com.xiaogang.report.handler;import org.springframework.cglib.proxy.InvocationHandler;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;import java.lang.reflect.Method;/*** jedis代理,自动关闭资源*/
public class JedisHandler implements InvocationHandler {private JedisPool jedisPool;public JedisHandler(JedisPool jedisPool){this.jedisPool = jedisPool;}/*** 当使用jedis方法的时候,实际调用的这里的方法* @param proxy* @param method* @param args* @return* @throws Throwable*/public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("JedisHandler.invoke -----start");Jedis jedis = null;try {jedis = jedisPool.getResource();Object invoke = method.invoke(jedis, args);System.out.println("代理方法获得的结果:"+invoke);return invoke;}finally {if (jedis != null) {jedis.close();System.out.println("关闭jedis连接");}System.out.println("JedisHandler.invoke -----end");}}
}
以后获取Jedis对象通过new JedisProxy().createProxy(),使用jedis的方法都会自动关闭连接了
执行结果
JedisHandler.invoke -----start
代理方法获得的结果:redis.clients.util.JedisByteHashMap@ebe4043
关闭jedis连接
JedisHandler.invoke -----end
评论里面说的对,多线程情况下会创建很多代理类,效率不高,会有性能的问题。可以使用连接池的设计思路来进行改造。
当然了,使用spirng data redis更方便,就不用这个设计了
java通过代理使用redis,redis自动关闭连接,释放资源相关推荐
- Java使用Maven加载redis.clients连接Redis
Maven官方仓库地址:Maven Repository: redis.clients » jedis 在Maven中添加如下依赖: <dependency><groupId> ...
- Redis核心技术-高可靠-集群方案(客户端分片、代理分片、Redis Cluster)
Redis在3.0版本前只支持单实例模式,虽然Redis的开发者Antirez早在博客上就提出在Redis 3.0版本中加入集群的功能,但3.0版本等到2015年才发布正式版. 各大企业等不急了,在3 ...
- JAVA社交平台项目第六天 Redis分布式缓存
第6章 - Redis分布式缓存 学习目标: 掌握Redis性能测试 掌握Redis读写分离搭建 掌握Redis高可用Sentinel搭建 掌握Sentinel整合SpringBoot 掌握Redis ...
- Redis之jedis连接池
jedis连接池的代码: public class JedisPoolTest {//Redis服务器IPprivate static String ADDR = "127.0.0.1&qu ...
- springboot2整合redis使用lettuce连接池(解决lettuce连接池无效问题)
lettuce客户端 Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直连redis server,多线程环境下非线程安全(即多个线程对一个连接实例 ...
- Redis中的连接池以及在Springboot中的使用
1.为什么要使用连接池以及常用客户端的区别 众所周知,Redis是单线程的,那为什么还要使用连接池?首先Redis也是一种基于内存数据库,有着很高的性能,但是我们的系统使用Redis服务时需要 ...
- Java面试----2018最全Redis面试题整理
Java面试----2018最全Redis面试题整理 1.什么是Redis? 答:Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-va ...
- 秋招面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等
轰轰烈烈的秋招季已经开始,有人欢喜有人愁,不管你是喜是忧,学习总归是好的.这不,小编特地整理了一下秋招面试知识点+答案(JAVA岗),一起分享出来给大家看看~ 需要完整版的 知识点+答案 的朋友可以 ...
- 秋招JAVA面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等
轰轰烈烈的"金九银十"秋招季已经落幕,有人欢喜有人愁,不管你是喜是忧,学习总归是好的.这不,小编特地整理了一下秋招面试知识点(JAVA岗),一起分享出来给大家看看~ 第一部分 Ja ...
最新文章
- OpenStack如何实现高可用集群介绍
- overflow与min-width
- python3.6.4安装教程-python3.6.4如何安装到树莓派3代
- python之进程和线程2
- VC导入导出二维数组到 .txt
- Python学习笔记之列表(五)
- flex white-space: nowrap,撑大盒子问题
- 幻想英雄2-战神再起折扣号新手入门攻略
- TLStorm:APC UPS 存在零点击0day,可远程烧毁设备、切断电源
- Linux之ping命令
- 应急响应的基本流程(建议收藏)
- 香橙派借助语音模块实现语音刷抖音
- 辗转相除法 原理 Java实现
- Date 的GMT、UTC、ISO、CST、timestamp 等格式 及Moment、Dayjs
- android 集成分享!!
- 一个小巧的富文本编辑器(simditor)
- VS2017中自用部分插件的设置的翻译或功能介绍—— Viasfora设置(一)
- 励志---决定你一生成就的21个信念及要点
- 重生玄幻练制超级计算机小说,四本好看过瘾的转世重生类玄幻小说,熬夜也要看,根本停不下来...
- win10亮度_关于Surface系列屏幕亮度问题的一种解决方案