Springboot-集成Redis 配置双Redis操作模板 -批量模糊根据key删除数据
pom.xml 导入jar包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
application-development.yml 配置 或者叫:application.yml
#spring-ehcache的配置
cache:
type: redis # redis/ehcache, 在这里设置你使用的缓存框架,如果不想使用redis,请改成ehcache
ehcache:
config: classpath:ehcache.xml
redis:
host: localhost
port: 6379
expireTime: 3600000 #单位秒
java代码配置 配置双实例 因为框架已经用了
redisTemplate 了 且用object做了 key的代码开发,为避免不影响使用
redisTemplate 的代码失效,所以新配置一个实例 用String 做key 可以模糊匹配key
redisTemplate2 对key做了序列化处理,所以可以使用
Set<String> keys = redisTemplate.keys(pattern); 这个功能
package com.jeeplus.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.StringRedisSerializer; /** * redis缓存配置 */ @ConditionalOnProperty(name = "spring.cache.type", havingValue = "redis") @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { /** * RedisTemplate配置 * * @param connectionFactory * @return */ @Bean(name="redisTemplate") public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) { // 配置redisTemplate RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(connectionFactory); return redisTemplate; } @Bean(name="redisTemplate2") public RedisTemplate<String, Object> redisTemplate2(RedisConnectionFactory connectionFactory) { // 配置redisTemplate RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); // key的序列化采用StringRedisSerializer redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setConnectionFactory(connectionFactory); return redisTemplate; } @Bean public CacheManager cacheManager(RedisConnectionFactory connectionFactory) { //初始化一个RedisCacheWriter RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(connectionFactory); //设置CacheManager的值序列化方式为JdkSerializationRedisSerializer,但其实RedisCacheConfiguration默认就是使用StringRedisSerializer序列化key,JdkSerializationRedisSerializer序列化value,所以以下注释代码为默认实现 ClassLoader loader = this.getClass().getClassLoader(); JdkSerializationRedisSerializer jdkSerializer = new JdkSerializationRedisSerializer(loader); RedisSerializationContext.SerializationPair<Object> pair = RedisSerializationContext.SerializationPair.fromSerializer(jdkSerializer); RedisCacheConfiguration defaultCacheConfig=RedisCacheConfiguration.defaultCacheConfig().serializeValuesWith(pair); //初始化RedisCacheManager RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, defaultCacheConfig); return cacheManager; } }
使用的时候注入 记得 标明要注入那个实例
@Resource(name="redisTemplate2") private RedisTemplate redisTemplate;
@Resource(name="redisTemplate") private RedisTemplate redisTemplate;
封装一个 针对redisTemplate2 实例批量删除模糊匹配删除key的代码
package com.jeeplus.modules.utils; import org.springframework.data.redis.core.RedisTemplate; import java.util.Set; public class RedisUtil { /** * 批量模糊匹配删除key对应的值 * @param redisTemplate * @param pattern */ public static void redisDeletes(RedisTemplate redisTemplate, String pattern){ Set<String> keys = redisTemplate.keys(pattern); redisTemplate.delete(keys); } }
代码中批量模糊删除key的应用 * 号代办匹配以此为前缀所有的key 都会删除
String key=Constants.REDIS_KEY_OFFICIALTIME+"userId_"+examEnrollRecord.getUserId()+"_page_*";
RedisUtil.redisDeletes(redisTemplate,key);