Redis 讲解系列之 与Spring集成

本章我们将实例讲解Redis如何与Spring整合。由于Redis与Spring的整合手段比较多,本章将着重讲解Spring与Spring-data-redis整合。

实例

新建Maven web项目,并将指定build path source folder。

项目结构

Redis 讲解系列之 与Spring集成

  • Customize build path source folder。
Redis 讲解系列之 与Spring集成

  • 文件代码
  • pom.xml
<code><project>/<code>
<code>    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">/<code>
<code>    <modelversion>4.0.0/<modelversion>/<code>
<code>    <groupid>com.sstps.oscar/<groupid>/<code>
<code>    <artifactid>Template2/<artifactid>/<code>
<code>    <version>0.0.1-SNAPSHOT/<version>/<code>
<code>    <properties>/<code>
<code>        <project.build.sourceencoding>UTF-8/<project.build.sourceencoding>/<code>
<code>    /<code>
<code>    <dependencies>/<code>
<code>        <dependency>/<code>
<code>            <groupid>org.springframework.data/<groupid>/<code>
<code>            <artifactid>spring-data-redis/<artifactid>/<code>
<code>            <version>1.0.2.RELEASE/<version>/<code>
<code>        /<code>
<code>        <dependency>/<code>
<code>            <groupid>org.springframework/<groupid>/<code>
<code>            <artifactid>spring-core/<artifactid>/<code>
<code>            <version>3.1.2.RELEASE/<version>/<code>
<code>        /<code>
<code>        <dependency>/<code>
<code>            <groupid>redis.clients/<groupid>/<code>
<code>            <artifactid>jedis/<artifactid>/<code>
<code>            <version>2.1.0/<version>/<code>
<code>        /<code>
<code>        /<code>
<code>        <dependency>/<code>
<code>            <groupid>commons-logging/<groupid>/<code>
<code>            <artifactid>commons-logging/<artifactid>/<code>
<code>            <version>1.1.1/<version>/<code>
<code>            <scope>provided/<scope>/<code>
<code>        /<code>
<code>    /<code>
<code>


  • redis.properties
<code>redis.host=127.0.0.1/<code>
<code>redis.port=6379/<code>
<code>redis.pass=wljr/<code>
<code>redis.timeout=3000/<code>
<code>redis.maxIdle=300/<code>
<code>redis.maxActive=600/<code>
<code>redis.maxWait=1000/<code> 
<code>redis.testOnBorrow=true/<code>


  • AplicationContext.xml
<code>/<code>
<code><beans>/<code>
<code>    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"/<code>
<code>    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd/<code>
<code>        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">/<code>
<code>    <property-placeholder>/<code>
<code>    <component-scan>/<code>
<code>    /<code>
<code>    <bean>/<code>
<code>        <property>/<code>
<code>        <property>/<code>
<code>        <property>/<code>
<code>        <property>/<code>
<code>    /<code>
<code>    <bean>/<code>
<code>        class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">/<code>
<code>        <property>/<code>
<code>        <property>/<code>
<code>        <property>/<code>
<code>        <property>/<code> 
<code>    /<code>
<code>    <bean>/<code>
<code>        <property>/<code>
<code>    /<code>
<code>    <bean>/<code>
<code>


  • UserDao.java
<code>package com.x.redis.dao;/<code>
<code>import com.x.redis.pojo.User;/<code>
<code>public interface UserDao {/<code>
<code>    public void saveUser(final User user);/<code>
<code>     public User getUser(final long id);/<code>
<code>}/<code>


  • User.java
<code>package com.x.redis.pojo;/<code>
<code>public class User {/<code>
<code>    private long id;/<code>
<code>    private String name;/<code>
<code>    public long getId() {/<code>
<code>        return id;/<code> 
<code>    }/<code>
<code>    public void setId(long id) {/<code>
<code>        this.id = id;/<code>
<code>    }/<code>
<code>    public String getName() {/<code>
<code>        return name;/<code>
<code>    }/<code>
<code>    public void setName(String name) {/<code>
<code>        this.name = name;/<code>
<code>    }/<code>
<code>}/<code>


  • UserDaoImpl.java
