Redis Key 鍵值公共方法定義

前言

  • 經(jīng)常使用redis,固定前綴key每次都定義在當(dāng)前類下代乃,查詢或儲(chǔ)存redis時(shí)總是需要key+參數(shù)去操作旬牲,開發(fā)人員固守自封,后期維護(hù)成本加大搁吓,也看的不是很直觀原茅。
  • 在最近的項(xiàng)目業(yè)務(wù)中,發(fā)現(xiàn)了比較好的處理方式堕仔,所以拿出來一起分享擂橘,當(dāng)然還有很多更加優(yōu)秀的方案,這里只是分享出來摩骨,供大家參考研究通贞。
  • 說一下該方案大體的思路,通過定義公共key鍵值類仿吞,定義公共的查詢key鍵值方法滑频,來來統(tǒng)一管理,大大提升了代碼的通用性唤冈。
  • 當(dāng)然峡迷,該方案思路不僅限于redis,可合理化的修改為自己想要的方案你虹,這里通過redis實(shí)例來進(jìn)行展示绘搞。

一、pom.xml文件

        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.6.2</version>
        </dependency>

二傅物、key值公共管理類定義

/**
 * 定義公共Key
 */
public interface RedisKey {
    /**
     * 公共頭部
     */
    String KEY_REDIS = "wss:";

    //樣例數(shù)據(jù)夯辖,可自行定義規(guī)則
    interface childKey {
        /**
         * 用戶詳情請(qǐng)求 - 1
         * 0 -> User.class
         */
        String USER_KEY = "user:get:{0}";
        /**
         * 機(jī)構(gòu)詳情請(qǐng)求
         * 0 -> 機(jī)構(gòu)ID
         * 1 -> Org.class
         */
        String ORG_KEY = "org:sev:{0}:{1}";
        /**
         * 用戶詳情請(qǐng)求 - 2
         * 0 -> 用戶ID
         * 1 -> 用戶名稱
         * 2 -> 用戶年齡
         */
        String USER_DETAIL_KEY = "user:get:{0}:{1}:{2}";
    }
}

三、拼接key值類定義

import lombok.experimental.UtilityClass;
import org.springframework.lang.NonNull;

import java.text.MessageFormat;

/**
 * 拼接key值
 * @UtilityClass 相當(dāng)于每個(gè)方法都加了static
 */
@UtilityClass
public final class RedisKeyName {

    private String key(@NonNull String key, Object... objs) {
        return MessageFormat.format(RedisKey.KEY_REDIS + key, objs);
    }

    /**
     * 通過用戶Id獲取用戶信息
     */
    public String getUserKey(String userId) {
        return key(RedisKey.childKey.USER_KEY, userId);
    }

}

四董饰、獲取緩存類定義

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.Objects;

@Slf4j
@Component
@RequiredArgsConstructor
public class CacheService {
    private final RedisTemplate<String, Object> redisTemplate;

    /**
     * 獲取緩存數(shù)據(jù)
     **/
    public  <T> T getCacheByKey(String cacheKey, Class<T> clazz) {
        Boolean b = redisTemplate.hasKey(cacheKey);
        if (Objects.isNull(b) || Boolean.FALSE.equals(b)) {
            return null;
        }
        try {
            Object cacheObj = redisTemplate.opsForValue().get(cacheKey);
            if (Objects.nonNull(cacheObj)) {
                return clazz.cast(cacheObj);
            }
        } catch (Exception ignored) {
            //如果反序列化拋錯(cuò)蒿褂,直接重取數(shù)據(jù)
        }
        return null;
    }
}

五圆米、Controller定義 - 測(cè)試方法展示

import com.bi.my.util.CacheService;
import com.bi.my.util.RedisKeyName;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.TimeUnit;

/**
 * 用戶管理
 */
@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    private CacheService cacheService;
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 通過用戶id獲取用戶信息
     */
    @GetMapping("getUser")
    public void getUser(String userId) {
        //通過用戶ID拼接對(duì)應(yīng)Key(最終返回userKey為 wss:user:get:userId)
        String userKey = RedisKeyName.getUserKey(userId);
        //存儲(chǔ)到redis中
        redisTemplate.opsForValue().set(userKey, user, 300, TimeUnit.SECONDS);
        //拿到key去redis查詢
        User user = cacheService.getCacheByKey(userKey, User.class);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市啄栓,隨后出現(xiàn)的幾起案子娄帖,更是在濱河造成了極大的恐慌,老刑警劉巖昙楚,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件近速,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡堪旧,警方通過查閱死者的電腦和手機(jī)削葱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來淳梦,“玉大人析砸,你說我怎么就攤上這事√房纾” “怎么了干厚?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)螃宙。 經(jīng)常有香客問我蛮瞄,道長(zhǎng),這世上最難降的妖魔是什么谆扎? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任挂捅,我火速辦了婚禮,結(jié)果婚禮上堂湖,老公的妹妹穿的比我還像新娘闲先。我一直安慰自己,他們只是感情好无蜂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布伺糠。 她就那樣靜靜地躺著,像睡著了一般斥季。 火紅的嫁衣襯著肌膚如雪训桶。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天酣倾,我揣著相機(jī)與錄音舵揭,去河邊找鬼。 笑死躁锡,一個(gè)胖子當(dāng)著我的面吹牛午绳,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播映之,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼拦焚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蜡坊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起耕漱,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤算色,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后螟够,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡峡钓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年妓笙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片能岩。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寞宫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拉鹃,到底是詐尸還是另有隱情辈赋,我是刑警寧澤,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布膏燕,位于F島的核電站钥屈,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏坝辫。R本人自食惡果不足惜篷就,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望近忙。 院中可真熱鬧竭业,春花似錦、人聲如沸及舍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锯玛。三九已至咐柜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間更振,已是汗流浹背炕桨。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留肯腕,地道東北人献宫。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像实撒,于是被迫代替她去往敵國和親姊途。 傳聞我的和親對(duì)象是個(gè)殘疾皇子涉瘾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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