spring-data-redis是spring-data模块的一部分,专门用来支持在spring管理项目对redis的操做,使用java操做redis最经常使用的是使用jedis,但并非只有jedis可使用,像jdbc-redis,jredis也都属于redis的java客户端,他们之间是没法兼容的,若是你在一个项目中使用了jedis,而后后来决定弃用掉改用jdbc-redis就比较麻烦了,spring-data-redis提供了redis的java客户端的抽象,在开发中能够忽略掉切换具体的客户端所带来的影响,并且他自己就属于spring的一部分,比起单纯的使用jedis,更加稳定.管理起来更加自动化.(固然jedis的缺点不止以上).java
1.自动管理链接池,提供了一个高度封装的RedisTemplate类redis
2.针对jedis客户端的大量api进行了归类封装,把同一类型的操做封装成了Operation接口.支持redis中的五种数据类型的操做.spring
3.针对数据的"序列化与反序列化",提供了多种能够选择的策略(RedisSerializer)数据库
JdkSerializationRedisSerializer:当须要存储java对象时使用.apache
StringRedisSerializer:当须要存储string类型的字符串时使用.json
JacksonJsonRedisSerializer:将对象序列化成json的格式存储在redis中,须要jackson-json工具的支持,(目前我还没使用过,不了解)api
redisTemplate有两个方法常常用到,一个是opsForXXX一个是boundXXXOps,XXX是value的类型,前者获取到一个Opercation,可是没有指定操做的key,能够在一个链接(事务)内操做多个key以及对应的value;后者会获取到一个指定了key的operation,在一个链接内只操做这个key对应的value.数组
ValueOperations valueOperations = redisTemplate.opsForValue();浏览器
BoundValueOperations<String, User> boundValueOps = redisTemplate.boundValueOps("key");缓存
ValueOperation能够缓存Integer,String,java对象等类型.使用.set(key,value)方法进行设置,get(key)方法用来获取.
一样的方式能够获取ListOperations对象,能够用来缓存List,此外还有SetOperation,HashOperation
1.maven配置,添加pom依赖
1 <dependency> 2 <groupId>org.springframework.data</groupId> 3 <artifactId>spring-data-redis</artifactId> 4 <version>1.3.4.RELEASE</version> 5 </dependency> 6 7 <dependency> 8 <groupId>redis.clients</groupId> 9 <artifactId>jedis</artifactId> 10 <version>2.4.2</version> 11 </dependency>
2.spring-redis.xml配置:
<!--JedisPoolConfig 链接池参数配置--> <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig"> <!--最大空闲实例数--> <property name="maxIdle" value="300" /> <!--最大活跃实例数--> <property name="maxTotal" value="600" /> <!--建立实例时最长等待时间--> <property name="maxWaitMillis" value="1000" /> <!--建立实例时是否验证--> <property name="testOnBorrow" value="true" /> </bean> <!--JedisConnectionFactory 跟配置数据库链接池相似,须要配置JedisConnectionFactory来经过服务器或者链接池的方式获取redis服务器的链接--> <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"> <property name="hostName" value="127.0.0.1"/> <property name="port" value="6379"/> <property name="usePool" value="true"/> <property name="poolConfig" ref="poolConfig"/> </bean> <bean id="stringRedisSerializer" class="org.springframework.data.redis.serializer.StringRedisSerializer"/> <bean id="valueSerializer" class="org.springframework.data.redis.serializer.JdkSerializationRedisSerializer"/> <!-- redis模板配置 spring-data-redis提供了一个基础的泛型RedisTemplate封装了基础的crud操做--> <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"> <property name="connectionFactory" ref="connectionFactory"/> <property name="defaultSerializer" ref="stringRedisSerializer"/> <property name="keySerializer" ref="stringRedisSerializer"/> <property name="valueSerializer" ref="valueSerializer"/> </bean>
以上配置完成后,就可使用spring-data-redis了,为了演示一下具体的使用,这里接着写一个简单地demo.
3.建立实体类User
1 public class User implements Serializable { 2 3 private static final long serialVersionUID = 1L; 4 5 /** 用户ID */ 6 private Long id; 7 8 /** 用户名 */ 9 private String name; 10 11 /** 用户年龄 */ 12 private Integer age; 13 }
注意:若是须要向redis内存储pojo对象,那么该对象必需要实现Serializable接口,由于在redis中存储pojo类仍然存储的是string,它会把数据转化成byte[]数组的形式,在存取的时候就要对数据格式进行转化,就涉及到了序列化与反序列化.
4.建立UserCcontroller
@Controller public class UserController extends BaseController { @Autowired private IUserService userService; @Autowired private RedisTemplate<String,User> redisTemplate; @ResponseBody @RequestMapping("/redis") public Object redis() { User u1=new User(); u1.setId(1L); u1.setName("wang"); u1.setAge(22); redisTemplate.opsForValue().set("user:wang",u1); User u2=redisTemplate.opsForValue().get("user:wang"); return u2; } }
这里咱们将user对象存储到redis中,再读出来,运行项目,测试这个接口,就能够在浏览器中看到json格式的user对象.
最开始我测试spring-data-redis的功能是从一个空项目一点点配置的,启动时报了不少异常,下面一个一个来.
Caused by: java.lang.VerifyError: (class: org/springframework/data/redis/connection/jedis/JedisConnectionFactory,
method: afterPropertiesSet signature: ()V) Incompatible argument to function
缘由及解决方案:
在pom中我最开始配置的jedis版本是2.7.3,spring-data-redis版本是1.1.1,网上搜索了一翻,发现有一个说法是jedis-2.7.3.jar 和 spring-data-redis-1.1.1.RELEASE.jar 没法搭配使用,因而我把spring-data-redis的版本设成比较高的1.3.4,从新部署,果真此问题解决,紧接着问题又来了.
Caused by: Java.lang.NoSuchMethodError: redis.clients.jedis.JedisShardInfo.setTimeout(I)V
缘由及解决方案:一样是版本的问题(没错,都被我撞上了),jedis版本是2.7.3,过高了,改为2.4.3之后,问题解决.
java.lang.NoClassDefFoundError: org/apache/commons/pool/impl/GenericObjectPool
缘由及解决方案:这个GenericObjectPool使用到了commons-pool.jar中的类,咱们的依赖中没有这个jar,因此添加commons-pool的dependency便可.
HTTP Status 500 - Request processing failed; nested exception is java.lang.ClassCastException: com.baomidou.springmvc.model.system.User cannot be cast to java.lang.String
缘由及解决方案:在spring-redis配置文件中的redisTemplate的property中缺乏name="valueSerializer"的配置,由于存储在redis的value是user对象,须要使用JdkSerializationRedisSerializer对象进行对象的序列化操做,解决方案就是配置成上面spring-redis.xml的方式.