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 连接池对象


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

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


  
  
  1. package com.sgxy.util;
  2. import java.io.ByteArrayInputStream;
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.ObjectInputStream;
  5. import java.io.ObjectOutputStream;
  6. import java.util.List;
  7. import org.springframework.beans.factory. annotation.Autowired;
  8. import org.springframework.stereotype.Component;
  9. import net.sf.json.JSONArray;
  10. import redis.clients.jedis.Jedis;
  11. import redis.clients.jedis.JedisPool;
  12. @Component
  13. public class RedisUtil {
  14. @Autowired
  15. JedisPool pool; // Jedis连接池
  16. // 判断Redis中是否存在键
  17. public boolean existsKey(String key) {
  18. Jedis jedis = pool.getResource();
  19. boolean bool;
  20. try {
  21. bool = jedis.exists(key);
  22. } finally {
  23. jedis.close();
  24. }
  25. return bool;
  26. }
  27. // 取缓存中的二进制数据,反序列化成List集合对象
  28. @SuppressWarnings("unchecked")
  29. public <T> List<T> getObject(String key, Class<T> clazz) {
  30. Jedis jedis = pool.getResource();
  31. // 二进制 IO 输入流
  32. ByteArrayInputStream is = null;
  33. ObjectInputStream ois = null;
  34. try {
  35. // 从缓存中取二进制数据
  36. byte[] b = jedis. get(key.getBytes());
  37. is = new ByteArrayInputStream(b);
  38. ois = new ObjectInputStream( is);
  39. // 把二进制转换成T指定类型的集合
  40. return (List<T>) ois.readObject();
  41. } catch (Exception e) {
  42. e.printStackTrace();
  43. } finally {
  44. try {
  45. is.close();
  46. ois.close();
  47. } catch (Exception e2) {
  48. e2.printStackTrace();
  49. }
  50. jedis.close();
  51. }
  52. return null;
  53. }
  54. // 把对象序列化二进制格式并保证到Redis缓存中
  55. public void saveObject(Object object, String key) {
  56. Jedis jedis = pool.getResource();
  57. // 二进制 IO 输出流
  58. ByteArrayOutputStream os = null;
  59. ObjectOutputStream oos = null;
  60. try {
  61. os = new ByteArrayOutputStream();
  62. oos = new ObjectOutputStream(os);
  63. oos.writeObject( object); // 二进制数据
  64. byte[] b = os.toByteArray();
  65. // 存入二进制数据到Redis缓存中
  66. jedis. set(key.getBytes(), b);
  67. } catch (Exception e) {
  68. e.printStackTrace();
  69. } finally {
  70. try {
  71. os.close();
  72. oos.close();
  73. } catch (Exception e2) {
  74. e2.printStackTrace();
  75. }
  76. jedis.close();
  77. }
  78. }
  79. // 把List集合对象转换成json格式保存到指定的键中
  80. public void saveJsonArray(Object object, String key) {
  81. Jedis jedis = pool.getResource();
  82. try {
  83. // 格式化成Json字符串
  84. JSONArray array = JSONArray.fromObject( object);
  85. jedis. set(key, array.toString()); // 存入缓存
  86. } finally {
  87. jedis.close();
  88. }
  89. }
  90. // 通过键取出Json字符串并转换成 Class<T>这个T所指定的类型
  91. @SuppressWarnings({ "static-access", "unchecked" })
  92. public <T> List<T> getJsonArray(String key, Class<T> clazz) {
  93. Jedis jedis = pool.getResource();
  94. try {
  95. String str = jedis. get(key);
  96. JSONArray array = JSONArray.fromObject(str);
  97. // 把字符串转换回集合对象 clazz是指定的类型
  98. return (List<T>) array.toCollection(array, clazz);
  99. } finally {
  100. jedis.close();
  101. }
  102. }
  103. }

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


  
  
  1. @Controller //注解这个类为控制器
  2. @RequestMapping("grade") //注册访问此控制器的URL
  3. public class GradeController {
  4. @Autowired // 从IOC容器注入业务层对象
  5. GradeService gradeService;
  6. @Autowired
  7. JedisPool pool;
  8. @Autowired
  9. RedisUtil redisUtil;
  10. @RequestMapping("list") //注册URL
  11. public ModelAndView list() {
  12. List<Grade> grades = null;
  13. if (redisUtil.existsKey( "g")) {
  14. System. out.println( "从Redis 缓存中取数据..");
  15. //调用反序列化方法取缓存的数据
  16. grades = redisUtil.getObject( "g",Grade. class);
  17. //调用Json格式转换的方法取缓存数据
  18. //grades = redisUtil.getJsonArray("gradeList", Grade.class);
  19. } else {
  20. System. out.println( "从数据库中取数据,并存入缓存..");
  21. //调用底层方法从数据库中取数据
  22. grades = gradeService.find();
  23. //调用序列化方法把数据缓存到Redis中
  24. redisUtil.saveObject(grades, "g");
  25. //调用Json格式化方法把数据缓存到Redis中
  26. //redisUtil.saveJsonArray(grades, "gradeList");
  27. }
  28. return new ModelAndView( "gradeList", "grades", grades);
  29. }
  30. }

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

猜你喜欢

转载自blog.csdn.net/weixin_43710551/article/details/88887968