问题:实际工作中经常遇到要使用redis配合的业务场景,那么就避免不了定义redis的key,在实际业务中为了区分key经常需要对key进行业务拼接,如 user:info:id:123 。
遇到上述情况常规方案 伪代码如下:
// 定义常量redisKey
public static final String USER_INFO_ID = "user:info:id:";
// 将常量与变量拼接
String redisKey = USER_INFO_ID+"123";
// 使用拼接好的redisKey
String userInfo = stringRedisTemplate.opsForValue().get(redisKey);
这样的使用场景如果频发出现在代码中使后期维护、查找问题都非常麻烦,关键是看起来又很丑。
解决方案:
1.使用工具类整合项目中的redisKey,做到统一管理,避免定义的key散落在代码各个角落。
2.使用JDK自带的MessageFormat对要拼接的key进行整合处理,这样可以清除代码中麻烦的拼接过程。
工具类如下:
package com.util.test;
import java.text.MessageFormat;
/**
* @author :wbf
* @desc:redisKey工具类
*/
public enum RedisKey {
/**
* 纯字符串的StringKey
*/
TEST_STRING("test:string"),
/**
* 带参数的key拼接
*/
TEST_STRING_ID("test:string:id:{0}"),
/**
* 多个参数的key拼接
*/
TEST_STRING_ID_NAME("test:string:id:{0}:{1}");
private final String value;
RedisKey(String value) {
this.value = value;
}
/**
* 获取key
* @param params
* @return
*/
public String getValue(Object... params) {
return MessageFormat.format(value, params);
}
/**
* 测试用例
* @param args
*/
public static void main(String[] args) {
System.out.println(RedisKey.TEST_STRING.getValue());
System.out.println(RedisKey.TEST_STRING_ID.getValue("111"));
System.out.println(RedisKey.TEST_STRING_ID_NAME.getValue("222","张三"));
}
}
最后分享一个踩坑经验:
1.项目中使用redis的场景如果不是数据量很大的需求(string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000)。
推荐使用StringRedisTemplate 不推荐RedisTemplate
RedisTemplate保存时会对数据进行序列化成字节数组后再存入redis数据库,这样的好处是可以在一定程度上减少存入数据的体积,但是如果线上环境出现问题,就会发现在服务器上使用redis命令行工具查出来的数据不能用于直接排查错误(一堆字节码)。
而数据体积不大的存储需求直接使用StringRedisTemplate,在排查问题上优势明显,所存即所得。
原创文章,欢迎指正讨论,如需转载请标明出处。