從零開始學Spring Boot系列-集成Redis
Redis簡介
在開始集成之前,了解Redis的基礎知識是非常重要的。Redis是一個開源的、使用ANSI C編寫的、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。它通常被稱為數據結構服務器,因為值(value)可以是 字符串(string)、哈希(Hash)、列表(list)、集合(sets)、有序集合(sorted sets)等類型。
集成Redis到Spring Boot項目中的作用主要體現在以下幾個方面:
- 緩存機制
Redis作為一個高性能的內存數據存儲系統,非常適合作為緩存層。通過將部分數據存儲在Redis中,可以顯著減少直接從數據庫等慢速存儲中讀取數據的次數,從而提高應用程序的響應速度和性能。在Spring Boot項目中集成Redis,可以方便地利用Redis的緩存機制,將熱點數據或計算密集型數據緩存到Redis中,減少數據庫壓力,提高系統吞吐量。 - 會話管理
在Web應用程序中,用戶會話的管理是一個重要的環節。傳統的會話管理通常依賴于服務器端的Session對象,但這種方式在分布式系統中存在一些問題,如Session共享和同步的復雜性。通過將會話數據存儲在Redis中,可以實現跨多個服務器實例的會話共享和管理。在Spring Boot項目中集成Redis,可以方便地利用Redis來實現分布式會話管理,提高系統的可用性和可擴展性。 - 計數器與排名
Redis提供了豐富的數據類型和原子操作,非常適合實現計數器、排行榜等功能。通過集成Redis,Spring Boot項目可以輕松地實現高效的計數器功能,如記錄網站訪問量、用戶點贊數等。同時,Redis的有序集合(sorted sets)數據類型可以用于實現排行榜功能,如用戶積分排名、文章閱讀量排名等。 - 消息隊列與發布/訂閱
Redis支持發布/訂閱模式和列表數據結構,可以實現簡單的消息隊列功能。在Spring Boot項目中集成Redis,可以利用這些特性實現異步通信和消息傳遞。例如,可以將消息發布到Redis頻道中,由訂閱者進行異步處理,實現任務調度、通知推送等功能。 - 分布式鎖
在分布式系統中,實現數據的同步和一致性是一個挑戰。Redis提供了分布式鎖的實現方式,可以在多個進程或服務器之間同步訪問共享資源。在Spring Boot項目中集成Redis,可以利用Redis的分布式鎖功能,確保在并發訪問時數據的一致性和安全性。
綜上所述,集成Redis到Spring Boot項目中可以帶來諸多好處,包括提高系統性能、簡化會話管理、實現計數器與排名功能、實現消息隊列與發布/訂閱以及分布式鎖等。這些功能有助于提升應用程序的響應速度、可擴展性和安全性,為開發者提供更加靈活和高效的解決方案。
安裝Redis
本文是在wsl2上的Ubuntu 22.04上安裝redis。
-
輸入命令安裝redis-server
apt-get install redis-server -
編輯redis.conf
vim /etc/redis/redis.conf搜索bind關鍵字,找到如圖配置項,更改為bind 0.0.0.0,不改在WSL上打開不了服務.
![20240316150044]()
修改密碼——搜索requirepass關鍵字,找到如下配置,按i進入輸入模式,requirepass空格后面就是要設置的密碼
![20240316150208]()
-
啟動redis-server
service redis-server start停止redis-server:
service redis-server stop重啟redis-server:
service redis-server restart
Spring Boot集成Redis的步驟
添加依賴
打開項目的build.gradle文件,我們需要添加Redis的依賴。這通常包括Spring Data Redis和連接池(如Lettuce或Jedis)的依賴。
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
runtimeOnly 'mysql:mysql-connector-java:8.0.17'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3'
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
implementation 'org.apache.commons:commons-pool2'
}
配置Redis
在application.properties或application.yml文件中配置Redis服務器的相關信息,如主機名、端口號、密碼、連接池等。目前java操作redis的客戶端有jedis跟Lettuce。本文使用的是Lettuce,Lettuce的連接是基于Netty的,連接實例(StatefulRedisConnection)可以在多個線程間并發訪問,應為StatefulRedisConnection是線程安全的,所以一個連接實例(StatefulRedisConnection)就可以滿足多線程環境下的并發訪問,當然這個也是可伸縮的設計,一個連接實例不夠的情況也可以按需增加連接實例。
spring.data.redis.host=localhost
spring.data.redis.port=6379
spring.data.redis.password=your_redis_password
spring.data.redis.database=1
spring.data.redis.timeout=3000ms
spring.data.redis.lettuce.pool.enabled=true
spring.data.redis.lettuce.pool.max-active=20
spring.data.redis.lettuce.pool.max-wait=-1
spring.data.redis.lettuce.pool.max-idle=8
spring.data.redis.lettuce.pool.min-idle=0
創建配置類
創建一個配置類,比如RedisConfig.java,并配置RedisTemplate 的key跟value的序列化方式來
@Configuration
@EnableCaching
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// 使用Jackson2JsonRedisSerializer來序列化和反序列化redis的value值
ObjectMapper objectMapper = createObjectMapper();
// String的序列化
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// value序列化方式采用jackson
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(objectMapper,Object.class);
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// Hash的 key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// Hash的 value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
private static ObjectMapper createObjectMapper() {
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
objectMapper.registerModule(new JavaTimeModule());
objectMapper.registerModule(new SimpleModule().addSerializer(Long.class, ToStringSerializer.instance));
return objectMapper;
}
}
redisTemplate(RedisConnectionFactory redisConnectionFactory)方法配置了RedisTemplate。這里,我們使用了Jackson2JsonRedisSerializer來序列化和反序列化存儲在Redis中的對象值。同時,我們也配置了key和hash key的序列化方式為字符串。ObjectMapper用于配置Jackson的行為,比如是否啟用默認類型信息、時間戳的序列化方式等。
測試redis
我們在以前的文章中創建的UserController,里增加一個測試接口。
@PostMapping("/user")
public String add() {
User user=new User();
user.setName("test");
user.setAge(18);
user.setEmail("test@163.com");
userService.add(user);
return "保存成功";
}
在UserService增加一個add方法
@Service
public class UserService {
private final UserMapper userMapper;
private final UserRepository userRepository;
private final RedisTemplate<String, Object> redisTemplate;
@Autowired
public UserService(UserMapper userMapper, UserRepository userRepository, RedisTemplate<String, Object> redisTemplate) {
this.userMapper = userMapper;
this.userRepository=userRepository;
this .redisTemplate=redisTemplate;
}
public List<User> getAllUsers() {
return userMapper.findAllUsers();
}
public void add(User user) {
userRepository.save(user);
redisTemplate.boundValueOps("user_key").set(user);
}
}
測試
運行你的Spring Boot應用程序,并通過調用UserService的add方法來測試MyBatis的集成效果。你可以通過編寫單元測試或使用Postman或apipost等工具來發送HTTP請求,請求
http://localhost:8080/user 新增用戶
通過redis 可視化工具查看user_key值。

總結
當你掌握了基本的集成方法后,你可以進一步學習如何優化Redis的使用,例如使用Redis的發布/訂閱功能、事務支持、Lua腳本等。此外,了解Redis的持久化、主從復制、集群等高級特性也是非常重要的。
最后,記得查閱Spring Boot和Redis的官方文檔以及相關的社區資源,這些資源將為你提供更深入的學習和實踐機會。

在Springboot集成Redis開始集成之前,了解Redis的基礎知識是非常重要的。


浙公網安備 33010602011771號