文章目录
- 概述
- 接口层改造
- CacheService接口
- CacheService接口实现类
- 工具类中的方法
- 单元测试
- Github地址
概述
设计如下: 在接口层传入缓存key的前缀,通过匹配的方式将能匹配到该前缀的所有key均删除。
举个例子
如上3个key,当我们传入shopcategory这个前缀时,会将如上3个前缀全部清除掉。
接口层改造
为了方便使用前缀,我们在将之前定义在方法体中的前缀抽取到接口层,如下所示
代码语言:javascript复制public interface AreaService {
// redis key的前缀,抽取到接口层,方便使用
public static final String AREALISTKEY = "arealist";
.....
.....
}
代码语言:javascript复制public interface HeadLineService {
// redis key的前缀,抽取到接口层,方便使用
public static final String HEADLINEKEY = "headline";
.....
.....
}
代码语言:javascript复制public interface ShopCategoryService {
// redis key的前缀,抽取到接口层,方便使用
public static final String SCLISTKEY = "shopcategory";
.....
.....
}
CacheService接口
代码语言:javascript复制package com.artisan.o2o.service;
public interface CacheService {
/**
*
*
* @Title: removeFromCache
*
* @Description: 根据缓存的前缀清理匹配的全部缓存
*
* @param keyPrefix
*
* @return: void
*/
void removeFromCache(String keyPrefix);
}
CacheService接口实现类
代码语言:javascript复制package com.artisan.o2o.service.impl;
import java.util.Set;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.artisan.o2o.cache.JedisUtil;
import com.artisan.o2o.service.CacheService;
@Service
public class CacheServiceImpl implements CacheService {
@Autowired
JedisUtil.Keys jedisKeys;
@Override
public void removeFromCache(String keyPrefix) {
Set<String> keySet = jedisKeys.keys(keyPrefix "*");
for (String key : keySet) {
jedisKeys.del(key);
}
}
}
工具类中的方法
代码语言:javascript复制 /**
* 查找所有匹配给定的模式的键
*
* @param String
* key的表达式,*表示多个,?表示一个
* */
public Set<String> keys(String pattern) {
Jedis jedis = getJedis();
Set<String> set = jedis.keys(pattern);
jedis.close();
return set;
}
/**
* 删除keys对应的记录,可以是多个key
*
* @param String
* ... keys
* @return 删除的记录数
* */
public long del(String... keys) {
Jedis jedis = getJedis();
long count = jedis.del(keys);
jedis.close();
return count;
}
单元测试
代码语言:javascript复制package com.artisan.o2o.service;
import java.io.IOException;
import java.util.List;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import com.artisan.o2o.BaseTest;
import com.artisan.o2o.entity.Area;
import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.databind.JsonMappingException;
public class AreaServiceTest extends BaseTest {
@Autowired
AreaService areaService;
@Autowired
CacheService cacheService;
@Test
public void testGetAreaList() throws JsonParseException, JsonMappingException, IOException {
// 首次从db中加载
List<Area> areaList = areaService.getAreaList();
for (Area area : areaList) {
System.out.println("||---->" area.toString());
}
// 再次查询从redis中获取
areaList = areaService.getAreaList();
for (Area area : areaList) {
System.out.println("**---->" area.toString());
}
// 清除缓存
cacheService.removeFromCache(AreaService.AREALISTKEY);
// 再次查询 从db中获取
areaList = areaService.getAreaList();
for (Area area : areaList) {
System.out.println("**---->" area.toString());
}
// 再次查询从redis中获取
areaList = areaService.getAreaList();
for (Area area : areaList) {
System.out.println("**---->" area.toString());
}
}
}
观察数据,确保测试结果符合预期。 比较简单就不贴数据了。
Github地址
代码地址: https://github.com/yangshangwei/o2o