首先报一下我本身的应用前提,项目由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条记录左右(由于测试中打的时间戳是一致的),可能具体速度受到服务器的限制。