Spring 调用 Redis -- RedisTemplate 的基本配置和使用

2016-08-15 15:25:59   最后更新: 2016-08-15 15:29:12   访问数量:1701




redis 是目前最常用的开源缓存系统之一,它具有丰富的缓存数据结构、支持事务、院子操作等等特性,在实际的生产环境中有着非常丰富的用途

java 有 jedis 用来操作 redis,在此基础上,spring 封装成为了 RedisTemplate 对象来进行各种操作,它支持所有的 redis 原生的 api,本篇日志中就对此进行一个基本的介绍

 

首先,需要引入 jar 包:

<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>

 

 

具体的版本可以在 http://mvnrepository.com/ 中查找最新的版本

 

在 applicationContext.xml 中需要增加 redis 连接池和连接工厂对象以及 RedisTemplate 的配置:

<!-- redis 连接池配置 --> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="5" /> <property name="minIdle" value="1" /> <property name="maxTotal" value="1000" /> <property name="maxWaitMillis" value="2000" /> <!-- 获得一个jedis实例的时候是否通过 ping() 检查连接可用性 --> <property name="testOnBorrow" value="true" /> <!-- return 一个jedis实例给pool时,是否通过 ping() 检查连接可用性 --> <property name="testOnReturn" value="true" /> <!-- idle状态监测用异步线程evict进行检查 --> <property name="testWhileIdle" value="true" /> <!-- 一次最多evict的pool里的jedis实例个数 --> <property name="numTestsPerEvictionRun" value="100" /> <!-- test idle 线程的时间间隔 --> <property name="timeBetweenEvictionRunsMillis" value="60000" /> </bean> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:hostName="127.0.0.1" p:port="6379" p:poolConfig-ref="poolConfig" /> <bean id="stringSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="connectionFactory" /> <property name="keySerializer" ref="stringSerializer" /> <!-- 开启事务,可以通过transcational注解控制 --> <property name="enableTransactionSupport" value="true" /> </bean>

 

 

依赖和配置都已经 OK,接下来就可以将 redisTemplate 注入到 java 代码里,实现对 Redis 的操作了:

package com.techlog.test.service; import org.springframework.dao.DataAccessException; import org.springframework.data.redis.connection.RedisConnection; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import javax.annotation.Resource; /** * Created by techlog on 16/8/15. */ @Service("testReids") public class TestRedis { @Resource private RedisTemplate<String, String> redisTemplate; public void testSet() { redisTemplate.execute(new RedisCallback<Boolean>() { @Override public Boolean doInRedis(RedisConnection redisConnection) throws DataAccessException { redisConnection.hSet( "tempkey".getBytes(), "hello".getBytes(), "world".getBytes()); return true; } }); } }

 

 

我们可以通过 junit 来调用他:

package com.techlog.test.service import org.junit.Test import org.junit.runner.RunWith import org.springframework.test.context.ContextConfiguration import org.springframework.test.context.junit4.SpringJUnit4ClassRunner import javax.annotation.Resource /** * Created by techlog on 16/8/15. */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration("classpath:applicationContext.xml") class TestRedisTest { @Resource private TestRedis testRedis; @Test public void testTestSet() throws Exception { testRedis.testSet(); } }

 

 

执行脚本,再通过 redis-client 查看,可以看到相应的数据已经写入到 Redis 中了:

 

 

本文只是对 RedisTemplate 的最基本的用法的一个介绍

RedisTemplate 提供了非常丰富的方法,这些方法基本上都是通过他的 execute 方法实现的,因此在上文中我们直接使用了 execute 方法完成我们的操作,通过查看 jar 包中的方法可以进一步学习 RedisTemplate 提供的各种方法

execute 是对原生 Redis 命令的通用性支持,通过 Executor 框架和连接池实现 Redis 并发访问

他以一个 RedisCallback<T> 接口作为参数,这个接口的 T 类型就是接口唯一的方法 doInRedis 的返回类型

这个方法也就是 execute 方法实际调用的方法,他以 RedisConnection 对象作为参数,RedisConnection 又继承自 RedisCommands 类,RedisCommands 继承自:

  • RedisKeyCommands
  • RedisStringCommands
  • RedisListCommands
  • RedisSetCommands
  • RedisZSetCommands
  • RedisHashCommands
  • RedisTxCommands
  • RedisPubSubCommands
  • RedisConnectionCommands
  • RedisServerCommands
  • RedisScriptingCommands
  • HyperLogLogCommands

他们分别实现了对 Redis 一种数据结构的 API 调用,因此,你可以通过 RedisConnection 对象实现所有 Redis 支持的丰富操作

 






技术帖      技术分享      redis      连接池      java      spring      maven      redistemplate      pom.xml      jedis     


京ICP备15018585号