Spring Boot 2.x(十四):整合Redis,看這一篇就夠了


Redis簡介

Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支持網絡、可基於內存亦可持久化的日志型、Key-Value 數據庫,並提供多種語言的 API非關系型數據庫(NoSQL)

Redis的特性

  1. Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
  2. 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
  3. 原子 – Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
  4. 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。

Redis的應用

  1. 會話緩存
  2. 數據緩存
  3. 排行榜/計數器
  4. 消息隊列

Redis的數據類型

  • String: 字符串
  • Hash: 散列
  • List: 列表
  • Set: 集合
  • Sorted Set: 有序集合

Redis的部署

PS: 我這里是基於Mac環境,Windows環境下的同學可以安裝Linux虛擬機同步進行操作。

  1. 官網下載 Stable(穩定)版本

  1. 找到下載的文件,解壓並編譯
tar -zxvf redis-5.0.4.tar.gz
mv redis-5.0.4 /usr/local/
cd /usr/local/redis-5.0.4/
make test

執行到這里,最好先執行一遍make test,確保編譯可以通過,需要大概三分鍾。
到這個就說明測試通過了。我們接着往下執行

make
cd src/
make install

執行到這里安裝就算是告一段落了,接下來我們進行redis的一些配置:

vim ../redis.conf

找到136行左右的daemonize將其屬性改為yes,可以讓redis在后台運行,然后找到500行左右的requirepass,后面輸入我們需要設置的密碼,這樣就可以通過密碼來訪問redis了。
然后我們通過指定配置文件的方式來啟動redis

./redis-server ../redis.conf

執行完事兒之后,查看是否執行成功:

ps -ef | grep redis

可以看到,我們的redis已經啟動成功了,然后通過rdm來訪問一下:

大功告成,現在萬事俱備,只欠東風。我們下面來看一下在Spring Boot中怎么使用redis吧。

在Spring Boot中的使用

Spring Boot給我們提供了現成的spring-boot-starter-data-redis,我們只需要在pom文件中將之導入即可。

		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- 創建連接池 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

然后,我們需要在配置文件中配置一些有關redis的信息:

spring:
  redis:
    host: 127.0.0.1  # IP
    port: 6379  # 端口號
    password: 123456  # 密碼
    lettuce:
      pool:
        max-active: 8 # 連接池最大連接數
        max-wait: -1ms  # 連接池最大阻塞等待時間(使用負值表示沒有限制)
        min-idle: 0 # 連接池中的最小空閑連接
        max-idle: 8 # 連接池中的最大空閑連接

接下來,我們需要對我們所需要的Redis的操作給封裝到一個接口中,方便我們去調用,這里我基於接口,抽象類,實現類的結構實現了一套Redis的方法,需要的同學可以去GitHub上下載(子項目名稱:viboot-rds),GitHub的地址在文末。這里僅僅貼出接口的部分方法

package com.itframe.dao;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 *
 */
public interface RedisDao {

	/**
	 * 判斷緩存中是否有對應的value
	 * 
	 * @param key
	 * @return boolean
	 */
	public boolean existsKey(Object key);

	/**
	 * 根據key獲取key列表(key值可為模糊匹配---taskInfo:taskDetail:* <---> *代表任意字符)
	 * 
	 * @param pattern
	 * @return Set<Object>
	 */
	public Set<Object> keys(Object pattern);

	/**
	 * 根據key刪除對應的value
	 * 
	 * @param key
	 */
	public boolean delete(Object key);

	/**
	 * 根據key獲取個數
	 * 
	 * @param key
	 */
	public int count(Object key);

	/**
	 * 批量刪除對應的value
	 * 
	 * @param keys
	 */
	public void delete(String[] keys);

	/**
	 * 批量刪除key(key值可為模糊匹配---taskInfo:taskDetail:* <---> *代表任意字符)
	 * 
	 * @param pattern
	 */
	public long deletePattern(Object pattern);

	/**
	 * 批量刪除對應的value
	 * 
	 * @param keys
	 */
	public long delete(Set<Object> keys);

	/**
	 * 寫入緩存(操作字符串)
	 * 
	 * @param key
	 * @param value
	 * @return boolean
	 */
	public boolean vSet(Object key, Object value);

