Redis簡介
Redis 是一個開源的使用 ANSI C 語言編寫、遵守 BSD 協議、支持網絡、可基於內存亦可持久化的日志型、Key-Value 數據庫,並提供多種語言的 API的非關系型數據庫(NoSQL)。
Redis的特性
- Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
- 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Redis的應用
- 會話緩存
- 數據緩存
- 排行榜/計數器
- 消息隊列
Redis的數據類型
- String: 字符串
- Hash: 散列
- List: 列表
- Set: 集合
- Sorted Set: 有序集合
Redis的部署
PS: 我這里是基於Mac環境,Windows環境下的同學可以安裝Linux虛擬機同步進行操作。
- 官網下載 Stable(穩定)版本

- 找到下載的文件,解壓並編譯
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:

說明刪除成功~
源碼地址
記得順手點個star,您的肯定是對我寫作最大的動力!
公眾號

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