springboot 缓存技术自定义key生成

在我们开发中经常碰到一个方法总是执行的很慢,但是这个方法对数据的实时准确度要求不是很高的时候,我们可以使用缓存技术来优化。

开始

首先你的引入这个jar包

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-cache</artifactId>
	</dependency>

接着就是你要告诉配置文件一些基本信息:比如

#cache
spring.cache.type=simple
spring.cache.cache-names=spm-cache

然后你得让你的springboot知道你要开始使用缓存了

package com.wwx.config;

import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.cache.Cache;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.concurrent.ConcurrentMapCache;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.cache.support.SimpleCacheManager;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableCaching//我们开启缓存了
public class SimpleCacheConfigurer{

@Bean
public SimpleCacheManager simpleCacheManager(){//springboot支持的缓存有很多,我们选择一个最为简单的
	SimpleCacheManager s = new SimpleCacheManager();
	s.setCaches(Collections.singletonList(new ConcurrentMapCache("people")));
	return s;
}
@Bean
public KeyGenerator cacheKeyGenerator(){//缓存key生成者
	CacheKeyGenerator cacheKeyGenerator = new CacheKeyGenerator();
	return cacheKeyGenerator;
	
}

}
下面是keyGenerator的代码

package com.wwx.config;

import java.io.UnsupportedEncodingException;
import java.lang.reflect.Method;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.Map;
import org.apache.tomcat.util.security.MD5Encoder;
import org.springframework.cache.interceptor.KeyGenerator;

import com.alibaba.fastjson.JSONObject;

public class CacheKeyGenerator implements KeyGenerator {

@Override
public Object generate(Object target, Method method, Object... params) {
	// TODO Auto-generated method stub
	Map<String, Object> map = new HashMap<String, Object>();
	map.put("target", target.getClass().toGenericString());//放入target的名字
	map.put("method", method.getName());//放入method的名字
	if (params != null && params.length > 0) {//把所有参数放进去
		int i = 0;
		for (Object o : params) {
			map.put("params-" + i, o);
			i++;
		}
	}
	String str = JSONObject.toJSON(map).toString();
	byte[] hash = null;
	String s = null;
	try {
		hash = MessageDigest.getInstance("MD5").digest(str.getBytes("UTF-8"));
	} catch (NoSuchAlgorithmException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	} catch (UnsupportedEncodingException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	s=MD5Encoder.encode(hash);//使用MD5生成位移key
	return s;
}

}
最后我们可以这样使用

package com.wwx.service;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

import com.wwx.entity.Person;

@Service
public class TestService {

@CachePut(key="#person.id",value="people")
public Person save(Person person){
	System.err.println("save person is ok!");
	return person;
}	
@Cacheable(key="#id",value="people")
public Person findPersonById(Long id){
	System.err.println("get one person!");
	return new Person();
}
//上面的两个方法的代码可以忽略
@Cacheable(keyGenerator="cacheKeyGenerator",value="people")
public Person findPersonByFuza(Person person){//这里是比较复杂的查询条件,实际中可能是HashMap之类存在各种参数的东东
	System.err.println("go go go go!");
	return person;
}

}

这里简单解释一下@Cachable的使用,

在方法执行前Spring先查看缓存中是否有这个key的数据,如果有数据,则直接返回缓存数据;如果没有数据,调用

方法将返回值放进缓存。

这里我们要注意一点就是几乎所有的缓存支持几乎都要返回值,因为这个是我们给Spring要缓存的数据,试着想一下

如果没有返回值,你缓存个毛线啊。


作者:plusme-0
来源:CSDN
原文:https://blog.csdn.net/qq_32771571/article/details/80040861
版权声明:本文为博主原创文章,转载请附上博文链接!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值