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

概述

设计如下: 在接口层传入缓存key的前缀,通过匹配的方式将能匹配到该前缀的所有key均删除。

举个例子
这里写图片描述

如上3个key,当我们传入shopcategory这个前缀时,会将如上3个前缀全部清除掉。


接口层改造

为了方便使用前缀,我们在将之前定义在方法体中的前缀抽取到接口层,如下所示

public interface AreaService {

	// redis key的前缀,抽取到接口层,方便使用
	public static final String AREALISTKEY = "arealist";

	.....
	.....	
}
public interface HeadLineService {
	
	// redis key的前缀,抽取到接口层,方便使用
	public static final String HEADLINEKEY = "headline";
	.....
	.....	
}
public interface ShopCategoryService {

	// redis key的前缀,抽取到接口层,方便使用
	public static final String SCLISTKEY = "shopcategory";

	.....
	.....	
}

CacheService接口

package com.artisan.o2o.service;

public interface CacheService {
	
	
	/**
	 * 
	 * 
	 * @Title: removeFromCache
	 * 
	 * @Description: 根据缓存的前缀清理匹配的全部缓存
	 * 
	 * @param keyPrefix
	 * 
	 * @return: void
	 */
	void removeFromCache(String keyPrefix);
}


CacheService接口实现类

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);
		}
	}

}


工具类中的方法

       /**
		 * 查找所有匹配给定的模式的键
		 * 
		 * @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;
		}

	

单元测试

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小小工匠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值