简介:欢迎了解友盟+技术干货第三期内容:Redis集群环境如何按照前缀批量删除缓存。希望能对开发者们在实际应用中有所帮助。

一、背景

数据源列表添加缓存支持,types字段可传多值,如app, mini, web等,会构建如下缓存key,

  • application_list:123456:app
  • application_list:123456:mini
  • application_list:123456:web
  • application_list:123456:app,mini
  • application_list:123456:app,web
  • application_list:123456:mini,web
  • application_list:123456:app,mini,web
  • ...

当创建应用,更新应用或删除应用的时候,需要批量删除旧版本缓存。

二、思路

1.按照前缀 `application_list:123456`,查询所有相关的key

2.遍历keys,执行删除

/**
* 移除缓存
*
* @param prefix prefix
*/
public static void deleteByPrefix(String prefix) {
long start = System.currentTimeMillis();
Set<String> keys;
try {
keys = jedisCluster.keys(CacheKeyUtils.buildCacheKey(prefix, "*"));
LOGGER.info("cache keys {} with prefix {}", keys, prefix);
if (keys != null && !keys.isEmpty()) {
jedisCluster.del(keys.toArray(new String[keys.size()]));
}
} catch (Exception e) {
LOGGER.error("cache deleteByPrefix error, prefix = {}", prefix, e);
throw new BusinessException(CoreErrorEnum.CACHE_DELETE_ERROR, prefix);
}
long end = System.currentTimeMillis();
LOGGER.info("cache deleteByPrefix success, prefix = {}, cost {} ms", prefix, (end - start));
}

三、问题

按照这个写完,执行报错,"JedisCluster only supports KEYS commands with patterns containing hash-tags ( curly-brackets enclosed strings )"

Redis Cluster 采用虚拟槽分区,所有的根据哈希函数映射到 0~16383 整数槽内,计算公式:slot = CRC16(key) % 16384。每个节点负责维护一部分槽以及槽所映射的键值数据,如图所示:

四、方案

使用HashTag生成缓存Key

if (StringUtils.isNotEmpty(platform)) {
cacheKey = CacheKeyUtils.buildCacheKey(
CacheKeyUtils.buildHashTag(CacheConstant.APPLICATION_LIST, String.valueOf(userId)), "platform",
platform);
} else if (types != null && !types.isEmpty()) {
cacheKey = CacheKeyUtils.buildCacheKey(
CacheKeyUtils.buildHashTag(CacheConstant.APPLICATION_LIST, String.valueOf(userId)), "types",
types.stream().sorted().collect(Collectors.joining(",")));
} else {
cacheKey = CacheKeyUtils.buildCacheKey(
CacheKeyUtils.buildHashTag(CacheConstant.APPLICATION_LIST, String.valueOf(userId)));
}
  • {application_list:123456}:app
  • {application_list:123456}:mini
  • {application_list:123456}:web
  • {application_list:123456}:app,mini
  • {application_list:123456}:app,web
  • {application_list:123456}:mini,web
  • {application_list:123456}:app,mini,web
  • ...

缓存用户下全量的数据源

每次从缓存或者数据库查询当前用户下的所有数据源,按照参数筛选。

原文链接

本文为阿里云原创内容,未经允许不得转载。

