首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >实战SSM_O2O商铺_47【Redis缓存】清除缓存接口的开发

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

作者头像
小小工匠
发布2021-08-17 15:07:03
发布2021-08-17 15:07:03
4400
举报
文章被收录于专栏:小工匠聊架构小工匠聊架构

文章目录

概述

设计如下: 在接口层传入缓存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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018/08/16 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文章目录
  • 概述
  • 接口层改造
  • CacheService接口
  • CacheService接口实现类
  • 工具类中的方法
  • 单元测试
  • Github地址
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档