redis key前綴的設(shè)計與使用

在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());
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市市俊,隨后出現(xiàn)的幾起案子杨凑,更是在濱河造成了極大的恐慌,老刑警劉巖摆昧,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撩满,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機鹦牛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進店門搞糕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人曼追,你說我怎么就攤上這事窍仰。” “怎么了礼殊?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵驹吮,是天一觀的道長。 經(jīng)常有香客問我晶伦,道長碟狞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任婚陪,我火速辦了婚禮族沃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泌参。我一直安慰自己脆淹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布沽一。 她就那樣靜靜地躺著盖溺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铣缠。 梳的紋絲不亂的頭發(fā)上烘嘱,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天,我揣著相機與錄音蝗蛙,去河邊找鬼蝇庭。 笑死,一個胖子當(dāng)著我的面吹牛歼郭,可吹牛的內(nèi)容都是我干的遗契。 我是一名探鬼主播,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼病曾,長吁一口氣:“原來是場噩夢啊……” “哼牍蜂!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起泰涂,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤鲫竞,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后逼蒙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體从绘,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了僵井。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陕截。...
    茶點故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖批什,靈堂內(nèi)的尸體忽然破棺而出农曲,到底是詐尸還是另有隱情,我是刑警寧澤驻债,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布乳规,位于F島的核電站,受9級特大地震影響合呐,放射性物質(zhì)發(fā)生泄漏暮的。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一淌实、第九天 我趴在偏房一處隱蔽的房頂上張望冻辩。 院中可真熱鬧,春花似錦拆祈、人聲如沸微猖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侠仇,卻和暖如春轻姿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逻炊。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工互亮, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人余素。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓豹休,卻偏偏與公主長得像,于是被迫代替她去往敵國和親桨吊。 傳聞我的和親對象是個殘疾皇子威根,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容