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、使用 Guava 的 Joiner 进行 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));
}
}

浙公网安备 33010602011771号