SpringBoot Redis快速集成使用


title: SpringBoot Redis快速集成使用
tags: redis,springboot,redisTemplate


Redis數(shù)據(jù)類型

原生能力參考runoob教程

數(shù)據(jù)類型 存儲(chǔ)的值 讀寫能力
String 可以是字符串吭从、整數(shù)或浮點(diǎn)數(shù)悄蕾,統(tǒng)稱為元素 對(duì)字符串操作 對(duì)整數(shù)類型加減
List 一個(gè)序列集合且每個(gè)節(jié)點(diǎn)都包好了一個(gè)元素 序列兩端推入桩皿、或彈出元素 修剪殷费、查找或移除元素
Set 各不相同的元素 從集合中插入或刪除元素
Hash 有key-value的散列組乒省,其中key是字符串,value是元素 按照key進(jìn)行增加刪除
Sort Set 帶分?jǐn)?shù)的score-value有序集合谍椅,其中score為浮點(diǎn)丸升,value為元素 集合插入,按照分?jǐn)?shù)范圍查找

SpringBoot 集成

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.51</version>
</dependency>

application.yaml 文件

spring:
  redis:
    host: localhost
    port: 6379
    database: 0

RedisConfig.java

通過比較Jackson和FastJson后選擇使用FastJson做value的序列化


import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericToStringSerializer;

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用 GenericFastJsonRedisSerializer 替換默認(rèn)序列化
        GenericFastJsonRedisSerializer genericFastJsonRedisSerializer = new GenericFastJsonRedisSerializer();

        // 設(shè)置key和value的序列化規(guī)則
        redisTemplate.setKeySerializer(new GenericToStringSerializer<>(Object.class));
        redisTemplate.setValueSerializer(genericFastJsonRedisSerializer);
        // 設(shè)置hashKey和hashValue的序列化規(guī)則
        redisTemplate.setHashKeySerializer(new GenericToStringSerializer<>(Object.class));
        redisTemplate.setHashValueSerializer(genericFastJsonRedisSerializer);

        // 設(shè)置支持事物
        redisTemplate.setEnableTransactionSupport(true);

        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}

測(cè)試代碼

RedisTests.java


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.*;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.util.*;