技术实践第三期|HashTag在Redis集群环境下的使用的更多相关文章

  1. Redis集群环境下的键值空间监听事件实现方案

    一直想记录工作中遇到的问题和解决的方法,奈何没有找到一方乐土,最近经常反思,是否需要记录平时的点滴,后台还是决定下定决心记录一些,以便以后用到的时候找不着,实现这样的一个功能主要也是业务所需要的. 需 ...

  2. Redis集群环境搭建实践

    0 Redis集群简介 Redis集群(Redis Cluster)是Redis提供的分布式数据库方案,通过分片(sharding)来进行数据共享,并提供复制和故障转移功能.相比于主从复制.哨兵模式, ...

  3. 带你自行搭建虚拟机和Redis集群环境,值得收藏!

    前言: 我们看到分析 Redis 使用或原理的文章不少,但是完整搭建一套独立的 redis 集群环境的介绍,并不是很多或者说还不够详细. 那么,本文会手把手带着大家搭建一套 Redis 集群环境,Re ...

  4. Redis 集群环境添加节点失败问题

    最近在给公司网管系统Redis集群环境添加节点时候遇到一个问题,提示新增的Node不为空: [root@node00 src]# ./redis-trib.rb add-node --slave -- ...

  5. 在tomcat集群环境下redis实现分布式锁

    上篇介绍了redis在集群环境下如何解决session共享的问题.今天来讲一下如何解决分布式锁的问题 什么是分布式锁? 分布式锁就是在多个服务器中,都来争夺某一资源.这时候我们肯定需要一把锁是不是 , ...

  6. redis集群环境的搭建和错误分析

    redis集群环境的搭建和错误分析 redis集群时,出现的几个异常问题 09 redis集群的搭建 以及遇到的问题

  7. 分布式集群环境下,如何实现session共享五(spring-session+redis 实现session共享)

    这是分布式集群环境下,如何实现session共享系列的第五篇.在上一篇:分布式集群环境下,如何实现session共享四(部署项目测试)中,针对nginx不同的负载均衡策略:轮询.ip_hash方式,测 ...

  8. SpringBoot系列教程之Redis集群环境配置

    之前介绍的几篇redis的博文都是基于单机的redis基础上进行演示说明的,然而在实际的生产环境中,使用redis集群的可能性应该是大于单机版的redis的,那么集群的redis如何操作呢?它的配置和 ...

  9. redis内存分配管理与集群环境下Session管理

    ##################内存管理############### 1.Redis的内存管理 .与memcache不同,没有实现自己的内存池 .在2..4以前,默认使用标准的内存分配函数(li ...

  10. Redis集群环境之linux搭建多机版---已完结,跟着一步一步来你就可以集群成功

    上一篇踩着各种坑写了Redis集群环境之linux搭建单机版,这一篇准备就多机版集群进行搭建,主要目的一来是在上一篇的基础上进行精华提粹总结,二来是把单机版与多机版的区别进行记录. 首先软硬件环境: ...

随机推荐

  1. Linux快速入门(三)Linux文件管理

    Linux文件操作 head head命令用于显示文件的前几行内容,可以通过-num参数展示文件前num行的内容. root@ubuntu:~# ls bb.txt cc.txt snap root@ ...

  2. 记录--npm, npx, cnpm, yarn, pnpm梭哈

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 依赖管理解决了在软件开发过程中管理和协调各种依赖项的问题,简化了开发流程,提高了项目的可靠性.可维护性和可重复性.它们帮助开发人员更高效地 ...

  3. js 时间控件 日期多选

    在开发的过程中,时间总是不可避免要出现的需求,这里给大家分享我比较常用的js 时间控件和一个问题的解决方法 layDate 官方文档地址:https://www.layui.com/laydate/ ...

  4. vue核心基础-过渡动画

    第一种方法:引入类名 .v-enter{ opacity: 0; } .v-enter-to{ opacity: 1; } .v-leave{ opacity: 1; } .v-leave-to{ o ...

  5. quartus之LPM_COMPARE测试

    quartus之LPM_COMPARE测试 1.IP描述 比较器的IP,可以比较两路数据是否相等.相等输出为1,不等输出为0的aeb信号是需要测试的量. 2.基础测试 module compare_t ...

  6. KingbaseES Json 系列十:Json数组构造函数

    KingbaseES Json 系列十--Json数组构造函数(ARRAY_TO_JSON,JSONB_BUILD_ARRAY,JSON_ARRAY,JSON_BUILD_ARRAY) JSON 数据 ...

  7. archlinux xfce 修改用户主目录名称

    操作有风险,修改用户主目录名称后一些链接了旧主目录的的链接可能仍未修改.导致链接用不了,需要手动指定链接 1.删除指定用户保存的会话,未删除应该会导致修改用户主目录名称后进不去会话 2.切换到其它用户 ...

  8. 3D Object Detection Essay Reading 2024.04.05

    EMIFF 论文:https://arxiv.org/abs/2303.10975 代码:https://github.com/Bosszhe/EMIFF ​ 本文提出了一种新的基于摄像机的三维检测框 ...

  9. 战“码”先锋直播预告丨如何成为一名优秀的OpenHamrony贡献者?

    OpenAtom OpenHarmony(以下简称"OpenHarmony")工作委员会首度发起「OpenHarmony开源贡献者计划」,旨在鼓励开发者参与OpenHarmony开 ...

  10. 大奖升级!HMS Core线上Codelabs挑战赛第3期:用3D建模构建元宇宙

    "元宇宙"概念风生水起,在AR.VR等技术构建的虚拟世界里,3D模型担当重要角色,无论是为玩家提供更丰富更真实游戏体验的3D游戏领域,还是各大电商平台正在启用并不断完善的3D虚拟购 ...