Redis 講解系列之 與Spring集成

本章我們將實例講解Redis如何與Spring整合。由於Redis與Spring的整合手段比較多,本章將著重講解Spring與Spring-data-redis整合。

實例

新建Maven web項目,並將指定build path source folder。

項目結構

Customize build path source folder。

文件代碼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>


運行結果:

總結

總的來說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。

文件代碼

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.javapackage com.sstps.redis;import redis.clients.jedis.Jedis;public interface RedisDataSource { // 取得redis的客戶端,可以執行命令了。 public abstract Jedis getRedisClient(); //將資源返還給pool public void returnResource(Jedis shardedJedis); //出現異常後,將資源返還給pool public void returnResource(Jedis shardedJedis,boolean broken);}RedisDataSourceImpl.javapackage com.sstps.redis;import org.apache.commons.logging.Log;import org.apache.commons.logging.LogFactory;import redis.clients.jedis.Jedis;import redis.clients.jedis.JedisPool;public class RedisDataSourceImpl implements RedisDataSource { public static Log log = LogFactory.getLog(RedisDataSourceImpl.class); private JedisPool jedisPool; public JedisPool getJedisPool() { return jedisPool; } public void setJedisPool(JedisPool JedisPool) { this.jedisPool = JedisPool; } public Jedis getRedisClient() { try { Jedis shardJedis = jedisPool.getResource(); return shardJedis; } catch (Exception e) { log.error("getRedisClent error", e); } return null; } public void returnResource(Jedis Jedis) { jedisPool.returnResource(Jedis); } public void returnResource(Jedis Jedis, boolean broken) { if (broken) { jedisPool.returnBrokenResource(Jedis); } else { jedisPool.returnResource(Jedis); } }}Template.javapackage com.sstps.template;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.sstps.redis.RedisClientTemplate;public class Template { public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/AplicationContext.xml"); RedisClientTemplate redisClient = (RedisClientTemplate)ac.getBean("redisClientTemplate"); redisClient.set("a", "Hi~Redis"); System.out.println(redisClient.get("a")); }}RedisClientTemplate.java

總結

Redis與Spring直接整合,而對RedisClientTemplate和JedisPool做了剝離和二次封裝。下面我們總結一下本章方法的優缺點:

缺點

代碼較冗餘,畢竟是二次封裝,從RedisClientTemplate.java即可看出。

…..

-

優點

使用體驗極好,不要考慮考慮新建或者歸還jedispool的問題。使用時直接使用RedisClientTemplate即可。

優化點

考慮將本章例子的Redis打成jar包已依賴的方式導入,然後在AplictionContext.xml完成同樣的配置,這樣依賴代碼既不冗餘,靈活性和實用性極高了。