Redis入门很简单之五【Jedis和Spring的整合】

博客分类:

在上一篇文章中,简单介绍了Jedis的连接池使用方式。

如果和Spring进行整合的话,我们将获得更好的简洁性、灵活性,显然是一种更加优雅(graceful)的方式。

[一]. 搭建环境:
 1. 在之前版本的基础之上,添加如下的依赖:
   spring.jar
   commons-logging.jar
   log4j-1.2.15.jar
   同时添加日志配置文件:log4j.properties到classpath下面。
 2. 配置Spring文件:applicationContext.xml
  注意:连接池jedisPool的配置,这里使用了构造方式注入,这是和Jedis的API一致的;
   在注入port时,需要使用使用type = "int"指定注入的参数类型,否则出现异常。

  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  5. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  6. <!-- 加载redis配置文件 -->
  7. <context:property-placeholder location="classpath:redis.properties"/>
  8. <!-- redis连接池的配置 -->
  9. <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
  10. <property name="maxActive" value="${redis.pool.maxActive}"/>
  11. <property name="maxIdle" value="${redis.pool.maxIdle}"/>
  12. <property name="minIdle" value="${redis.pool.minIdle}"/>
  13. <property name="maxWait" value="${redis.pool.maxWait}"/>
  14. <property name="testOnBorrow" value="${redis.pool.testOnBorrow}"/>
  15. <property name="testOnReturn" value="${redis.pool.testOnReturn}"/>
  16. </bean>
  17. <!-- redis的连接池pool,不是必选项:timeout/password  -->
  18. <bean id = "jedisPool" class="redis.clients.jedis.JedisPool">
  19. <constructor-arg index="0" ref="jedisPoolConfig"/>
  20. <constructor-arg index="1" value="${redis.host}"/>
  21. <constructor-arg index="2" value="${redis.port}" type="int"/>
  22. <constructor-arg index="3" value="${redis.timeout}" type="int"/>
  23. <constructor-arg index="4" value="${redis.password}"/>
  24. </bean>
  25. </beans>

[二]. 从SPring容器中获取JedisPool:

  1. ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
  2. JedisPool pool = (JedisPool) context.getBean("jedisPool");
  3. Jedis jedis = pool.getResource();
  4. ...
  5. pool.returnResource(jedis);

[三]. 缓存JavaBean:
 上一篇文章中,已经有了对Jedis使用的基本说明。

当然很多时候我们都希望Redis能够对JavaBean进行缓存,这需要借助于JDK提供的序列化技术。
   1. 要求缓存实体实现了序列化Serializable接口:这里以Userinfo为例。
   2. 序列化工具类:Jedis对序列化的支持,是提供了字节数组byte[]作为参数;
  为此编写SerializingUtil工具类负责byte[]和JavaBean之间的相互转换。该方法的API如下所示:

  1. public static byte[] serialize(Object source);
  2. public static Object deserialize(byte[] source);

