springBoot整合redis使用案例詳解
一、創(chuàng)建springboot項(xiàng)目(采用骨架方式)






創(chuàng)建完成;
我們分析下pom文件中內(nèi)容:
所使用到的關(guān)鍵依賴:
<!--springBoot集成redis-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.5.4</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.5.4</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.75</version>
</dependency>
二、配置文件
server.port=8088 spring.redis.host=127.0.0.1 #Redis服務(wù)器連接端口 spring.redis.port=6379 #Redis服務(wù)器連接密碼(默認(rèn)為空) spring.redis.password=123456 #連接池最大連接數(shù)(使用負(fù)值表示沒(méi)有限制) spring.redis.pool.max-active=8 #連接池最大阻塞等待時(shí)間(使用負(fù)值表示沒(méi)有限制) spring.redis.pool.max-wait=-1 #連接池中的最大空閑連接 spring.redis.pool.max-idle=8 #連接池中的最小空閑連接 spring.redis.pool.min-idle=0 #連接超時(shí)時(shí)間(毫秒) spring.redis.timeout=30000
三、使用redis
package com.example.redis.cache;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import java.util.Collection;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.concurrent.TimeUnit;
/**
* @author wxl
* @date 2021-08-15 18:44
*/
@Slf4j
@Component
public class CacheService {
@Autowired
private StringRedisTemplate redisTemplate;
private final String DEFAULT_KEY_PREFIX = "";
private final int EXPIRE_TIME = 1;
private final TimeUnit EXPIRE_TIME_TYPE = TimeUnit.DAYS;
/**
* 數(shù)據(jù)緩存至redis
*
* @param key
* @param value
* @return
*/
public <K, V> void add(K key, V value) {
try {
if (value != null) {
redisTemplate
.opsForValue()
.set(DEFAULT_KEY_PREFIX + key, JSON.toJSONString(value));
}
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException("數(shù)據(jù)緩存至redis失敗");
}
}
/**
* 數(shù)據(jù)緩存至redis并設(shè)置過(guò)期時(shí)間
*
* @param key
* @param value
* @return
*/
public <K, V> void add(K key, V value, long timeout, TimeUnit unit) {
try {
if (value != null) {
redisTemplate
.opsForValue()
.set(DEFAULT_KEY_PREFIX + key, JSON.toJSONString(value), timeout, unit);
}
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException("數(shù)據(jù)緩存至redis失敗");
}
}
/**
* 寫(xiě)入 hash-set,已經(jīng)是key-value的鍵值,不能再寫(xiě)入為hash-set
*
* @param key must not be {@literal null}.
* @param subKey must not be {@literal null}.
* @param value 寫(xiě)入的值
*/
public <K, SK, V> void addHashCache(K key, SK subKey, V value) {
redisTemplate.opsForHash().put(DEFAULT_KEY_PREFIX + key, subKey, value);
}
/**
* 寫(xiě)入 hash-set,并設(shè)置過(guò)期時(shí)間
*
* @param key must not be {@literal null}.
* @param subKey must not be {@literal null}.
* @param value 寫(xiě)入的值
*/
public <K, SK, V> void addHashCache(K key, SK subKey, V value, long timeout, TimeUnit unit) {
redisTemplate.opsForHash().put(DEFAULT_KEY_PREFIX + key, subKey, value);
redisTemplate.expire(DEFAULT_KEY_PREFIX + key, timeout, unit);
}
/**
* 獲取 hash-setvalue
*
* @param key must not be {@literal null}.
* @param subKey must not be {@literal null}.
*/
public <K, SK> Object getHashCache(K key, SK subKey) {
return redisTemplate.opsForHash().get(DEFAULT_KEY_PREFIX + key, subKey);
}
/**
* 從redis中獲取緩存數(shù)據(jù),轉(zhuǎn)成對(duì)象
*
* @param key must not be {@literal null}.
* @param clazz 對(duì)象類型
* @return
*/
public <K, V> V getObject(K key, Class<V> clazz) {
String value = this.get(key);
V result = null;
if (!StringUtils.isEmpty(value)) {
result = JSONObject.parseObject(value, clazz);
}
return result;
}
/**
* 從redis中獲取緩存數(shù)據(jù),轉(zhuǎn)成list
*
* @param key must not be {@literal null}.
* @param clazz 對(duì)象類型
* @return
*/
public <K, V> List<V> getList(K key, Class<V> clazz) {
String value = this.get(key);
List<V> result = Collections.emptyList();
if (!StringUtils.isEmpty(value)) {
result = JSONArray.parseArray(value, clazz);
}
return result;
}
/**
* 功能描述:Get the value of {@code key}.
*
* @param key must not be {@literal null}.
* @return java.lang.String
* @date 2021/9/19
**/
public <K> String get(K key) {
String value;
try {
value = redisTemplate.opsForValue().get(DEFAULT_KEY_PREFIX + key);
} catch (Exception e) {
log.error(e.getMessage(), e);
throw new RuntimeException("從redis緩存中獲取緩存數(shù)據(jù)失敗");
}
return value;
}
/**
* 刪除key
*/
public void delete(String key) {
redisTemplate.delete(key);
}
/**
* 批量刪除key
*/
public void delete(Collection<String> keys) {
redisTemplate.delete(keys);
}
/**
* 序列化key
*/
public byte[] dump(String key) {
return redisTemplate.dump(key);
}
/**
* 是否存在key
*/
public Boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
/**
* 設(shè)置過(guò)期時(shí)間
*/
public Boolean expire(String key, long timeout, TimeUnit unit) {
return redisTemplate.expire(key, timeout, unit);
}
/**
* 設(shè)置過(guò)期時(shí)間
*/
public Boolean expireAt(String key, Date date) {
return redisTemplate.expireAt(key, date);
}
/**
* 移除 key 的過(guò)期時(shí)間,key 將持久保持
*/
public Boolean persist(String key) {
return redisTemplate.persist(key);
}
/**
* 返回 key 的剩余的過(guò)期時(shí)間
*/
public Long getExpire(String key, TimeUnit unit) {
return redisTemplate.getExpire(key, unit);
}
/**
* 返回 key 的剩余的過(guò)期時(shí)間
*/
public Long getExpire(String key) {
return redisTemplate.getExpire(key);
}
}
1、添加字符串到redis
/**
* 功能描述:添加字符串到redis
*/
@Test
void add() {
cacheService.add("test", 1234);
}
結(jié)果:

