作者:友盟+技术专家 鹏程

一、背景

数据源列表增加缓存反对,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
...

缓存用户下全量的数据源

每次从缓存或者数据库查问以后用户下的所有数据源,依照参数筛选。

扫一扫退出友盟+ 技术社群

与超过1000+挪动开发者独特探讨挪动开发最新动静

欢送点击【友盟+】,理解友盟+ 最新挪动技术

欢送关注【友盟全域数据】公众号