Redis Key 设计规约

Redis Key 设计规约

Redis的key命名规范

1、建议全部大写,不强制
2、key 单词与单词之间以 : 分开
3、key不能太长也不能太短,键名越长越占资源,太短可读性太差
4、key 的其他规则

1、非常长的key是不推荐的。一个1024 bytes是一个非常坏的注意,不仅仅是因为内存浪费,更是因为在数据集中搜索对比的时候需要耗费更多的成本。另外,当要处理匹配的是一个非常大的value,从内存和带宽的角度来看,使用这个value的hash值是更好的办法(比如使用SHA1)。
2、非常长的key是不推荐的。一个1024 bytes是一个非常坏的注意,不仅仅是因为内存浪费,更是因为在数据集中搜索对比的时候需要耗费更多的成本。另外,当要处理匹配的是一个非常大的value,从内存和带宽的角度来看,使用这个value的hash值是更好的办法(比如使用SHA
3、尝试去设计一个固定的key格式。比如object-type:id是一个好主意,然后用 - 或 . 来定义multi-word fields,比如comment🔢reply.to,或者comment🔢reply-to。
--
5、命名规则
1、第一段放置业务标识名或其缩写 如"member"
2、第二段放信息标识 如, info/benefit/order:
3、第三段放置用于区分区key的字段,如userId、priductId、activityId

  • 注意:每一个 key 的存储必须定义一个唯一标识防止在集群环境下 key 冲突的状况发生

Java项目中如何统一管理Redis的key

1、常量类

public interface RedisKeyConstants {

    String PREFIX = "bap:bap-pda-server:";

    String POLICE_INFO = PREFIX + "policeInfo:%s:%s";

    String POLICE_GPS_FOOT = PREFIX + "policeGpsFoot:%s:%s";

    /** 使用方式 */
    public static void main(String[] args) {
        System.out.println(String.format(RedisKeyConstants.POLICE_INFO, "hello", "world"));
        System.out.println(String.format(RedisKeyConstants.POLICE_GPS_FOOT, "hello", "world"));
        // bap:bap-pda-server:policeInfo:hello:world
        // bap:bap-pda-server:policeGpsFoot:hello:world
    }
}
  • 注意:使用 String.format 来格式化我们需要的 key

2、使用枚举类

public enum RedisKeys {

    POLICE_INFO("police-info:%s"),
    POLICE_GPS_FOOT("police-gps-foot:%s");

    public static final String PREFIX = "bap:bap-pda-server";
    private final String keyFormat;

    RedisKeys(String keyFormat) {
        this.keyFormat = PREFIX + ":" + keyFormat;
    }

    public String format(Object... args) {
        return String.format(keyFormat, args);
    }

    /** 使用方式 */
    public static void main(String[] args) {
        System.out.println(RedisKeys.POLICE_INFO.format("hello", "world"));
        System.out.println(RedisKeys.POLICE_GPS_FOOT.format("hello", "world"));
        // bap:bap-pda-server:policeInfo:hello:world
        // bap:bap-pda-server:policeGpsFoot:hello:world
    }
}

3、使用 GuavaJoiner 进行 key 的构建,同时使用自定义 RedisKeySerializer 来构建的 key 的前缀

@Component
@EnableConfigurationProperties(RedisProperties.class)
public class CacheUtil implements InitializingBean {

    private RedisProperties properties;

    public static  List<String> serviceName = Lists.newArrayList();

    public static final String SPLICING_OPERATOR = "_";

    public CacheUtil(RedisProperties properties) {
        this.properties = properties;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        serviceName = properties.serviceName;
    }

    /**
     * 构建 key
     * @param args
     * @return
     */
    public static String buildKey(String ...args) {
        Preconditions.checkArgument(args.length > 0 , "build key args can not null");
        if (!serviceName.contains(args[0])) {
            throw new RuntimeException("service key is not exist in resource");
        }
        Stream.of(args).map(each -> Optional.of(each).orElseThrow(()-> new RuntimeException("build key part can not null")));
        return Joiner.on(SPLICING_OPERATOR).join(args);
    }


    public static boolean isNullOrBlank(Object cacheVal) {
        return cacheVal == null || (cacheVal instanceof String && Strings.isNullOrEmpty((String) cacheVal));
    }
}
posted @ 2023-06-13 14:48  ayiZzzz  阅读(887)  评论(0)    收藏  举报