spring和redis相关操作的整合

版本要求: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配置需要事务的配置也行。后面会继续更新其他操作

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值