技术实践第三期|HashTag在Redis集群环境下的使用
简介:欢迎了解友盟+技术干货第三期内容: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 )"
四、方案
使用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
- ...
缓存用户下全量的数据源
每次从缓存或者数据库查询当前用户下的所有数据源,按照参数筛选。
本文为阿里云原创内容,未经允许不得转载。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
2020-12-30 阿里云数据库李飞飞:云计算推动数据库向云原生快速演进
2020-12-30 不懂代码,他怎么开发了20多个政务应用?
2020-12-30 2021十大科技趋势来了!阿里巴巴达摩院全新发布
2020-12-30 2020年勒索病毒事件盘点及未来发展趋势
2020-12-30 一文详解 Nacos 高可用特性
2020-12-30 “让专业的人做专业的事”,畅捷通与阿里云的云原生故事 | 云原生 Talk
2019-12-30 日处理数据量超10亿:友信金服基于Flink构建实时用户画像系统的实践