版本要求:Spring 5.x,spring-data-redis 2.0.x,jedis 2.9
maven:
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.0.8.RELEASE</version>
</dependency>
以前的版本可以通过spring.xml来配置,如下:
<cache:annotation-driven />
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxIdle" value="${redis.maxIdle}" />
<property name="maxTotal" value="${redis.maxActive}" />
<property name="maxWaitMillis" value="${redis.maxWait}" />
</bean>
<bean id="JedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
<property name="hostName" value="${redis.hostName}"></property>
<property name="database" value="${redis.database}"></property>
<property name="port" value="${redis.port}"></property>
<property name="timeout" value="${redis.timeout}"></property>
<property name="poolConfig" ref="poolConfig"></property>
<property name="usePool" value="true"></property>
</bean>
<bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
<property name="connectionFactory" ref="JedisConnectionFactory"></property>
</bean>
但现在由于set方法的过时,上面的配置方法不行了,报
NoSuchMethodError: org.springframework.util.Assert.isTrue(ZLjava/util/function/Supplier
这样的错误。现在可以通过@Configuration来配置,关于jedisConnectionFactory和redisTemplate的@Bean配置可看这个文章https://blog.csdn.net/wobupeiai/article/details/81047547里面的配置,注意你的IDE的java编译版本要1.8.这里面用到了接口的静态方法实现特性。
关于缓存,Springboot是自动注入了cachemanager,具体缓存存在哪里,有很多相关的解决方案,在spring中需要自己自己配置引入相应的驱动比如EhCache,redis等,默认是使用内存也就是用散列表ConcurrentMapCacheManager这个线程安全的hashmap来存储,在springboot中驱动的选择则是自动配置,引入了什么驱动,cache就选用哪一个,你在pom中引入了spring data redis starter则springboot就用redis做存储,但在Spring里我们需要自己配置,这里主要是来设置过期时间这些关于缓存的配置
@Bean
public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
.entryTtl(Duration.ofDays(30))
.disableCachingNullValues();
RedisCacheManager rcm=RedisCacheManager.builder(jedisConnectionFactory).
cacheDefaults(config).build();
return rcm;
}
然后开启注解在某个可以被Spring注解扫描的地方加上@EnableCaching来开启缓存,再通过缓存注解@CacheEvict和@CachePut等来设置需要缓存的方法,注意使用缓存时这个方法返回的结果应该是sql查询出来的对象不然缓存就没意义了。另外缓存还可以通过实现ibatis的Cache接口,在mybatis的mapper文件里开启二级缓存实现。
在mapper.xml文件里加入
<cache type="cn.springboot.cnm.util.RedisCache"/>
在更新(uid)相关的操作你加入flushCache="true"配置
这是两种方法,具体怎么实现Cache接口CSDN到处都是。
关于事务,redis也是有事务的,有两种方式实现:
List<Object> txresults=(List<Object>)redisTemplate.execute(new SessionCallback<List<Object>>() {
public List<Object> execute(RedisOperations ops) throws DataAccessException{
ops.multi();
ops.opsForValue().set("key", "never say never");
int u=2/0;
ops.opsForValue().set("oppo", "find x");
return ops.exec();
}
});
这是一种,不需要另外的任何配置。操作全放在execute方法的内部类里,另外一种就是通过Spring的事务了。Spring的事务首先要注入一个事务管理器,一种可以通过xml来配置,这个就不用多说了,一种也可以通过@Bean来配置
@Bean
public PlatformTransactionManager transactionManager() throws SQLException {
return new DataSourceTransactionManager(dataSource);
}
其中的datasource是在xml里配置,并注入到配置类中的。然后通过@Transactional来表明某个方法需要事务,这个方法中的redis操作就会被事务管理。当然通过spring.xml中的tx配置需要事务的配置也行。后面会继续更新其他操作