REDIS学习(3.2)spring boot 使用redis作为缓存

一,指定主键的生成规则

在3.1的基础上修改RedisConfig

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
	@Bean
	public KeyGenerator smpkeyGenerator() {
		return new KeyGenerator() {
			@Override
			public Object generate(Object target, Method method, Object... params) {
				StringBuilder sb = new StringBuilder();
				sb.append(target.getClass().getSimpleName());
				sb.append(method.getName());
				for (Object o : params) {
					sb.append("_").append(o.toString());
				}
				return sb.toString();
			}
		};
<span style="white-space:pre">	</span>} }

相关的方法要加上keyGenerator="smpkeyGenerator"

	@Cacheable(value = "usercache", keyGenerator="smpkeyGenerator")
	public User getUser(String no,String name){
		LogCore.BASE.debug("invoke persistent:{},{}", no, name);
		return new User(no, name);
	}

如果不用keyGenerator的话可以直接使用SpEL表达式来描述key的生成规则

例如

	@CacheEvict(value = "usercache", key="#no+'_'+#name")
	public boolean clearUser(String no,String name){
		LogCore.BASE.debug("invoke clear:{},{}", no, name);
		return true;
	}

http://localhost:8084/redis/test?name=lee&no=001

在redis存的键值为

usercache~keys

\xAC\xED\x00\x05t\x00\x1BRedisServicegetUser_001_lee

二,指定序列化方式

user去掉序列化标记接口serializable

public class User{
	public String no;
	public String name;
<span style="white-space:pre">	</span>public User(){}
	public User(String no, String name) {
		this.no = no;
		this.name = name;
	}
}
修改RedisConfig,增加CacheManager和RedisTemplate的bean注入


@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
	@Bean
	public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
		RedisCacheManager manager = new RedisCacheManager(redisTemplate);
		manager.setDefaultExpiration(20);//设置默认过期时间
		return manager;
	}

	@Bean
	public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
		StringRedisTemplate template = new StringRedisTemplate(factory);
		Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(Object.class);
		ObjectMapper om = new ObjectMapper();
		om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
		om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
		jackson2JsonRedisSerializer.setObjectMapper(om);
		template.setValueSerializer(jackson2JsonRedisSerializer);
		template.afterPropertiesSet();
		return template;
	}
	
	@Bean
	public KeyGenerator smpkeyGenerator() {
		return new KeyGenerator() {
			@Override
			public Object generate(Object target, Method method, Object... params) {
				StringBuilder sb = new StringBuilder();
				//sb.append(target.getClass().getSimpleName());
				//sb.append(method.getName());
				for (Object o : params) {
					sb.append("_").append(o.toString());
				}
				return sb.toString();
			}
		};
	}
}

三,用SPEL表达式控制添加缓存的条件

如下:只有name不为null, 且返回结果不为null的时候才加入缓存

	@Cacheable(value = "usercache", keyGenerator = "smpkeyGenerator",condition="#name!=null", unless = "#result==null")
	public User getUser(String no, String name) {
		LogCore.BASE.debug("invoke getUser:{},{}", no, name);
		if (Util.anyNonEmpty(no, name)) {
			return new User(no, name);
		}
		return null;
	}




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值