Spring Boot中使用Redis數(shù)據(jù)庫

Spring Boot中除了對常用的關(guān)系型數(shù)據(jù)庫提供了優(yōu)秀的自動化支持之外喇潘,對于很多NoSQL數(shù)據(jù)庫一樣提供了自動化配置的支持铡溪,包括:Redis, MongoDB, Elasticsearch, Solr和Cassandra。

使用Redis

Redis是一個開源的使用ANSI C語言編寫素邪、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫氓皱。

引入依賴

Spring Boot提供的數(shù)據(jù)訪問框架Spring Data Redis基于Jedis〔伲可以通過引入spring-boot-starter-redis來配置依賴關(guān)系波材。

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

參數(shù)配置

按照慣例在application.properties中加入Redis服務(wù)端的相關(guān)配置,具體說明如下:

# REDIS (RedisProperties)
# Redis數(shù)據(jù)庫索引(默認(rèn)為0)
spring.redis.database=0
# Redis服務(wù)器地址
spring.redis.host=localhost
# Redis服務(wù)器連接端口
spring.redis.port=6379
# Redis服務(wù)器連接密碼(默認(rèn)為空)
spring.redis.password=
# 連接池最大連接數(shù)(使用負(fù)值表示沒有限制)
spring.redis.pool.max-active=8
# 連接池最大阻塞等待時間(使用負(fù)值表示沒有限制)
spring.redis.pool.max-wait=-1
# 連接池中的最大空閑連接
spring.redis.pool.max-idle=8
# 連接池中的最小空閑連接
spring.redis.pool.min-idle=0
# 連接超時時間(毫秒)
spring.redis.timeout=0

其中spring.redis.database的配置通常使用0即可身隐,Redis在配置的時候可以設(shè)置數(shù)據(jù)庫數(shù)量廷区,默認(rèn)為16,可以理解為數(shù)據(jù)庫的schema

測試訪問

通過編寫測試用例贾铝,舉例說明如何訪問Redis隙轻。

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void test() throws Exception {

        // 保存字符串
        stringRedisTemplate.opsForValue().set("aaa", "111");
        Assert.assertEquals("111", stringRedisTemplate.opsForValue().get("aaa"));

    }

}

通過上面這段極為簡單的測試案例演示了如何通過自動配置的StringRedisTemplate對象進(jìn)行Redis的讀寫操作,該對象從命名中就可注意到支持的是String類型垢揩。如果有使用過spring-data-redis的開發(fā)者一定熟悉RedisTemplate<K, V>接口玖绿,StringRedisTemplate就相當(dāng)于RedisTemplate<String, String>的實現(xiàn)。

除了String類型叁巨,實戰(zhàn)中我們還經(jīng)常會在Redis中存儲對象斑匪,這時候我們就會想是否可以使用類似RedisTemplate<String, User>來初始化并進(jìn)行操作。但是Spring Boot并支持直接使用锋勺,需要我們自己實現(xiàn)RedisSerializer<T>接口來對傳入對象進(jìn)行序列化和反序列化蚀瘸,下面我們通過一個實例來完成對象的讀寫操作。

  • 創(chuàng)建要存儲的對象:User
public class User implements Serializable {

    private static final long serialVersionUID = -1L;

    private String username;
    private Integer age;

    public User(String username, Integer age) {
        this.username = username;
        this.age = age;
    }

    // 省略getter和setter

}
  • 實現(xiàn)對象的序列化接口

public class RedisObjectSerializer implements RedisSerializer<Object> {

  private Converter<Object, byte[]> serializer = new SerializingConverter();
  private Converter<byte[], Object> deserializer = new DeserializingConverter();

  static final byte[] EMPTY_ARRAY = new byte[0];

  public Object deserialize(byte[] bytes) {
    if (isEmpty(bytes)) {
      return null;
    }

    try {
      return deserializer.convert(bytes);
    } catch (Exception ex) {
      throw new SerializationException("Cannot deserialize", ex);
    }
  }

  public byte[] serialize(Object object) {
    if (object == null) {
      return EMPTY_ARRAY;
    }

    try {
      return serializer.convert(object);
    } catch (Exception ex) {
      return EMPTY_ARRAY;
    }
  }

