• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

关于java:技术实践第三期|HashTag在Redis集群环境下的使用

java 搞代码 4年前 (2022-01-27) 58次浏览 已收录 0个评论

简介:欢送理解友盟+技术干货第三期内容: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

缓存用户下全量的数据源

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

原文链接
本文为阿里云原创内容,未经容许不得转载。 


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:关于java:技术实践第三期|HashTag在Redis集群环境下的使用

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址