首先報一下我本身的應用前提,項目由SpringMVC框架,使用Maven結構java
第一步:引入jar包,如今最新的是2.6.2應該,之前的版本會有出入,非要對比版本請本身查文檔。web
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.2</version> </dependency>
第二步:引入配置xml配置文件,這裏我命名爲spring-redis.xmlredis
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:property-placeholder location="classpath:resource.properties" /> <bean id="redisClientTemplate" class="com.aneop.common.jedis.RedisClientTemplate"></bean> <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${jedis_max_idle}" /> <property name="maxTotal" value="${jedis_max_active}" /> <property name="maxWaitMillis" value="${jedis_max_wait}" /> <property name="testOnBorrow" value="${jedis_test_on_borrow}" /> </bean> <bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool" scope="singleton"> <constructor-arg index="0" ref="jedisPoolConfig" /> <constructor-arg index="1"> <list> <bean class="redis.clients.jedis.JedisShardInfo"> <property name="password" value="${redis.pass}"></property> <constructor-arg name="host" value="${redis.host}" /> <constructor-arg name="port" value="${redis.port}" /> <constructor-arg name="timeout" value="${redis.timeout}" /> </bean> </list> </constructor-arg> </bean> <bean id="redisDataSource" class="com.aneop.common.jedis.RedisDataSourceImpl"></bean> </beans>
這裏要注意jedisPoolConfig屬性值,其中的jedis容量的屬性理應是這個maxActive,可是若是你用這個的話會報錯,在啓動時報jedisPoolConfig類中沒有getMaxAcive的方法,這裏要經過另外一個屬性來搞 maxTotal,效果是同樣的,當時在測試的時候很累的,若是不寫的話,池的默認大小是8.同時你也看到了,我引入了配置文件resource.properties.貼出相應的參數值在下方,私密信息我用pig-man來代替spring
jedis_max_active=1024 jedis_max_idle=10 jedis_max_wait=10000 jedis_time_out=5000 jedis_test_on_borrow=true redis.host=pig-man(eg:192.168.3.15) redis.port=6379 redis.pass=pig-man(eg:123456) redis.timeout=6000
第三步:向你的dispatch-servlet.xml也好,或是你在web.xml更改了你的啓動配置xml文件添加這一句apache
<import resource="classpath:spring/spring-redis.xml" />
來吧咱們的spring-redis.xml導入。服務器
這樣基本的配置就完成了,若是我沒有記錯的話,框架
第四部:咱們來完成jedis的servece和客戶端的封裝測試
創建接口
spa
public interface RedisDataSource { public ShardedJedis getRedisClient(); public void returnResource(ShardedJedis shardedJedis); public void returnResource(ShardedJedis shardedJedis,boolean broken); }
創建接口的implementscode
public class RedisDataSourceImpl implements RedisDataSource { private static final Logger log = LoggerFactory.getLogger(RedisDataSourceImpl.class); public ShardedJedis getRedisClient() { try { ShardedJedisPool shardedJedisPool = (ShardedJedisPool)ApplicationContextUtil.getBean("shardedJedisPool"); ShardedJedis shardJedis = shardedJedisPool.getResource(); return shardJedis; } catch (Exception e) { log.error("getRedisClent error", e); } return null; } public void returnResource(ShardedJedis shardedJedis) { ShardedJedisPool shardedJedisPool = (ShardedJedisPool)ApplicationContextUtil.getBean("shardedJedisPool"); shardedJedisPool.returnResource(shardedJedis); } public void returnResource(ShardedJedis shardedJedis, boolean broken) { ShardedJedisPool shardedJedisPool = (ShardedJedisPool)ApplicationContextUtil.getBean("shardedJedisPool"); if (broken) { shardedJedisPool.returnBrokenResource(shardedJedis); } else { shardedJedisPool.returnResource(shardedJedis); } } }
再次高度封裝jedis的客戶端
public class RedisClientTemplate { private static final Logger log = LoggerFactory.getLogger(RedisClientTemplate.class); // private RedisDataSourceImpl redisDataSource; public void disconnect() { RedisDataSource redisDataSource=(RedisDataSource)ApplicationContextUtil.getBean("redisDataSource"); ShardedJedis shardedJedis = redisDataSource.getRedisClient(); shardedJedis.disconnect(); } /** * 設置單個值 * * @param key * @param value * @return */ public String set(String key, String value) { String result = null; RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource"); ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.set(key, value); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } /** * 獲取單個值 * * @param key * @return */ public String get(String key) { String result = null; RedisDataSource redisDataSource=(RedisDataSource)ApplicationContextUtil.getBean("redisDataSource"); ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.get(key); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public String hmset(String key, Map<String, String> hash) { String result = null; RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource"); ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.hmset(key, hash); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public List<String> hmget(String key, String... fields) { List<String> result = null; RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource"); ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.hmget(key, fields); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public Map<String, String> hgetAll(String key) { Map<String, String> result = null; RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource"); ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.hgetAll(key); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } public Long hdel(String key, String field) { Long result = null; RedisDataSourceImpl redisDataSource=(RedisDataSourceImpl)ApplicationContextUtil.getBean("redisDataSource"); ShardedJedis shardedJedis = redisDataSource.getRedisClient(); if (shardedJedis == null) { return result; } boolean broken = false; try { result = shardedJedis.hdel(key, field); } catch (Exception e) { log.error(e.getMessage(), e); broken = true; } finally { redisDataSource.returnResource(shardedJedis, broken); } return result; } }
這樣個人一個擁有添加記錄,刪除記錄,添加map,刪除map,取map的基本技能的客戶端了
第五步:jedis客戶端測試
狀況一:
public static void main(String[] args) { ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:/spring/spring-redis.xml"); RedisClientTemplate redisClient = (RedisClientTemplate)ac.getBean("redisClientTemplate"); redisClient.set("a", "abc"); System.out.println(redisClient.get("a")); }
這種鏈接方式被我直接用前段時間寫的ApplicationContextUtil來改寫了,因而就有了
狀況二:
RedisClientTemplate redisClient = (RedisClientTemplate) ApplicationContextUtil.getBean("redisClientTemplate"); Map<String,String> map =new HashMap<String,String>(); map.put("a", "abc"); redisClient.hmset("abc_op",map); Map<String,String> resultMap = new HashMap<String,String>(); resultMap = redisClient.hgetall("abc_op"); System.out.pringln(resultMap.size()); redisClient.disconnect();
在db0庫裏就能夠找到你剛纔命名爲abc_op的空間,其中也能找到你插入的map.
這個方法比上次說起的Redisson要快不少,由於配置文件中有休眠一個有效時間,在有效時間內是不會再去鏈接斷開redis的,從而省了很大時間,一毫秒在45條記錄左右(由於測試中打的時間戳是一致的),可能具體速度受到服務器的限制。