??????歡迎來到我的博客,很高興能夠在這里和您見面!希望您在這里可以感受到一份輕松愉快的氛圍,不僅可以獲得有趣的內(nèi)容和知識,也可以暢所欲言、分享您的想法和見解。
- 推薦:kwan 的首頁,持續(xù)學(xué)習(xí),不斷總結(jié),共同進(jìn)步,活到老學(xué)到老
- 導(dǎo)航
- 檀越劍指大廠系列:全面總結(jié) java 核心技術(shù)點,如集合,jvm,并發(fā)編程 redis,kafka,Spring,微服務(wù),Netty 等
- 常用開發(fā)工具系列:羅列常用的開發(fā)工具,如 IDEA,Mac,Alfred,electerm,Git,typora,apifox 等
- 數(shù)據(jù)庫系列:詳細(xì)總結(jié)了常用數(shù)據(jù)庫 mysql 技術(shù)點,以及工作中遇到的 mysql 問題等
- 懶人運維系列:總結(jié)好用的命令,解放雙手不香嗎?能用一個命令完成絕不用兩個操作
- 數(shù)據(jù)結(jié)構(gòu)與算法系列:總結(jié)數(shù)據(jù)結(jié)構(gòu)和算法,不同類型針對性訓(xùn)練,提升編程思維,劍指大廠
非常期待和您一起在這個小小的網(wǎng)絡(luò)世界里共同探索、學(xué)習(xí)和成長。?????? ?? 歡迎訂閱本專欄 ??
摘要:本文介紹了如何在 Spring Boot 項目中集成 Redis,并利用 Redis 實現(xiàn)緩存功能。文章包括配置 Redis 連接、使用 Jedis 和 RedisTemplate 兩種方式進(jìn)行操作的示例代碼,并探討了它們的優(yōu)缺點。
隨著互聯(lián)網(wǎng)應(yīng)用的不斷發(fā)展,對于數(shù)據(jù)的高效讀寫和緩存處理變得越來越重要。而 Redis 作為一款高性能的緩存數(shù)據(jù)庫,被廣泛應(yīng)用于各種大型系統(tǒng)中。本文將介紹如何在 Spring Boot 項目中集成 Redis,并利用 Redis 實現(xiàn)緩存功能。
一、配置 Redis 連接
在 Spring Boot 項目中,我們可以通過配置文件來指定 Redis 的連接參數(shù)。以 YAML 格式的配置文件為例,示例如下:
spring:
redis:
database: 3
password: xxxx
timeout: 60000 #連接超時
host: 10.xxx.14.40
port: 6379
jedis:
pool:
max-idle: 6 #最大空閑數(shù)
max-active: 100 #最大連接數(shù)
min-idle: 2 #最小空閑數(shù)
以上配置了 Redis 的數(shù)據(jù)庫編號、密碼、連接超時時間以及連接池的相關(guān)參數(shù)。
二、使用 Jedis 操作 Redis
Jedis 是 Java 操作 Redis 的一款常用客戶端庫。下面是使用 Jedis 進(jìn)行操作的示例代碼。
首先,我們需要創(chuàng)建一個 JedisConfig 類,用于配置 Jedis 連接池:
@Slf4j
@Configuration
public class JedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.timeout}")
private Integer timeout;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.database}")
private Integer database;
@Value("${spring.redis.jedis.pool.max-active}")
private int maxActive;
@Value("${spring.redis.jedis.pool.max-idle}")
private int maxIdle;
@Value("${spring.redis.jedis.pool.min-idle}")
private int minIdle;
@Bean
public JedisPool jedisPool() {
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPoolConfig.setMinIdle(minIdle);
jedisPoolConfig.setMaxTotal(maxActive);
JedisPool jedisPool = new JedisPool(jedisPoolConfig, host, port, timeout, "default", password, database);
log.info("JedisPool Connection Success:" + host + "\t" + port);
return jedisPool;
}
}
在上述代碼中,我們通過@Configuration 注解將 JedisConfig 類標(biāo)識為配置類,并通過@Bean 注解將 jedisPool 方法返回的 JedisPool 對象注冊為 Spring 的 Bean。
接下來,我們可以創(chuàng)建一個 JedisUtils 類,用于獲取 Jedis 資源和釋放連接:
@Component
public class JedisUtils {
@Autowired
private JedisPool jedisPool;
/**
* 獲取Jedis資源
*/
public Jedis getJedis() {
return jedisPool.getResource();
}
/**
* 釋放Jedis連接
*/
public void close(Jedis jedis) {
if (jedis != null) {
jedis.close();
}
}
}
在上述代碼中,我們通過@Autowired 注解將 JedisPool 對象注入到 JedisUtils 類中。通過調(diào)用 getJedis 方法,我們可以獲取一個 Jedis 資源對象,用于后續(xù)的操作。在完成操作后,調(diào)用 close 方法釋放 Jedis 連接,以便連接可以被連接池重復(fù)利用。
接下來,我們可以創(chuàng)建一個 JedisClient 類,用于具體的操作 Redis:
@Slf4j
@Component
public class JedisClient {
@Autowired
private JedisUtils jedisUtils;
/**
* 根據(jù)key查詢value值
*/
public String get(String key) {
Jedis jedis = jedisUtils.getJedis();
try {
if (!jedis.exists(key)) {
log.info("key:{}在Redis中查不到數(shù)據(jù).", key);
} else {
return jedis.get(key);
}
} catch (Exception e) {
log.error("Jedis get操作出錯", e);
} finally {
jedisUtils.close(jedis);
}
return null;
}
/**
* 設(shè)置key-value
*/
public void set(String key, String value) {
Jedis jedis = jedisUtils.getJedis();
try {
jedis.set(key, value);
} catch (Exception e) {
log.error("Jedis set操作出錯", e);
} finally {
jedisUtils.close(jedis);
}
}
/**
* 刪除key
*/
public void delete(String key) {
Jedis jedis = jedisUtils.getJedis();
try {
jedis.del(key);
} catch (Exception e) {
log.error("Jedis delete操作出錯", e);
} finally {
jedisUtils.close(jedis);
}
}
}
在上述代碼中,我們通過@Autowired 注解將 JedisUtils 對象注入到 JedisClient 類中,以獲取 Jedis 資源。然后,我們可以定義一些常見的 Redis 操作方法,例如 get、set 和 delete。
最后,我們可以在需要使用緩存的地方調(diào)用 JedisClient 類進(jìn)行 Redis 操作。例如:
@RestController
public class UserController {
@Autowired
private JedisClient jedisClient;
@GetMapping("/user/{id}")
public User getUserById(@PathVariable("id") String id) {
String key = "user:" + id;
String value = jedisClient.get(key);
if (value != null) {
return JSON.parseObject(value, User.class);
} else {
User user = userService.getUserById(id);
if (user != null) {
jedisClient.set(key, JSON.toJSONString(user));
}
return user;
}
}
}
在上述代碼中,我們首先根據(jù)緩存的 key 值查詢 Redis 中是否存在對應(yīng)的 value 值。如果存在,則直接從 Redis 中獲取緩存數(shù)據(jù)。如果不存在,則從數(shù)據(jù)庫中獲取數(shù)據(jù),并將數(shù)據(jù)存入 Redis 中以供下次使用。
三、使用 RedisTemplate 操作 Redis
除了使用 Jedis 進(jìn)行 Redis 操作外,Spring Boot 還提供了另一種方式:使用 RedisTemplate。下面是使用 RedisTemplate 進(jìn)行操作的示例代碼。
首先,我們需要創(chuàng)建一個 RedisConfig 類,用于配置 RedisTemplate:
@Configuration
public class RedisConfig {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Value("${spring.redis.timeout}")
private Integer timeout;
@Value("${spring.redis.password}")
private String password;
@Value("${spring.redis.database}")
private Integer database;
@Bean
public RedisConnectionFactory redisConnectionFactory() {
RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port);
config.setDatabase(database);
config.setPassword(RedisPassword.of(password));
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(config);
connectionFactory.setTimeout(timeout);
return connectionFactory;
}
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
// 設(shè)置key和value的序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}
}
在上述代碼中,我們通過@Configuration 注解將 RedisConfig 類標(biāo)識為配置類,并通過@Bean 注解分別注冊了 redisConnectionFactory 和 redisTemplate 對象。在 redisTemplate 方法中,我們設(shè)置了 key 和 value 的序列化方式,這里使用了 StringRedisSerializer 和 GenericJackson2JsonRedisSerializer。
接下來,我們可以在需要使用緩存的地方注入 RedisTemplate 對象,并調(diào)用相應(yīng)的方法進(jìn)行 Redis 操作。例如:
@RestController
public class UserController {
@Autowired
private RedisTemplate<String, Object> redisTemplate;
@GetMapping("/user/{id}")
public User getUserById(@PathVariable("id") String id) {
String key = "user:" + id;
User user = (User) redisTemplate.opsForValue().get(key);
if (user != null) {
return user;
} else {
user = userService.getUserById(id);
if (user != null) {
redisTemplate.opsForValue().set(key, user);
}
return user;
}
}
}
在上述代碼中,我們通過 RedisTemplate 的 opsForValue 方法獲取 ValueOperations 對象,并調(diào)用 get 方法從 Redis 中獲取緩存數(shù)據(jù)。如果數(shù)據(jù)不存在,則從數(shù)據(jù)庫中
覺得有用的話點個贊
????
唄。
??????本人水平有限,如有紕漏,歡迎各位大佬評論批評指正!????????????如果覺得這篇文對你有幫助的話,也請給個點贊、收藏下吧,非常感謝!?? ?? ??
??????Stay Hungry Stay Foolish 道阻且長,行則將至,讓我們一起加油吧!??????文章來源:http://www.zghlxwxcb.cn/news/detail-846742.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-846742.html
到了這里,關(guān)于【Redis系列】Spring Boot 集成 Redis 實現(xiàn)緩存功能的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!