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要缓存的数据,试着想一下

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


以上信息部分引用来自《JavaEE开发的颠覆者SpringBoot实战》

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Spring Boot 中整合 Velocity 并使用自定义标签,可以按照以下步骤进行: 1. 导入相关依赖 在 `pom.xml` 文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-velocity</artifactId> </dependency> <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity-tools</artifactId> <version>2.0</version> </dependency> ``` 2. 配置 Velocity 在 `application.properties` 文件中添加以下配置: ```properties spring.velocity.resource-loader-path=classpath:/templates/ spring.velocity.toolbox-config-location=velocity.toolbox.xml ``` 其中,`resource-loader-path` 配置 Velocity 模板所在的目录,`toolbox-config-location` 配置 Velocity 工具箱的配置文件路径。 3. 定义自定义标签 在 `velocity.toolbox.xml` 文件中定义自定义标签,例如: ```xml <tools> <toolbox scope="application"> <tool key="myTag" class="com.example.MyTag"/> </toolbox> </tools> ``` 其中,`key` 是标签名,`class` 是标签类的完整路径。 4. 实现自定义标签类 在项目中创建 `MyTag` 类,并实现 `org.apache.velocity.tools.generic.SafeConfig` 接口和 `org.apache.velocity.tools.generic.Tool` 接口,例如: ```java public class MyTag implements SafeConfig, Tool { private String name; @Override public void configure(Map<String, Object> map) { this.name = (String) map.get("name"); } public String execute() { return "Hello, " + name + "!"; } } ``` 其中,`configure` 方法用于获取配置信息,`execute` 方法用于执行标签的逻辑。 5. 在模板中使用自定义标签 在模板中使用自定义标签,例如: ``` <myTag name="world"/> ``` 这样就可以在模板中使用自定义标签了。 以上就是 Spring Boot 整合 Velocity 并使用自定义标签的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值