该工具类的具体实现:

  1. /**
  2. * 功能简述: 序列化工具类,负责byte[]和Object之间的相互转换.
  3. * @author Nick Xu
  4. * @version 1.0
  5. */
  6. public class SerializingUtil {
  7. private static Log logger = LogFactory.getLog(SerializingUtil.class);
  8. /**
  9. * 功能简述: 对实体Bean进行序列化操作.
  10. * @param source 待转换的实体
  11. * @return 转换之后的字节数组
  12. * @throws Exception
  13. */
  14. public static byte[] serialize(Object source) {
  15. ByteArrayOutputStream byteOut = null;
  16. ObjectOutputStream ObjOut = null;
  17. try {
  18. byteOut = new ByteArrayOutputStream();
  19. ObjOut = new ObjectOutputStream(byteOut);
  20. ObjOut.writeObject(source);
  21. ObjOut.flush();
  22. }
  23. catch (IOException e) {
  24. logger.error(source.getClass().getName()
  25. + " serialized error !", e);
  26. }
  27. finally {
  28. try {
  29. if (null != ObjOut) {
  30. ObjOut.close();
  31. }
  32. }
  33. catch (IOException e) {
  34. ObjOut = null;
  35. }
  36. }
  37. return byteOut.toByteArray();
  38. }
  39. /**
  40. * 功能简述: 将字节数组反序列化为实体Bean.
  41. * @param source 需要进行反序列化的字节数组
  42. * @return 反序列化后的实体Bean
  43. * @throws Exception
  44. */
  45. public static Object deserialize(byte[] source) {
  46. ObjectInputStream ObjIn = null;
  47. Object retVal = null;
  48. try {
  49. ByteArrayInputStream byteIn = new ByteArrayInputStream(source);
  50. ObjIn = new ObjectInputStream(byteIn);
  51. retVal = ObjIn.readObject();
  52. }
  53. catch (Exception e) {
  54. logger.error("deserialized error  !", e);
  55. }
  56. finally {
  57. try {
  58. if(null != ObjIn) {
  59. ObjIn.close();
  60. }
  61. }
  62. catch (IOException e) {
  63. ObjIn = null;
  64. }
  65. }
  66. return retVal;
  67. }
  68. }

3. 对JavaBean的存储和获取:
        定义实体:借助于Timestamp类,获取ms值。

  1. Userinfo actual = new Userinfo(140520, "Nick Xu",
  2. new Date(Timestamp.valueOf("1990-11-11 00:00:00").getTime()));

使用Jedis操作:key、value都需要转成byte[]字节数组。

  1. String key = "user.userid." + actual.getUserId();
  2. jedis.set(key.getBytes(), SerializingUtil.serialize(actual));
  3. Userinfo expected = (Userinfo) SerializingUtil.deserialize(jedis.get(key.getBytes()));

对象的比较:需要覆写equals和hashCode方法。

  1. assertEquals(expected, actual);
0 
0 
分享到:  
参考知识库
Redis知识库4908  关注 | 738  收录
评论
5 楼 di1984HIT 2017-02-02  
慢慢会完善很多。罗马不是一日建成
4 楼 alafqq 2016-05-20  
希望楼主提供完整的代码~~哈哈jredis.properties
3 楼 19774279 2015-07-31  
Hello_Nick_Xu 写道
yixiandave 写道
Spring不是有一个Spring-data-redis的项目吗??

嗯,是的,稍后会对Spring Data Redis进行介绍,使用起来确实方便 ,不过带来的却是Redis特性的大量丢失 ,尤其是,不支持Sharding机制。

都丢失了什么,能例举一下吗?有文章吗?

2 楼 Hello_Nick_Xu 2014-06-08  
yixiandave 写道
Spring不是有一个Spring-data-redis的项目吗??

嗯,是的,稍后会对Spring Data Redis进行介绍,使用起来确实方便 ,不过带来的却是Redis特性的大量丢失 ,尤其是,不支持Sharding机制。 

