1. 程式人生 > 其它 >技術實踐第三期|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
  • ...

快取使用者下全量的資料來源

每次從快取或者資料庫查詢當前使用者下的所有資料來源,按照引數篩選。

原文連結

本文為阿里雲原創內容,未經允許不得轉載。