实战SSM_O2O商铺_47【Redis缓存】清除缓存接口的开发

2021-08-17 15:07:03 浏览数 (1)

文章目录

  • 概述
  • 接口层改造
  • 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

0 人点赞