简介:欢迎了解友盟+技术干货第三期内容: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. [C++]使用auto遍历判断是否是最后一个元素

    一.背景 略 二.代码 for(auto& it:vec){ if(&it==&vec.back()){ cout<<"is the last eleme ...

  2. 记录--Vue3问题:如何实现组件拖拽实时预览功能?

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1. 需求分析 实现一个CMS内容管理系统,在后台进行内容编辑,在官网更新展示内容. 关于后台的编辑功能,大致分为两部分:组件拖拽预览.组 ...

  3. 记录-new Date() 我忍你很久了!

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 大家平时在开发的时候有没被new Date()折磨过?就是它的诸多怪异的设定让你每每用的时候,都可能不小心踩坑.造成程序意外出错,却一下子 ...

  4. Docker网络模型以及容器通信

    本篇接着上篇:[Docker0网络及原理探究],继续深入探究容器网络通信原理,通过学习Docker网路驱动模型,更好地解决容器间的通信问题 1.Docker的网络驱动模型 1.1.Docker的网络驱 ...

  5. Anaconda 创建新环境

    使用conda 命令创建一个名为 python311 的python版本为3.11的环境 conda create -n python311 python=3.11 接着使用 conda activa ...

  6. [ROS串口通信]Serial库读入结构体

    本文介绍使用c++中Serial库读入结构体: //例如,结构体定义如下: typedef struct __attribute__((packed)) { uint16_t team; /* 本身队 ...

  7. 【毕业设计】基于springboot的大学生综合素质测评管理系统

    前言 [毕业设计]大学生综测管理系统 个人主页:@MIKE笔记 文章专栏:毕业设计源码合集 联系博主: wx:mikenote 毕设目录 项目名 文章地址 下载 1.基于springboot的大学生综 ...

  8. #双指针#洛谷 7521 [省选联考 2021 B 卷] 取模

    题目传送门 分析 将 \(a\) 排序后从大到小枚举 \(a_k\),注意枚举的时候重复的只考虑一次,那么可以将其它数按照模 \(a_k\) 后排序, 答案只可能来自最大值与次大值之和取模或者之和最接 ...

  9. 密码学系列之:IDEA

    密码学系列之:IDEA 目录 简介 IDEA简介 IDEA原理 IDEA子密钥的生成 简介 IDEA的全称是International Data Encryption Algorithm,也叫做国际加 ...

  10. JDK10的新特性:var泛型和多个接口实现

    目录 简介 实现多个接口 使用多个接口 使用var 总结 简介 在JDK10的新特性:本地变量类型var中我们讲到了为什么使用var和怎么使用var. 今天我们来深入的考虑一下var和泛型,多个接口实 ...