技术实践第三期|HashTag在Redis集群环境下的使用
生活随笔
收集整理的這篇文章主要介紹了
技术实践第三期|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 )"
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集群环境下的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Spring官方RSocket Brok
- 下一篇: 阿里云数据库开源发布:PolarDB三节