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

这段时间一直有人问如何在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缓存对象的方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对华域联盟网站的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359370.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux安装、卸载软件

在linux环境中,尤其是cenos中安装过一些软件,一般是二进制安装与源码安装,现小结一下linux中的安装与卸载。 一、通常Linux应用软件的安装包有三种: 1) tar包,如software-1.2.3-1.tar.gz。它是使用UNIX系统的打包工具t…

java绘制_Java 绘制简单图形的问题

代码能运行成功但东西出不来能帮忙看下代码吗?.O_O.importjava.awt.Color;importjava.awt.Graphics2D;importjavax.swing.JComponent;importjavax.swing.JFrame;importjava.awt.geom....代码 能运行成功 但东西出不来 能帮忙看下代码吗?.O_O.import java…

SonarQube中的Maven项目的单元和集成测试报告

自SonarQube 4.2起。 测试报告不是在Maven构建期间由Sonar Maven插件生成的(请参阅SonarQube的博客文章 )。 因此,在Sonar Maven插件收集SonarQube服务器的信息之前,必须由另一个插件生成测试报告。 在这里,Jacoco Mav…

IOS-状态栏的简单操作

一、启动时隐藏状态栏 1、在info.plist里面 Status bar is initially hidden 设置为 YES2、在appDelagate里面 设置 [application setStatusBarHidden:NO withAnimation:UIStatusBarAnimationFade]; 二、将所有页面状态栏字体颜色设为白色1.在info.plist中添加一个字段&#x…

python中、文件最重要的功能是( )和接收数据_Python基础语法14个知识点大串讲

来源:Python数据之道Python基础语法大串讲Python 是一门面向对象的编程语言,相信这篇文章对于初学者而言应该会有一个比较大的帮助,下面我们将 Python 中常用的基础语法和函数做了一个汇总,满满的干货,供大家学习。1、…

hadoop简单介绍_Hadoop:简单介绍

hadoop简单介绍什么是Hadoop: Hadoop是用Java编写的框架,用于在大型商品硬件群集上运行应用程序,并具有类似于Google File System和MapReduce的功能 。 HDFS是一个高度容错的分布式文件系统,与Hadoop一样,旨在部署在低…

SQL预编译防注入小测试

个人对SQL预编译的认识: 1、效率提升,对SQL语句编译一次可多次使用.避免了硬解析和软解析等步骤,当执行的语句上规模的时候性能差异还是很明显的。 2、安全提升,预编译之后的SQL语句,语义不会发生变化,安全性有相当大的提升。 using System; using System.Collectio…

春天:注入列表,地图,可选对象和getBeansOfType()陷阱

如果您使用Spring框架超过一个星期,那么您可能已经知道此功能。 假设您有多个bean实现了给定的接口。 尝试仅自动接线此类接口的一个bean注定会失败,因为Spring不知道您需要哪个特定实例。 您可以通过使用Primary批注来指定一个优先于其他实现的“ 最重要…

python实现表格分析与建模_python实现数据分析与建模

前言首先我们做数据分析,想要得出最科学,最真实的结论,必须要有好的数据。而实际上我们一般面对的的都是复杂,多变的数据,所以必须要有强大的数据处理能力,接下来,我从我们面临的最真实的情况&a…

Unity 利用Coroutine实现跳动数字效果

纯粹转载:转载注明参考链接! 参考链接:http://xataxnova.blog.163.com/blog/static/236620063201451061738122/,作者:网易博客 xataxnova 示例代码:(将该脚本绑在一个Lable对象上,即…

java mvc 案例_springmvc经典案例

本想自己写一下总结,但是发现一篇好文,转发一下,日后自己再做补充;感谢Sunnier,引自:https://www.cnblogs.com/sunniest/p/4555801.htmlSpringMVC学习笔记----一、SpringMVC基础入门,创建一个He…

Ajax.ActionLink 辅助方法实现局部刷新

1,需要引用一个JS文件jquery.unobtrusive-ajax.min.js【MVC4 默认存在Scripts文件夹里】引用到母版页 _Layout.cshtml,并且一定要放在JQuery引用文件之后 2,需要添加一个分布视图到指定的目录里,分布视图是用来显示局部刷新的 3&a…

java 命名约定_Java命名约定

java 命名约定我想写这篇简短的文章来帮助某些难以记住Java API类和方法名称的人。 如您所知,Java是区分大小写的语言,要构建Java程序,您需要使用许多内置API类和方法。 而且,初学者发现很难准确地记住方法名称和类名称而不改变大…

Discuz UCenter 修改手记 - 2014.12.19

最近在整JAVA和UCENTER的东西,受限于项目架构需要,无法完全以UCENTER为中心,所以在对接过程中遇到了许多不愉快的事情。经历多番研究,终于解决了其中了两个大问题,现记录下来,以备日后查看。 一、解决email…

java泛型方法无参_从头再来:Java泛型(开发必须知道的)

Java泛型老规矩,测试一下,下面的程序能否正常运行?为什么?开头测试题泛型就是实现了参数化类型,也就是代码可以适用于多种类型。泛型是在编译期检查的,在编译期检查类型是否安全。我认为泛型最有用的就是和…

几种常见模式识别算法整理和总结

这学期选了门模式识别的课。发现最常见的一种情况就是,书上写的老师ppt上写的都看不懂,然后绕了一大圈去自己查资料理解,回头看看发现,Ah-ha,原来本质的原理那么简单,自己一開始仅仅只是被那些看似formidab…

使用Fabric8在CDI管理的bean中注入Kubernetes Services

序幕 在Kubernetes中我最喜欢的就是发现服务的方式。 为什么? 主要是因为用户代码不必处理注册,查找服务,也没有网络意外(如果您曾经尝试过基于注册表的方法,那么您就会知道我在说什么) 。 这篇文章将介绍…

意外分配– JIT编译抖动

在研究ByteWatcher时 (请参阅我的上一篇 文章 ),我遇到了一些非常奇怪的事情。 这是实际的代码段,用于找出特定线程上的分配量: return (long) mBeanServer.invoke(name,GET_THREAD_ALLOCATED_BYTES,PARAMS,SIGNATUR…

fastd java下载_FastReport VCL报表控件

FastReport VCL报表控件是著名的 Delphi 打印控件。含全部源码。支持 Delphi 10.2 Tokyo,FastReport可以在大量的方式报表的创建过程中操纵对象。快速发展的报表和随后的打印,这样的优点,正如预览打印文档的外观。专业版除了报表标准版的功能…

#102030:在30天内运行20 10K来庆祝Java的20年

1995年5月23日是技术史上的重要时刻。 业界似乎并没有意识到当天发布的语言会在未来几年内完全改变技术的格局。 Java将在今年的同一天庆祝20岁生日。 Java 20年,哇! 回顾20年前的存储器时代,思考一下Java的发明时间/方式。 万维网专用于精…