	/**
	 * 寫入緩存設置時效時間(操作字符串)
	 * 
	 * @param key
	 * @param value
	 * @return boolean
	 */
	public boolean vSet(Object key, Object value, Long expireTime);

	/**
	 * 更新寫入緩存設置時效時間(操作字符串)
	 * 
	 * @param key
	 * @return boolean
	 */
	public boolean vSetUpdate(Object key, Long expireTime);

	/**
	 * 讀取緩存(操作字符串)
	 * 
	 * @param key
	 * @return Object
	 */
	public Object vGet(Object key);

	/**
	 * 哈希 添加(操作hash)
	 * 
	 * @param key
	 * @param hashKey
	 * @param value
	 */
	public void hmSet(Object key, Object hashKey, Object value);

	/**
	 * 哈希 添加(操作hash)
	 * 
	 * @param key
	 * @param map
	 */
	public void hmSetAll(Object key, Map<Object, Object> map);

	/**
	 * 哈希獲取數據(操作hash)
	 * 
	 * @param key
	 * @return Map<Object, Object>
	 */
	public Map<Object, Object> hmGet(Object key);

	/**
	 * 哈希獲取數據(操作hash)
	 * 
	 * @param key
	 * @param hashKey
	 * @return Object
	 */
	public Object hmGet(Object key, Object hashKey);

	/**
	 * 哈希刪除數據(操作hash)
	 * 
	 * @param key
	 * @param hashKey
	 * @return Object
	 */
	public Object hmDel(Object key, Object hashKey);

}

抽象類中我們進行了RedisTemplate的初始化以及序列化:

public abstract class AbstractBaseRedisDao<K, V> {

	@Resource(name = "redisTemplate")
	protected RedisTemplate<K, V> redisTemplate;

	/**
	 * 設置redisTemplate
	 * 
	 * @param redisTemplate
	 */
	public void setRedisTemplate(RedisTemplate<K, V> redisTemplate) {
		this.redisTemplate = redisTemplate;
	}

	/**
	 * 獲取 RedisSerializer
	 */
	protected RedisSerializer<String> getRedisSerializer() {
		return redisTemplate.getStringSerializer();
	}
}

在實現類中我們通過操作RestTemplate來實現接口中的方法~

Redis緩存實戰

首先,我們如果想在Spring Boot項目中啟用緩存,需要在啟動類上加上注解@EnableCaching,這個是重點,要記住了!

首先介紹一下注解三劍客:@Cacheable @CachePut@CacheEvict

  • @Cacheable:主要針對方法配置,能夠根據方法的請求參數對其進行緩存,常用於查詢操作
  • @CachePut:主要針對方法配置,能夠根據方法的請求參數對其進行緩存,常用於修改操作
  • @CacheEvict:清空緩存,主要用於刪除操作。

下面我們來看一下用法:


	/**
	 *	value: 緩存的名稱
	 *	key: 緩存的鍵
	 *	return 緩存的值
	 */ 
	@Override
    @Cacheable(value = "users", key = "#id")
    public UserDO findOne(Long id) {
    	// 如果我們第二次訪問的時候,控制台沒有打印出這句話說明是從緩存中取出
        log.info("From MYSQL");
        return userMapper.get(id);
    }

    @Override
    @CachePut(value = "users", key = "#userDO.id")
    public UserDO update(UserDO userDO) {
    	// 執行之后,再次訪問findOne的時候,應當沒有打印出“From MySQL”,且返回的是我們修改后的值,說明這一步緩存成功
        if (userMapper.update(userDO) > 0) {
            return userMapper.get(userDO.getId());
        }
        return null;
    }

    @Override
    @CacheEvict(value = "users", key = "#id")
    public int delete(Long id) {
    	// 執行之后去rdm中查看即可
        return userMapper.delete(id);
    }

測試1

第一次訪問findOne

第二次訪問findOne:

仍然是剛剛的結果,但是控制台沒有打印出任何東西,說明緩存成功


測試2

調用update后再次調用findOne:

可以看出信息已被修改且未訪問數據庫


測試3

訪問delete,查看rdm:

說明刪除成功~

源碼地址

Github
Gitee

記得順手點個star,您的肯定是對我寫作最大的動力!

公眾號

原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM