技術實踐第三期|HashTag在Redis叢集環境下的使用
阿新 • • 發佈:2021-12-30
簡介:歡迎瞭解友盟+技術乾貨第三期內容: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
- ...
快取使用者下全量的資料來源
每次從快取或者資料庫查詢當前使用者下的所有資料來源,按照引數篩選。
本文為阿里雲原創內容,未經允許不得轉載。