<code>package com.x.redis.dao.imp;/<code>
<code>import java.io.Serializable;/<code>
<code>import org.springframework.beans.factory.annotation.Autowired;/<code>
<code>import org.springframework.dao.DataAccessException;/<code>
<code>import org.springframework.data.redis.connection.RedisConnection;/<code>
<code>import org.springframework.data.redis.core.RedisCallback;/<code>
<code>import org.springframework.data.redis.core.RedisTemplate;/<code>
<code>import com.x.redis.dao.UserDao;/<code>
<code>import com.x.redis.pojo.User;/<code>
<code>public class UserDAOImpl implements UserDao {/<code>
<code>        public void saveUser(final User user) {/<code>
<code>            redisTemplate.execute(new RedisCallback<object>() {/<object>/<code>
<code>                @Override/<code>
<code>                public Object doInRedis(RedisConnection connection) throws DataAccessException {/<code>
<code>                    connection.set(redisTemplate.getStringSerializer().serialize("user.uid." + user.getId()),/<code>
<code>                                   redisTemplate.getStringSerializer().serialize(user.getName()));/<code>
<code>                    return null;/<code>
<code>                }/<code>
<code>            });/<code>
<code>        }/<code>
<code>        @Override/<code>
<code>        public User getUser(final long id) {/<code>
<code>            return redisTemplate.execute(new RedisCallback<user>() {/<user>/<code>
<code>                @Override/<code>
<code>                public User doInRedis(RedisConnection connection) throws DataAccessException {/<code>
<code>                    byte[] key = redisTemplate.getStringSerializer().serialize("user.uid." + id);/<code>
<code>                    if (connection.exists(key)) {/<code>
<code>                        byte[] value = connection.get(key);/<code>
<code>                        String name = redisTemplate.getStringSerializer().deserialize(value);/<code>
<code>                        User user = new User();/<code>
<code>                        user.setName(name);/<code>
<code>                        user.setId(id);/<code>
<code>                        return user;/<code>
<code>                    }/<code>
<code>                    return null;/<code>
<code>                }/<code>
<code>            });/<code>
<code>        }/<code>
<code>}/<code>
  • Template.java
<code>package com.x.redis.template;/<code>
<code>import org.springframework.context.ApplicationContext;/<code>
<code>import org.springframework.context.support.ClassPathXmlApplicationContext;/<code>
<code>import com.x.redis.dao.imp.UserDAOImpl;/<code>
<code>import com.x.redis.pojo.User;/<code>
<code>public class Temolate {/<code>
<code>    public static void main(String[] args) {/<code>
<code>        ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/AplicationContex.xml");/<code>
<code>        UserDAOImpl userDAOImpl = (UserDAOImpl) ac.getBean("userDAO");/<code>
<code>        User user1 = new User();/<code>
<code>        user1.setId(1);/<code>
<code>        user1.setName("Hi~Redis");/<code>
<code>        userDAOImpl.saveUser(user1);/<code>
<code>        User user2 = userDAOImpl.getUser(1);/<code>
<code>        System.out.println(user2.getName());/<code>
<code>    }/<code>
<code>}/<code>


运行结果:

Redis 讲解系列之 与Spring集成

总结

总的来说Spring+Spring-data-redis整合算是一种比较官方比较主流的方式,下面我们总结一下Spring+Spring-data-redis整合的优缺点:

  • 缺点

对Jedispool的封装过于完美以至于当完美需要灵活使用jedispool的时候无法自定义。

RedisCliTemplate想对较复杂,而且每次要获得RedisClientTemplate有需要RedisConnection的协助,这点在UserDaoImpl.java的两个方法中提现地尤为突出。

…..

  • 优点

配置优雅,封装集成度高。

….

Redis 讲解系列之 与Spring集成(二)

上章中我们讲解了如何使用spring与spring-data-redis如何整合在一起同时总结出了一些优缺点,正对于缺点的优化和改善,本章将讲解一种高自定获取Jedispool和RedisClientTemplate的方法。

实例

新建Maven web项目,并自定义Build path source folde。

Redis 讲解系列之 与Spring集成

文件代码

  • pom.xml
<code><project>/<code>
<code>    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">/<code>
<code>    <modelversion>4.0.0/<modelversion>/<code>
<code>    <groupid>com.sstps.redis/<groupid>/<code>
<code>    <artifactid>Template1/<artifactid>/<code>
<code>    <version>0.0.1-SNAPSHOT/<version>/<code>
<code>    <packaging>war/<packaging>/<code>
<code>    <properties>/<code>
<code>        <project.build.sourceencoding>UTF-8/<project.build.sourceencoding>/<code>
<code>    /<code>
<code>    <dependencies>/<code>
<code>        <dependency>/<code>
<code>            <groupid>org.springframework.data/<groupid>/<code>
<code>            <artifactid>spring-data-redis/<artifactid>/<code>
<code>            <version>1.0.2.RELEASE/<version>/<code>
<code>        /<code>
<code>        <dependency>/<code>
<code>            <groupid>org.springframework/<groupid>/<code>
<code>            <artifactid>spring-core/<artifactid>/<code>
<code>            <version>3.1.2.RELEASE/<version>/<code>
<code>        /<code>
<code>        /<code>
<code>        <dependency>/<code>
<code>            <groupid>org.springframework/<groupid>/<code>
<code>            <artifactid>spring-web/<artifactid>/<code>
<code>            <version>3.1.2.RELEASE/<version>/<code>
<code>        /<code>
<code>        <dependency>/<code>
<code>            <groupid>redis.clients/<groupid>/<code>
<code>            <artifactid>jedis/<artifactid>/<code>
<code>            <version>2.4.2/<version>/<code>
<code>        /<code>
<code>        /<code>
<code>        <dependency>/<code>
<code>            <groupid>commons-logging/<groupid>/<code>
<code>            <artifactid>commons-logging/<artifactid>/<code>
<code>            <version>1.1.1/<version>/<code>
<code>            <scope>provided/<scope>/<code>
<code>        /<code>
<code>    /<code>
<code>
  • redis.properties
