好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

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

?

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

查看更多关于详解在Java程序中运用Redis缓存对象的方法的详细内容...

  阅读:31次