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自动关闭连接,释放资源相关推荐

  1. Java使用Maven加载redis.clients连接Redis

    Maven官方仓库地址:Maven Repository: redis.clients » jedis 在Maven中添加如下依赖: <dependency><groupId> ...

  2. Redis核心技术-高可靠-集群方案(客户端分片、代理分片、Redis Cluster)

    Redis在3.0版本前只支持单实例模式,虽然Redis的开发者Antirez早在博客上就提出在Redis 3.0版本中加入集群的功能,但3.0版本等到2015年才发布正式版. 各大企业等不急了,在3 ...

  3. JAVA社交平台项目第六天 Redis分布式缓存

    第6章 - Redis分布式缓存 学习目标: 掌握Redis性能测试 掌握Redis读写分离搭建 掌握Redis高可用Sentinel搭建 掌握Sentinel整合SpringBoot 掌握Redis ...

  4. Redis之jedis连接池

    jedis连接池的代码: public class JedisPoolTest {//Redis服务器IPprivate static String ADDR = "127.0.0.1&qu ...

  5. springboot2整合redis使用lettuce连接池(解决lettuce连接池无效问题)

    lettuce客户端 Lettuce 和 Jedis 的都是连接Redis Server的客户端程序.Jedis在实现上是直连redis server,多线程环境下非线程安全(即多个线程对一个连接实例 ...

  6. Redis中的连接池以及在Springboot中的使用

    1.为什么要使用连接池以及常用客户端的区别     众所周知,Redis是单线程的,那为什么还要使用连接池?首先Redis也是一种基于内存数据库,有着很高的性能,但是我们的系统使用Redis服务时需要 ...

  7. Java面试----2018最全Redis面试题整理

    Java面试----2018最全Redis面试题整理 1.什么是Redis? 答:Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-va ...

  8. 秋招面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等

    轰轰烈烈的秋招季已经开始,有人欢喜有人愁,不管你是喜是忧,学习总归是好的.这不,小编特地整理了一下秋招面试知识点+答案(JAVA岗),一起分享出来给大家看看~ 需要完整版的 知识点+答案 的朋友可以  ...

  9. 秋招JAVA面试总结:Java+并发+Spring+MySQL+分布式+Redis+算法+JVM等

    轰轰烈烈的"金九银十"秋招季已经落幕,有人欢喜有人愁,不管你是喜是忧,学习总归是好的.这不,小编特地整理了一下秋招面试知识点(JAVA岗),一起分享出来给大家看看~ 第一部分 Ja ...

最新文章

  1. OpenStack如何实现高可用集群介绍
  2. overflow与min-width
  3. python3.6.4安装教程-python3.6.4如何安装到树莓派3代
  4. python之进程和线程2
  5. VC导入导出二维数组到 .txt
  6. Python学习笔记之列表(五)
  7. flex white-space: nowrap,撑大盒子问题
  8. 幻想英雄2-战神再起折扣号新手入门攻略
  9. TLStorm:APC UPS 存在零点击0day,可远程烧毁设备、切断电源
  10. Linux之ping命令
  11. 应急响应的基本流程(建议收藏)
  12. 香橙派借助语音模块实现语音刷抖音
  13. 辗转相除法 原理 Java实现
  14. Date 的GMT、UTC、ISO、CST、timestamp 等格式 及Moment、Dayjs
  15. android 集成分享!!
  16. 一个小巧的富文本编辑器(simditor)
  17. VS2017中自用部分插件的设置的翻译或功能介绍—— Viasfora设置(一)
  18. 励志---决定你一生成就的21个信念及要点
  19. 重生玄幻练制超级计算机小说,四本好看过瘾的转世重生类玄幻小说,熬夜也要看,根本停不下来...
  20. win10亮度_关于Surface系列屏幕亮度问题的一种解决方案

热门文章

  1. 数据结构与算法真的那么重要么?
  2. eclipes的使用
  3. 成功解决: Windows10没有蓝牙问题
  4. 如何应对项目范围变更管理
  5. 浅谈Nginx转发匹配规则
  6. 计算机硬件基础与实践探知
  7. Tornado实现多线程、多进程HTTP服务
  8. python获取erp数据_python自学之路-数据读取
  9. 基于BP神经网络进行手写体识别(Matlab代码实现)
  10. 联想微型计算机供电电源线,拆修一只联想电源适配器,告诉你一个不为人知的秘密...