<code># Redis settings/<code> 
<code>redis.host=127.0.0.1/<code>
<code>redis.port=6379/<code>
<code>redis.password=wljr/<code>
<code>redis.timeout=3000/<code>
<code>redis.maxIdle=300/<code>
<code>redis.maxTotal=600/<code>
<code>redis.maxWait=1000/<code>
<code>redis.testOnBorrow=true/<code>
<code>redis.testOnReturn=true/<code>
  • AplicationContext.xml
<code>/<code>
<code><beans>/<code>
<code>    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/<code>
<code>    xmlns:aop="http://www.springframework.org/schema/aop"/<code>
<code>    xmlns:context="http://www.springframework.org/schema/context"/<code>
<code>    xmlns:tx="http://www.springframework.org/schema/tx"/<code>
<code>    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd/<code>
<code>        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd/<code>
<code>        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd/<code>
<code>        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">/<code>
<code>/<code>
<code><annotation-config>/<code>
<code> 
/<code>
<code><component-scan>/<code>
<code>/<code>
<code><bean>/<code>
<code>    <property>/<code>
<code>        <list>/<code>
<code>            <value>/WEB-INF/classes/redis.properties/<value>/<code>
<code>        /<code>
<code>    /<code>
<code>
<code>/<code>
<code>/<code>
<code><bean>/<code>
<code>    <property>/<code>
<code>
<code>/<code>
<code><bean>/<code>
<code>    <property>/<code>
<code>
<code>/<code>
<code><bean>/<code>
<code>    <property>  /<code>
<code>    <property>/<code>
<code>    <property>/<code>
<code>    <property>/<code>
<code>    <property>/<code>
<code>
<code>/<code>
<code><bean>/<code>
<code>     <constructor-arg>/<code>
<code>      <constructor-arg>/<code>
<code>      <constructor-arg>/<code>
<code>      <constructor-arg>/<code>
<code>      <constructor-arg>/<code>
<code>
<code>/<code>
<code>
  • RedisDataSource.java
  1. package com.sstps.redis;
  2. import redis.clients.jedis.Jedis;
  3. public interface RedisDataSource {
  4. // 取得redis的客户端,可以执行命令了。
  5. public abstract Jedis getRedisClient();
  6. //将资源返还给pool
  7. public void returnResource(Jedis shardedJedis);
  8. //出现异常后,将资源返还给pool
  9. public void returnResource(Jedis shardedJedis,boolean broken);
  10. }
  • RedisDataSourceImpl.java
  1. package com.sstps.redis;
  2. import org.apache.commons.logging.Log;
  3. import org.apache.commons.logging.LogFactory;
  4. import redis.clients.jedis.Jedis;
  5. import redis.clients.jedis.JedisPool;
  6. public class RedisDataSourceImpl implements RedisDataSource {
  7. public static Log log = LogFactory.getLog(RedisDataSourceImpl.class);
  8. private JedisPool jedisPool;
  9. public JedisPool getJedisPool() {
  10. return jedisPool;
  11. }
  12. public void setJedisPool(JedisPool JedisPool) {
  13. this.jedisPool = JedisPool;
  14. }
  15. public Jedis getRedisClient() {
  16. try {
  17. Jedis shardJedis = jedisPool.getResource();
  18. return shardJedis;
  19. } catch (Exception e) {
  20. log.error("getRedisClent error", e);
  21. }
  22. return null;
  23. }
  24. public void returnResource(Jedis Jedis) {
  25. jedisPool.returnResource(Jedis);
  26. }
  27. public void returnResource(Jedis Jedis, boolean broken) {
  28. if (broken) {
  29. jedisPool.returnBrokenResource(Jedis);
  30. } else {
  31. jedisPool.returnResource(Jedis);
  32. }
  33. }
  34. }
  • Template.java
  1. package com.sstps.template;
  2. import org.springframework.context.ApplicationContext;
  3. import org.springframework.context.support.ClassPathXmlApplicationContext;
  4. import com.sstps.redis.RedisClientTemplate;
  5. public class Template {
  6. public static void main(String[] args) {
  7. ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/AplicationContext.xml");
  8. RedisClientTemplate redisClient = (RedisClientTemplate)ac.getBean("redisClientTemplate");
  9. redisClient.set("a", "Hi~Redis");
  10. System.out.println(redisClient.get("a"));
  11. }
  12. }
  • RedisClientTemplate.java

总结

Redis与Spring直接整合,而对RedisClientTemplate和JedisPool做了剥离和二次封装。下面我们总结一下本章方法的优缺点:

缺点

代码较冗余,毕竟是二次封装,从RedisClientTemplate.java即可看出。

…..

-

优点

使用体验极好,不要考虑考虑新建或者归还jedispool的问题。使用时直接使用RedisClientTemplate即可。

优化点

考虑将本章例子的Redis打成jar包已依赖的方式导入,然后在AplictionContext.xml完成同样的配置,这样依赖代码既不冗余,灵活性和实用性极高了。


分享到:


相關文章: