服务器之家

服务器之家 > 正文

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

时间:2021-07-26 11:15     来源/作者:dange_h

这段时间一直有人问如何在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
2
3
4
5
6
<!-- 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,这个类中实现了上面所说的两种方法的存取操作

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
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程序其他地方操作这个工具类做数据的处理:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@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缓存对象的方法详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!

原文链接:https://blog.csdn.net/dange_h/article/details/88661936
标签:

相关文章

热门资讯

2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总
苹果12mini价格表官网报价 iPhone12mini全版本价格汇总 2020-11-13
2021德云社封箱演出完整版 2021年德云社封箱演出在线看
2021德云社封箱演出完整版 2021年德云社封箱演出在线看 2021-03-15
返回顶部