这段时间一直有人问如何在Redis中缓存Java中的List 集合数据,其实很简单,常用的方式有两种:

1. 利用序列化,把对象序列化成二进制格式,Redis 提供了 相关API方法存储二进制,取数据时再反序列化回来,转换成对象。

2. 利用 Json与java对象之间可以相互转换的方式进行存值和取值。

正面针对这两种方法,特意写了一个工具类,来实现数据的存取功能。

1. 首页在Spring框架中配置 JedisPool 连接池对象,此对象可以创建 Redis的连接 Jedis对象。当然,必须导入Redis的相关Jar包。

Jedis 的Jar包如下:commons-pool2-2.3.jar

jedis-2.9.0.jar

要用到 Json,所以还需要导入Json的Jar包:commons-beanutils-1.8.0.jar

commons-collections-3.1.jar

commons-lang-2.5.jar

commons-logging-1.1.3.jar

ezmorph-1.0.6.jar

json-lib-2.3-jdk15.jar

在配置文件中配置JedisPool 连接池对象

2. 创建一个Redis的工具类RedisUtil,这个类中实现了上面所说的两种方法的存取操作

package com.sgxy.util; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import net.sf.json.JSONArray; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; @Component public class RedisUtil { @Autowired JedisPool pool; // Jedis连接池 // 判断Redis中是否存在键 public boolean existsKey(String key) { Jedis jedis = pool.getResource(); boolean bool; try { bool = jedis.exists(key); } finally { jedis.close(); } return bool; } // 取缓存中的二进制数据,反序列化成List集合对象 @SuppressWarnings("unchecked") public List getObject(String key, Class clazz) { Jedis jedis = pool.getResource(); // 二进制 IO 输入流 ByteArrayInputStream is = null; ObjectInputStream ois = null; try { // 从缓存中取二进制数据 byte[] b = jedis.get(key.getBytes()); is = new ByteArrayInputStream(b); ois = new ObjectInputStream(is); // 把二进制转换成T指定类型的集合 return (List) ois.readObject(); } catch (Exception e) { e.printStackTrace(); } finally { try { is.close(); ois.close(); } catch (Exception e2) { e2.printStackTrace(); } jedis.close(); } return null; } // 把对象序列化二进制格式并保证到Redis缓存中 public void saveObject(Object object, String key) { Jedis jedis = pool.getResource(); // 二进制 IO 输出流 ByteArrayOutputStream os = null; ObjectOutputStream oos = null; try { os = new ByteArrayOutputStream(); oos = new ObjectOutputStream(os); oos.writeObject(object); // 二进制数据 byte[] b = os.toByteArray(); // 存入二进制数据到Redis缓存中 jedis.set(key.getBytes(), b); } catch (Exception e) { e.printStackTrace(); } finally { try { os.close(); oos.close(); } catch (Exception e2) { e2.printStackTrace(); } jedis.close(); } } // 把List集合对象转换成json格式保存到指定的键中 public void saveJsonArray(Object object, String key) { Jedis jedis = pool.getResource(); try { // 格式化成Json字符串 JSONArray array = JSONArray.fromObject(object); jedis.set(key, array.toString()); // 存入缓存 } finally { jedis.close(); } } // 通过键取出Json字符串并转换成 Class这个T所指定的类型 @SuppressWarnings({ "static-access", "unchecked" }) public List getJsonArray(String key, Class clazz) { Jedis jedis = pool.getResource(); try { String str = jedis.get(key); JSONArray array = JSONArray.fromObject(str); // 把字符串转换回集合对象 clazz是指定的类型 return (List) array.toCollection(array, clazz); } finally { jedis.close(); } } }

在Java程序其他地方操作这个工具类做数据的处理:

@Controller //注解这个类为控制器 @RequestMapping("grade") //注册访问此控制器的URL public class GradeController { @Autowired // 从IOC容器注入业务层对象 GradeService gradeService; @Autowired JedisPool pool; @Autowired RedisUtil redisUtil; @RequestMapping("list") //注册URL public ModelAndView list() { List grades = null; if (redisUtil.existsKey("g")) { System.out.println("从Redis 缓存中取数据.."); //调用反序列化方法取缓存的数据 grades = redisUtil.getObject("g",Grade.class); //调用Json格式转换的方法取缓存数据 //grades = redisUtil.getJsonArray("gradeList", Grade.class); } else { System.out.println("从数据库中取数据,并存入缓存.."); //调用底层方法从数据库中取数据 grades = gradeService.find(); //调用序列化方法把数据缓存到Redis中 redisUtil.saveObject(grades, "g"); //调用Json格式化方法把数据缓存到Redis中 //redisUtil.saveJsonArray(grades, "gradeList"); } return new ModelAndView("gradeList", "grades", grades); } }

写到此,希望对大家有所帮助。

以上所述是小编给大家介绍的在Java程序中运用Redis缓存对象的方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对华域联盟网站的支持!

java用redis缓存的步骤_详解在Java程序中运用Redis缓存对象的方法|chu相关推荐

  1. 用python画圆角矩形_详解微信小程序canvas圆角矩形的绘制的方法

    详解微信小程序canvas圆角矩形的绘制的方法 发布时间:2020-10-04 18:20:31 来源:脚本之家 阅读:103 作者:清夜 微信小程序允许对普通元素通过 border-radius 的 ...

  2. 把iconfront的资源放cdn访问_详解mpvue小程序中怎么引入iconfont字体图标

    前言 iconfont阿里巴巴矢量图标库是我很喜欢的一个网站,可以下载/在线编辑/上传自己需要的矢量图标,也支持团队协作,那么在mpvue项目中如何引入呢? 将图标加入购物车 搜索关键词可以是中文也可 ...

  3. canvas 圆角矩形填充_详解微信小程序canvas圆角矩形的绘制的方法

    微信小程序允许对普通元素通过 border-radius 的设置来进行圆角的绘制,但有时候在使用 canvas 绘图的时候,也需要圆角,例如需要将页面上某块区域导出为图片下载到本地的时候,常用的解决方 ...

  4. Java API源码在哪里找_详解查看JAVA API及JAVA源码的方法

    在java的日常学习中,我们有时候会需要看java的api说明,或者是查看java的源码,使我们更好的了解java,接下来我就来说说如何查看java的api以及java源码 对于java的api,一般 ...

  5. python英语字典程序修改_详解如何修改python中字典的键和值

    我们知道python中字典是无序的,它们都是通过hash去对应的.一般的如果我们需要修改字典的值,只需要直接覆盖即可,而修改字典的键,则需要使用字典自带的pop函数,示例如下: t = {} t['a ...

  6. python字典修改键所对应值_详解如何修改python中字典的键和值

    我们知道python中字典是无序的,它们都是通过hash去对应的.一般的如果我们需要修改字典的值,只需要直接覆盖即可,而修改字典的键,则需要使用字典自带的pop函数,示例如下: t = {} t['a ...

  7. vue 加载页面时触发时间_详解Vue.js在页面加载时执行某个方法

    详解Vue.js在页面加载时执行某个方法 jQuery中可以这样写 vue中,如果要达到相同效果,可以使用vue的生命周期函数,如create或者mounted 附上vue.js的生命周期函数执行流程 ...

  8. python三维图切片提取_详解Python二维数组与三维数组切片的方法

    如果对象是二维数组,则切片应当是x[:]的形式,里面有一个冒号,冒号之前和之后分别表示对象的第0个维度和第1个维度: 如果对象是三维数组,则切片应当是x[::],里面有两个冒号,分割出三个间隔,三个间 ...

  9. redis lua 设置过期_详解 Redis 内存管理机制和实现

    Redis是一个基于内存的键值数据库,其内存管理是非常重要的.本文内存管理的内容包括:过期键的懒性删除和过期删除以及内存溢出控制策略. 最大内存限制 Redis使用 maxmemory 参数限制最大可 ...

最新文章

  1. 【转】Maven Jetty 插件的问题(css/js等目录死锁)的解决
  2. Unity NetWork
  3. 1.1 为什么需要 ML 策略-深度学习第三课《结构化机器学习项目》-Stanford吴恩达教授
  4. PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次) 转载陈小龙哈2017...
  5. Oracle之数据库设计概述
  6. 特斯拉Model 3本周平均日产约900辆 7000辆周产量有望
  7. springboot中获得app_Spring Boot 应用程序启动流程分析
  8. 杂读 May 12,2008
  9. 光照强度曲线图android,有关光合作用的曲线图的分析(一) - xyz的日志 - 网易博客...
  10. Linux 信息的各种查询(系统发行版本、内核版本、系统位数)
  11. printf() 输出控制符
  12. edui 富文本编辑_百度umeditor富文本编辑器插件扩展
  13. 发那科机器人点位编辑_分步详解 | 发那科机器人如何进行零点标定
  14. Android手机怎么找回微信好友,安卓手机微信怎么找回删除的好友?专业靠谱!...
  15. Socket(服务器端)通信连接失败解决方法
  16. Opencv学习四图像操作(反差色处理)
  17. python七段数码管显示学号_python小实例——七段数码管绘制
  18. 校园助手APP--登陆
  19. P1688 餐厅点餐
  20. 6.3.1广度优先搜索

热门文章

  1. java按键发出声音代码_怎么在java中给按钮添加声音?
  2. c++可视化界面_新基建的福音:智慧楼宇可视化监控系统引领智能化新时代
  3. Matlab库中过采样函数rcosflt参数及源代码详解(翻译)
  4. java获取文件编码_java如何获取文件编码格式
  5. python实例讲解wxpythonhyh123_Python实例讲解 -- wxpython 基本的控件 (按钮)
  6. 【转】iPython入门技巧
  7. 广告行业一些常用物料的尺寸
  8. wamp2.5可用php5.6,局域网访问,多站点配置
  9. PHP header函数大全
  10. 对Group_concaT函数利用剖析 (转)