详解在Java程序中运用Redis缓存对象的方法

 更新时间:2019年03月28日 16:19:20   作者:dange_h  
这篇文章主要介绍了在Java程序中运用Redis缓存对象的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

这段时间一直有人问如何在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 连接池对象

<!-- Redis 连接池配置 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
	destroy-method="close">		
	<constructor-arg name="host" value="127.0.0.1" />
	<constructor-arg name="port" value="6379" />
</bean>

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 <T> List<T> getObject(String key, Class<T> 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<T>) 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>这个T所指定的类型
	@SuppressWarnings({ "static-access", "unchecked" })
	public <T> List<T> getJsonArray(String key, Class<T> clazz) {
		Jedis jedis = pool.getResource();
		try {
			String str = jedis.get(key);
			JSONArray array = JSONArray.fromObject(str);
			// 把字符串转换回集合对象 clazz是指定的类型
			return (List<T>) 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<Grade> 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缓存对象的方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • 详解Spring Security 捕获 filter 层面异常返回我们自定义的内容

    详解Spring Security 捕获 filter 层面异常返回我们自定义的内容

    Spring 的异常会转发到 BasicErrorController 中进行异常写入,然后才会返回客户端。所以,我们可以在 BasicErrorController 对 filter异常进行捕获并处理,下面通过本文给大家介绍Spring Security 捕获 filter 层面异常,返回我们自定义的内容,感兴趣的朋友一起看看吧
    2022-05-05
  • 浅谈Java四种线程池及new Thread的弊端

    浅谈Java四种线程池及new Thread的弊端

    本文主要介绍了浅谈Java四种线程池及new Thread的弊端,详细的介绍了newCachedThreadPool,newFixedThreadPool,newScheduledThreadPool,newSingleThreadExecutor四种的使用,感兴趣的可以了解一下
    2024-01-01
  • SpringMVC数据输出相关知识总结

    SpringMVC数据输出相关知识总结

    今天带大家学习SpringMVC的相关知识,文中对SpringMVC数据输出作了非常详细的代码示例,对正在学习的小伙伴们很有帮助,需要的朋友可以参考下
    2021-06-06
  • 浅谈java中为什么实体类需要实现序列化

    浅谈java中为什么实体类需要实现序列化

    下面小编就为大家带来一篇浅谈java中为什么实体类需要实现序列化。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Java NIO 通道概念选择器使用示例详解

    Java NIO 通道概念选择器使用示例详解

    这篇文章主要为大家介绍了Java NIO 通道概念选择器使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-10-10
  • Java输出多位小数的三种方法(附代码)

    Java输出多位小数的三种方法(附代码)

    这篇文章主要给大家介绍了关于Java输出多位小数的三种方法的相关资料,在实际工作中常常需要设定数字的输出格式,如以百分比的形式输出,或者设定小数位数等,需要的朋友可以参考下
    2023-07-07
  • Schedule定时任务在分布式产生的问题详解

    Schedule定时任务在分布式产生的问题详解

    这篇文章主要介绍了Schedule定时任务在分布式产生的问题详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • java实现爬取知乎用户基本信息

    java实现爬取知乎用户基本信息

    这篇文章主要为大家介绍了一个基于JAVA的知乎爬虫,抓取知乎用户基本信息,感兴趣的小伙伴们可以参考一下
    2016-05-05
  • Linux系统Java环境配置教程

    Linux系统Java环境配置教程

    这篇文章给大家介绍的Linux 系统Java环境配置教程,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • 在navicat中导入mysql数据库详细步骤(即.sql后缀的数据库)

    在navicat中导入mysql数据库详细步骤(即.sql后缀的数据库)

    Navicat是MySQL非常好用的可视化管理工具,功能非常强大,能满足我们日常数据库开发的所有需求,下面这篇文章主要给大家介绍了关于如何在navicat中导入mysql数据库(即.sql后缀的数据库)的相关资料,需要的朋友可以参考下
    2023-04-04

最新评论