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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 实战SSM_O2O商铺_47【Redis缓存】清除缓存接口的开发

概述


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

举个例子

20180816222631373.png


如上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


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4月前
|
缓存 安全 Android开发
Android经典实战之用Kotlin泛型实现键值对缓存
本文介绍了Kotlin中泛型的基础知识与实际应用。泛型能提升代码的重用性、类型安全及可读性。文中详细解释了泛型的基本语法、泛型函数、泛型约束以及协变和逆变的概念,并通过一个数据缓存系统的实例展示了泛型的强大功能。
45 2
|
22天前
|
存储 缓存 监控
后端开发中的缓存机制:深度解析与最佳实践####
本文深入探讨了后端开发中不可或缺的一环——缓存机制,旨在为读者提供一份详尽的指南,涵盖缓存的基本原理、常见类型(如内存缓存、磁盘缓存、分布式缓存等)、主流技术选型(Redis、Memcached、Ehcache等),以及在实际项目中如何根据业务需求设计并实施高效的缓存策略。不同于常规摘要的概述性质,本摘要直接点明文章将围绕“深度解析”与“最佳实践”两大核心展开,既适合初学者构建基础认知框架,也为有经验的开发者提供优化建议与实战技巧。 ####
|
2月前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
39 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
2月前
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块
|
3月前
|
机器学习/深度学习 缓存 NoSQL
深度学习在图像识别中的应用与挑战后端开发中的数据缓存策略
本文深入探讨了深度学习技术在图像识别领域的应用,包括卷积神经网络(CNN)的原理、常见模型如ResNet和VGG的介绍,以及这些模型在实际应用中的表现。同时,文章也讨论了数据增强、模型集成等改进性能的方法,并指出了当前面临的计算资源需求高、数据隐私等挑战。通过综合分析,本文旨在为深度学习在图像识别中的进一步研究和应用提供参考。 本文探讨了后端开发中数据缓存的重要性和实现方法,通过具体案例解析Redis在实际应用中的使用。首先介绍了缓存的基本概念及其在后端系统性能优化中的作用;接着详细讲解了Redis的常见数据类型和应用场景;最后通过一个实际项目展示了如何在Django框架中集成Redis,
消息中间件 缓存 监控
145 0
|
4月前
|
缓存 NoSQL 数据库
go-zero微服务实战系列(五、缓存代码怎么写)
go-zero微服务实战系列(五、缓存代码怎么写)
|
4月前
|
存储 缓存 JavaScript
深入理解后端开发中的缓存机制
【8月更文挑战第31天】本文将通过一个实际的后端开发案例,介绍如何有效地使用缓存来提高应用性能。我们将从基础概念开始,逐步深入到缓存策略的实施,最后通过代码示例展示如何在Node.js环境中实现一个简单的缓存系统。无论你是缓存新手还是希望优化现有系统的开发者,这篇文章都将为你提供实用的指导和启示。
|
4月前
|
缓存 NoSQL Java
惊!Spring Boot遇上Redis,竟开启了一场缓存实战的革命!
【8月更文挑战第29天】在互联网时代,数据的高速读写至关重要。Spring Boot凭借简洁高效的特点广受开发者喜爱,而Redis作为高性能内存数据库,在缓存和消息队列领域表现出色。本文通过电商平台商品推荐系统的实战案例,详细介绍如何在Spring Boot项目中整合Redis,提升系统响应速度和用户体验。
73 0
|
4月前
|
消息中间件 缓存 监控
go-zero微服务实战系列(六、缓存一致性保证)
go-zero微服务实战系列(六、缓存一致性保证)
下一篇
DataWorks