Redis入门很简单之五【Jedis和Spring的整合】的更多相关文章

  1. Redis入门很简单之七【使用Jedis实现客户端Sharding】

    Redis入门很简单之七[使用Jedis实现客户端Sharding] 博客分类: NoSQL/Redis/MongoDB redisjedisspringsharding分片 <一>. 背 ...

  2. Redis入门很简单之六【Jedis常见操作】

    Redis入门很简单之六[Jedis常见操作] http://www.tuicool.com/articles/vaqABb http://www.cnblogs.com/stephen-liu74/ ...

  3. Redis入门很简单之四【初识Jedis】

    Redis入门很简单之四[初识Jedis] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存jedis  使用Jedis提供的Java API对Redis进行操作,是Red ...

  4. Redis入门很简单之一【简介与环境搭建】

    Redis入门很简单之一[简介与环境搭建] 博客分类: NoSQL/Redis/MongoDB redisnosqlmemcached缓存中间件  [Redis简介] <一>. NoSQL ...

  5. Redis入门很简单之三【常见参数配置】

    Redis入门很简单之三[常见参数配置] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存中间件memcached  Redis的一下常见设置都是通过对redis.conf ...

  6. Redis入门很简单之二【常见操作命令】

    Redis入门很简单之二[常见操作命令] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存  Redis提供了丰富的命令,允许我们连接客户端对其进行直接操作.这里简单介绍一 ...

  7. Redis入门和Java利用jedis操作redis

    Redis入门和Java利用jedis操作redis Redis介绍 Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - val ...

  8. 踢爆IT劣书出版黑幕——由清华大学出版社之《C语言入门很简单》想到的(1)

    1.前言与作者 首先声明,我是由于非常偶然的机会获得<C语言入门很简单>这本书的,绝对不是买的.买这种书实在丢不起那人. 去年这书刚出版时,在CU论坛举行试读推广,我当时随口说了几句(没说 ...

  9. [电子书] 《Android编程入门很简单》

    <Android编程入门很简单>是一本与众不同的Android学习读物,是一本化繁为简,把抽象问题具体化,把复杂问题简单化的书.本书避免出现云山雾罩.晦涩难懂的讲解,代之以轻松活泼.由浅入 ...

随机推荐

  1. 2018-2019 2 20165203 《网络对抗技术》Exp8 Web基础

    2018-2019 2 20165203 <网络对抗技术>Exp8 Web基础 实验要求 1.本实践的具体要求有: (1) Web前端HTML(0.5分) 能正常安装.启停Apache.理 ...

  2. ceph安装问题

    ceph-deploy安装 Yum priorities pluginLoaded plugins: fastestmirror Loaded plugins: fastestmirror, prio ...

  3. C++ 常见的cin的错误处理

    写程序时想要用 cin 对输入的合法性检查,于是学习了一下 cin.fail() 函数,顺便学习了类似的一些函数. cin 对象包含了一个描述流状态的数据成员.流状态有 3 个标志位:eofbit,b ...

  4. CF561做题

    C题: 一期思路:我们发现如果x,y满足条件,那么{x,-y} {-x,y} {-x,-y}也满足条件.那么我们可以只讨论|x| |y|是否满足条件,如果满足条件,那么对ans的贡献是|x|出现次数* ...

  5. Prim算法生成迷宫

    初始化地图 function initMaze(r,c){ let row = new Array(2 * r + 1) for(let i = 0; i < row.length; i++){ ...

  6. kubernetes集群的安装异常汇---docker的驱动引擎

    异常[kubelet cgroup driver:cgroupfs跟docker cgroup driver:systemd不一致] 异常描述 error: failed to run Kubelet ...

  7. 一、spring的基本认识

    Spring的认识 Spring是一个开放源代码的设计层面框架,它解决的是业务逻辑层和其他各层的松耦合问题,因此它将面向接口的编程思想贯穿整个系统应用 Spring是于2003 年兴起的一个轻量级的J ...

  8. 【记录】Mysql 建表注意事项

    博主最近打算搭建商城,由于之前对建表只有很浅显的理解,没有太过深入了解,建表过程中遇到一些问题,现记录如下, 如有问题请各位留言指正,感激不尽: 建表时设置如何设置联合主键?如下标红处: CREATE ...

  9. rabbitmq 发送的用户名是什么

    消费的用户名也必须是什么 接收必须单独启动线程——否则mfc会崩溃 Sleep(30000);  //30秒 只要你打开消费队列,只消费1个 队列中所有数据都丢失???????? 断线重连: 知道答案 ...

  10. 调整Winfrom控件WebBrowser的默认浏览器内核版本

    一.问题解析: 今天在调试程序的时候,需要使用C#的客户端远程登录一个Web页面,用到了WebBrowser控件.但是却发现了一件很神奇的事情:当前浏览器使用的内核,可以通过访问下面这个网站获取:ht ...