在java web開發(fā)中蕾总,redis的使用已非常頻繁了粥航,大規(guī)模的使用也延伸了一些問題,例如:我定義了一個redis key name 存放的值為用戶昵稱生百,而這時同事定義一個key 也叫name,存放的是商品名字递雀,那么沖突再所難免,為了解決這一問題,合理的設(shè)計redis key前綴 成為了迫切的需求蚀浆。我們一起來看看優(yōu)雅的設(shè)計吧缀程!
采用了簡單抽象接口設(shè)計
接口------RedisPrefixKey
|
抽象類-----RedisBasePrefixKey
|
實現(xiàn)類 -----RedisUserKey
RedisPrefixKey 接口
public interface RedisPrefixKey {
/**
* redis 過期時間
* @return 過期時間
*/
Long expireSeconds();
/**
* redis key
* @return 鍵前綴
*/
String getPrefix();
}
接口中定義了兩個方法
- 一個是獲取redis key 的過期時間
- 一個是獲取redis 的key前綴
RedisBasePrefixKey 抽象類
@Data
public abstract class RedisBasePrefixKey implements RedisPrefixKey{
/**
* 過期時間
*/
private Long expireSeconds;
/**
* redis key前綴
*/
private String prefix;
/**
* 構(gòu)造器
* expireSeconds 為零默認為永不過期
*
* @param prefix 前綴
*/
public RedisBasePrefixKey(String prefix) {
this.prefix = prefix;
this.expireSeconds = 0L;
}
/**
* 構(gòu)造器
* @param expireSeconds 過期時間
* @param prefix 前綴
*/
public RedisBasePrefixKey(Long expireSeconds,String prefix){
this.expireSeconds = expireSeconds;
this.prefix = prefix;
}
/**
* 獲取過期時間
* @return
*/
@Override
public Long expireSeconds() {
return expireSeconds;
}
/**
* 獲取Key前綴
* @return
*/
@Override
public String getPrefix() {
String className = getClass().getSimpleName();
return className+":"+prefix+":";
}
}
- @Data lombok 注解 沒有插件的自行生成get set
- 最后生成的key是
RedisUserKey:id:1
模塊:屬性:值 == value
RedisUserKey 實現(xiàn)類(自定義)
public class RedisUserKey extends RedisBasePrefixKey{
public static final String USER_KEY_ID = "id";
public static final String USER_KEY_TOKEN = "token";
/**
* 用戶key
*/
public static RedisUserKey getUserId = new RedisUserKey(USER_KEY_ID);
public static RedisUserKey getUserToken = new RedisUserKey(3600*24L,USER_KEY_TOKEN);
private RedisUserKey(String prefix) {
super(prefix);
}
private RedisUserKey(Long expireSeconds, String prefix) {
super(expireSeconds, prefix);
}
}
- 私有化構(gòu)造器防止外面new創(chuàng)建
redisService 需要改造一下set get
/**
* 普通緩存放入
*
* @param prefix 鍵前綴
* @param key 鍵
* @param value 值
* @return true成功 false失敗
*/
public boolean set(RedisPrefixKey prefix,String key, Object value) {
try {
Long expire = prefix.expireSeconds();
ValueOperations ops = redisTemplate.opsForValue();
if(expire <= 0){
ops.set(prefix.getPrefix()+key, value);
}else{
ops.set(prefix.getPrefix()+key, value,expire,TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
}
/**
* 普通緩存獲取
* @param prefix 鍵前綴
* @param key 鍵
* @return 值
*/
public Object get(RedisPrefixKey prefix,String key) {
if(key==null || key.length()<=0){
return null;
}
return redisTemplate.opsForValue().get(prefix.getPrefix()+key);
}
- redisTemplate 詳見spring整合redis
具體使用
//設(shè)置用戶緩存
User user = userService.queryById(1);
redisService.set(UserKey.getUserId,user.getId()+"",user);
User u = (User)redisService.get(UserKey.getUserId,user.getId()+"");
System.out.println(u.toString());
//設(shè)置用戶session
String token = UUID.randomUUID().toString().replace("-","");
redisService.set(UserKey.getUserToken,token,user);
u = (User)redisService.get(UserKey.getUserToken,token);
System.out.println(u.toString());