  private boolean isEmpty(byte[] data) {
    return (data == null || data.length == 0);
  }
}

  • 配置針對User的RedisTemplate實例

@Configuration
public class RedisConfig {

    @Bean
    JedisConnectionFactory jedisConnectionFactory() {
        return new JedisConnectionFactory();
    }

    @Bean
    public RedisTemplate<String, User> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, User> template = new RedisTemplate<String, User>();
        template.setConnectionFactory(jedisConnectionFactory());
        template.setKeySerializer(new StringRedisSerializer());
        template.setValueSerializer(new RedisObjectSerializer());
        return template;
    }


}

  • 完成了配置工作后庶橱,編寫測試用例實驗效果

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(Application.class)
public class ApplicationTests {

    @Autowired
    private RedisTemplate<String, User> redisTemplate;

    @Test
    public void test() throws Exception {

        // 保存對象
        User user = new User("超人", 20);
        redisTemplate.opsForValue().set(user.getUsername(), user);

        user = new User("蝙蝠俠", 30);
        redisTemplate.opsForValue().set(user.getUsername(), user);

        user = new User("蜘蛛俠", 40);
        redisTemplate.opsForValue().set(user.getUsername(), user);

        Assert.assertEquals(20, redisTemplate.opsForValue().get("超人").getAge().longValue());
        Assert.assertEquals(30, redisTemplate.opsForValue().get("蝙蝠俠").getAge().longValue());
        Assert.assertEquals(40, redisTemplate.opsForValue().get("蜘蛛俠").getAge().longValue());

    }

}

當(dāng)然spring-data-redis中提供的數(shù)據(jù)操作遠(yuǎn)不止這些贮勃,本文僅作為在Spring Boot中使用redis時的配置參考,更多對于redis的操作使用苏章,請參考Spring-data-redis Reference寂嘉。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子垫释,更是在濱河造成了極大的恐慌丝格,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件棵譬,死亡現(xiàn)場離奇詭異显蝌,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)订咸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門曼尊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人脏嚷,你說我怎么就攤上這事骆撇。” “怎么了父叙?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵神郊,是天一觀的道長。 經(jīng)常有香客問我趾唱,道長涌乳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任甜癞,我火速辦了婚禮夕晓,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘悠咱。我一直安慰自己蒸辆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布析既。 她就那樣靜靜地躺著躬贡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪眼坏。 梳的紋絲不亂的頭發(fā)上逗宜,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天,我揣著相機(jī)與錄音空骚,去河邊找鬼。 笑死擂仍,一個胖子當(dāng)著我的面吹牛囤屹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播逢渔,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼肋坚,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起智厌,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤诲泌,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后铣鹏,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體敷扫,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年诚卸,在試婚紗的時候發(fā)現(xiàn)自己被綠了葵第。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡合溺,死狀恐怖卒密,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情棠赛,我是刑警寧澤哮奇,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站睛约,受9級特大地震影響鼎俘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜痰腮,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一而芥、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膀值,春花似錦棍丐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至翘狱,卻和暖如春秘案,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背潦匈。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工阱高, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人茬缩。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓赤惊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親凰锡。 傳聞我的和親對象是個殘疾皇子未舟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,472評論 2 348

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

  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,773評論 6 342
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理圈暗,服務(wù)發(fā)現(xiàn),斷路器裕膀,智...
    卡卡羅2017閱讀 134,629評論 18 139
  • 你好啊 我是七尾貓 不是九尾貓 是七尾貓 不是南方姑娘 勵志要做北方女王. 因為早出生一天就是雙子座 所以具有了雙...
    七尾貓i閱讀 303評論 0 1
  • 天啊昼扛,昨天晚上竟然做了一個“多肉夢”寸齐。 相信大多數(shù)同學(xué)做夢都夢見過撿錢啊、撿金子啊野揪。 PS:如果沒有访忿,那就是我太財...
    六六多肉花園閱讀 252評論 0 0
  • 世界上最親的人 是姐姐 世界上最愛你的人 是姐姐 世界上最疼你的人 是姐姐 姐姐 是我世界的全部 是我心里的唯一 ...
    秦笑笑閱讀 165評論 0 1