import static junit.framework.TestCase.assertEquals;

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RedisTests {

    /**
     * 所有操作都可以通過redisTemplate來完成
     */
    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    /**
     * String類型佑颇,value可以是String,Integer,Float顶掉,
     */
    @Resource(name = "redisTemplate")
    private ValueOperations<String, String> valueOperations;

    /**
     * List類型,從左或右推入挑胸、取出元素
     * 可以做先進(jìn)先出(隊(duì)列)痒筒、先進(jìn)后出操作
     */
    @Resource(name = "redisTemplate")
    private ListOperations<String, String> listOperations;

    /**
     * 存儲(chǔ)不重復(fù)的元素
     */
    @Resource(name = "redisTemplate")
    private SetOperations<String, String> setOperations;

    /**
     * 存儲(chǔ)鍵值對(duì)
     */
    @Resource(name = "redisTemplate")
    private HashOperations<String, String, String> hashOperations;

    /**
     * 有序集合,可以用于排序篩選操作
     */
    @Resource(name = "redisTemplate")
    private ZSetOperations<String, String> zSetOperations;

    @Test
    public void contextLoads() {
    }

    @Test
    public void testString() {
        String key = "string_key";
        String value = "string_value";
        // 添加
        valueOperations.set(key, value);
        
        // 查找
        assertEquals(value, valueOperations.get(key));

        // 刪除
        valueOperations.getOperations().delete(key);

        // 批量添加
        Map<String, String> map = new HashMap<>();
        map.put(key, value);
        valueOperations.multiSet(map);

        // 批量查詢
         valueOperations.multiGet(Arrays.asList(key));

        // 批量刪除
        valueOperations.getOperations().delete(Arrays.asList(key));
    }

    @Test
    public void testList() {
        String key = "list_key";
        String value = "list_value";
        // 從左側(cè)添加一個(gè)元素
        listOperations.leftPush(key, value);
        // 獲取指定索引位置的元素
        assertEquals(value, listOperations.index(key, 0));
        // 從右側(cè)取出一個(gè)元素
        assertEquals(value, listOperations.rightPop(key));

        // 批量插入
        listOperations.leftPushAll(key, value, value, value);
        listOperations.leftPushAll(key, Arrays.asList(value, value, value));

        // 刪除所有值為value的元素
        listOperations.remove(key, 0, value);

    }

    @Test
    public void testSet() {
        String key = "set_key";
        String value = "set_value";
        // 添加元素茬贵,可批量添加
        setOperations.add(key, value);
        // 查詢?cè)厥欠翊嬖?        assertEquals(Boolean.TRUE, setOperations.isMember(key, value));
        // 批量查詢
        Set<String> members = setOperations.members(key);
        assertEquals(true, members.contains(value));
        // 刪除元素簿透,可批量刪除
        setOperations.remove(key, value);
    }

    @Test
    public void testHash() {
        String key = "hash_key";
        String hash_key = "hash_hash_key";
        String hash_value = "hash_hash_value";
        // 添加,修改
        hashOperations.put(key, hash_key, hash_value);
        // 查找
        assertEquals(hash_value, hashOperations.get(key, hash_key));
        // 刪除解藻,批量刪除
        hashOperations.delete(hash_key, hash_key);

        // 批量添加
        HashMap<String, String> map = new HashMap<>();
        map.put(hash_key, hash_value);
        hashOperations.putAll(key, map);

        // 批量查找
        hashOperations.multiGet(key, Arrays.asList(hash_key));
    }

    @Test
    public void testZSet() {
        String key = "set_key";
        String value = "set_value";

        // 添加元素
        zSetOperations.add(key, value, 1.0);
        // 刪除元素
        zSetOperations.remove(key, value);
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末老充,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子螟左,更是在濱河造成了極大的恐慌啡浊,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胶背,死亡現(xiàn)場(chǎng)離奇詭異虫啥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)奄妨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門涂籽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人砸抛,你說我怎么就攤上這事评雌。” “怎么了直焙?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵景东,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我奔誓,道長(zhǎng)斤吐,這世上最難降的妖魔是什么搔涝? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮和措,結(jié)果婚禮上庄呈,老公的妹妹穿的比我還像新娘。我一直安慰自己派阱,他們只是感情好诬留,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著贫母,像睡著了一般文兑。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上腺劣,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天绿贞,我揣著相機(jī)與錄音,去河邊找鬼橘原。 笑死樟蠕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的靠柑。 我是一名探鬼主播寨辩,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼歼冰!你這毒婦竟也來了靡狞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤隔嫡,失蹤者是張志新(化名)和其女友劉穎甸怕,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腮恩,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡梢杭,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了秸滴。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片武契。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖荡含,靈堂內(nèi)的尸體忽然破棺而出咒唆,到底是詐尸還是另有隱情,我是刑警寧澤释液,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布全释,位于F島的核電站,受9級(jí)特大地震影響误债,放射性物質(zhì)發(fā)生泄漏浸船。R本人自食惡果不足惜妄迁,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望李命。 院中可真熱鬧登淘,春花似錦、人聲如沸项戴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽周叮。三九已至,卻和暖如春界斜,著一層夾襖步出監(jiān)牢的瞬間仿耽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工各薇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留项贺,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓峭判,卻偏偏與公主長(zhǎng)得像开缎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子林螃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,815評(píng)論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理奕删,服務(wù)發(fā)現(xiàn),斷路器疗认,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 《天才在左横漏,瘋子在右》這本書之前看過谨设,不過我看到的是高銘寫的那個(gè)版本,高銘那版是以訪談錄的形式記錄另外個(gè)角落的人群...
    帝天宇閱讀 930評(píng)論 7 32
  • 【幸福男孩缎浇,郟縣扎拣,張易,堅(jiān)持分享第130天素跺,2018.3.25】 今天晚上鹏秋,我寫完作業(yè),媽媽說我真是個(gè)好孩子亡笑,我問...
    簡(jiǎn)單男孩閱讀 106評(píng)論 0 1
  • 現(xiàn)在不再有精力熬夜了侣夷,頭天晚上睡的太晚的話,第二天就會(huì)恍恍惚惚仑乌,沒有精神百拓,當(dāng)然就干不好工作琴锭。所以,對(duì)抗失眠是我要首...
    如釋筆記閱讀 230評(píng)論 0 0