在Springboot中⼿写⼀个简单的本地缓存并在启动时加载数据到缓存中闲来⽆事,琢磨了⼀下,如果需要⽤到缓存,但是⼜刚好在没⽹络, 本地仓库⼜没有对应依赖的情况下,要怎么办。
这种情况下,就只能⼿动定义⼀个集合或Map,将要缓存的数据保存在⾥⾯。
但是会有不⽀持过期时间的问题。
所以就考虑了⼀下如何⾃定义⼀个缓存的⼯具类,可以实现类似单机版Redis的功能。
⾸先该类需要有保存数据和获取数据两个供⽤户使⽤的⽅法。
我的定义如下:
/**
* 向缓存中保存数据
* @param key
* @param value
*/
public void set(String key, Object value);
/**
* 向缓存中保存数据
* @param key
* @param value
* @param expire 数据有效期(过期时间)
*/
public void set(String key, Object value,long expire);
/**
* 从缓存中获取数据
* @param key
*/
public Object get(String key);
接下来是定义缓存的数据结构
这⾥我使⽤ConcurrentHashMap来保存数据,来应对并发情况。
private Map<String, CacheEntry> container =new ConcurrentHashMap<>();
该Map中的value项我定义为了CacheEntry. 这个类主要保存了该数据的值和过期时间。
class CacheEntry {
private long expireTime;
private Object value;
}
接下来是该类的完整代码:
@Component
public class LocalCache implements Serializable {
/**
* 缓存容器
*/
private Map<String, CacheEntry> container =new ConcurrentHashMap<>();
@Builder
@Data
static class CacheEntry {
private long expireTime;
private Object value;
}
/**
* 向缓存中保存数据
* @param key
* @param value
* @param value
*/
public void set(String key, Object value){
// 默认设置为永不过期,0代表永不过期
CacheEntry cacheNode = CacheEntry.builder()
.expireTime(0)
.
value(value)
.build();
// 将数据保存到容器中
适合新手的spring bootcontainer.put(key, cacheNode);
}
/**
* 向缓存中保存数据,包含过期时间
* @param key
* @param value
* @param expire 数据有效期(过期时间)
*/
public void set(String key, Object value,long expire){
// 先根据参数,计算出过期的时间戳
long expireTime = System.currentTimeMillis()+ expire;
// 将计算出的过期时间保存到CacheEntry中, 便于在取值的时候判断是否过期
CacheEntry cacheEntry = CacheEntry.builder()
.expireTime(expireTime)
.value(value)
.build();
// 将数据保存到容器中
container.put(key, cacheNode);
}
/
**
* 从缓存中获取数据
* @param key
*/
public Object get(String key){
// 先获取数据
CacheEntry cacheNode = (key);
// 如果为null,说明不存在
if(cacheNode == null){
return null;
}
/
/ 获取过期时间
long expireTime = ExpireTime();
// 如果没有设置过期时间或者没有到达过期时间,则返回该数据
if(expireTime ==0L || expireTime >= System.currentTimeMillis()){
return cacheNode.value;
}
// 其他情况下,说明该数据已过期,将该数据移除,并返回null
return null;
}
}
这⾥在类上使⽤了@Component注解,将该类注⼊到Spring容器中,可以直接通过@Autowired使⽤。
如果要在Springboot启动时,向缓存中保存数据,只需要将启动类 implements CommandLineRunner, 重写run⽅法即可。
@SpringBootApplication
public class LocalCacheApplication implements CommandLineRunner {
@Autowired
private LocalCache localCache;
public static void main(String[] args){
SpringApplication.run(LocalCacheApplication.class, args);
}
@Override
public void args)throws Exception {
localCache.set("test","testValue");
System.out.("test"));
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论