2、將對(duì)象轉(zhuǎn)換成jsonString并存入redis
/**
* 功能描述:添加對(duì)象至redis
*/
@Test
void addObject() {
User user = User.builder()
.id(ID)
.name("小萌")
.age(AGE)
.build();
cacheService.add(user.getId(), user);
}
結(jié)果:

3、將對(duì)象集合轉(zhuǎn)換成jsonString,并設(shè)置過(guò)期時(shí)間存入至redis
/**
* 功能描述:添加對(duì)象集合至redis
*/
@Test
void addObjects() {
ArrayList<User> users = new ArrayList<>();
User user = User.builder()
.id(ID)
.name("小萌")
.age(AGE)
.build();
users.add(user);
cacheService.add("key", users, 1, TimeUnit.HOURS);
}
結(jié)果:

4、獲取對(duì)象
/**
* 功能描述:獲取對(duì)象
*/
@Test
void getObject() {
User object = cacheService.getObject(ID, User.class);
System.out.println("object = " + object);
}
結(jié)果:
object = User(id=123, name=小萌, age=12)
5、獲取對(duì)象集合
/**
* 功能描述:獲取對(duì)象集合
*/
@Test
void getObjects() {
List<User> users = cacheService.getList("key", User.class);
System.out.println("users = " + users);
}
結(jié)果:
users = [User(id=123, name=小萌, age=12)]
6、添加 hash-set
/**
* 功能描述:添加 hash-set
*/
@Test
void addHashCache() {
cacheService.addHashCache("hashKey", "key", "value");
}
結(jié)果:

7、獲取 hash-setvalue
/**
* 獲取 hash-setvalue
*
* @param key must not be {@literal null}.
* @param subKey must not be {@literal null}.
*/
public <K, SK> Object getHashCache(K key, SK subKey) {
return redisTemplate.opsForHash().get(DEFAULT_KEY_PREFIX + key, subKey);
}
結(jié)果:
hashCache = value
到此這篇關(guān)于springBoot整合redis使用案例詳解的文章就介紹到這了,更多相關(guān)springBoot整合redis使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談java socket的正確關(guān)閉姿勢(shì)
這篇文章主要介紹了java socket的正確關(guān)閉姿勢(shì),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
布隆過(guò)濾器(Bloom Filter)的Java實(shí)現(xiàn)方法
下面小編就為大家?guī)?lái)一篇布隆過(guò)濾器(Bloom Filter)的Java實(shí)現(xiàn)方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
java格式化數(shù)字操作 NumberFormat及DecimalFormat
這篇文章主要介紹了java格式化數(shù)字操作 NumberFormat及DecimalFormat,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
幾句話說(shuō)清session,cookie和token的區(qū)別及說(shuō)明
這篇文章主要介紹了幾句話說(shuō)清session,cookie和token的區(qū)別及說(shuō)明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12
Java數(shù)據(jù)結(jié)構(gòu)之線段樹(shù)中的懶操作詳解
對(duì)于線段樹(shù),若要求對(duì)區(qū)間中的所有點(diǎn)都進(jìn)行更新,可以引入懶操作。懶操作包括區(qū)間更新和區(qū)間查詢操作。本文將通過(guò)一個(gè)示例和大家詳細(xì)聊聊線段樹(shù)中的懶操作,需要的可以參考一下2022-10-10
JAVA學(xué)習(xí)筆記:注釋、變量的聲明和定義操作實(shí)例分析
這篇文章主要介紹了JAVA學(xué)習(xí)筆記:注釋、變量的聲明和定義操作,結(jié)合實(shí)例形式分析了Java注釋、變量的聲明和定義相關(guān)原理、實(shí)現(xiàn)方法及操作注意事項(xiàng),需要的朋友可以參考下2020-04-04
java設(shè)計(jì)模式之簡(jiǎn)單工廠模式簡(jiǎn)述
這篇文章主要為大家詳細(xì)介紹了java設(shè)計(jì)模式之簡(jiǎn)單工廠模式,簡(jiǎn)單工廠模式的實(shí)質(zhì)是由一個(gè)工廠類根據(jù)傳入的參數(shù),動(dòng)態(tài)決定應(yīng)該創(chuàng)建哪一個(gè)產(chǎn)品類的實(shí)例,感興趣的小伙伴們可以參考一下2016-08-08
java用split分割字符串的一個(gè)有趣現(xiàn)象
最近在項(xiàng)目中使用了java中的split分割字符串,發(fā)現(xiàn)了一個(gè)bug,充分了展示了自己對(duì)java底層的認(rèn)知有很多的不足和欠缺。下面將這次的經(jīng)過(guò)總結(jié)出來(lái)分享給大家,有需要的朋友們可以參考借鑒,下面來(lái)一起看看吧。2016-12-12

