下面是Spring Boot整合MySQL和Redis的详细过程:
1. Spring Boot引入相关依赖
首先需要在pom.xml文件中引入Spring Boot相关依赖,包括Spring Boot Web、Spring Boot JDBC和MySQL驱动程序、Spring Data Redis以及Jedis Redis客户端。在pom.xml文件中添加以下代码:
<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Boot JDBC and MySQL Driver -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- Spring Data Redis and Jedis Redis Client -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
2. 配置MySQL数据源
在application.properties文件中进行MySQL数据源配置,包括数据库URL、用户名和密码,如下代码所示:
# MySQL DataSource
spring.datasource.url=jdbc:mysql://localhost:3306/mysql_db
spring.datasource.username=root
spring.datasource.password=root
3. 配置Redis数据源
同样,需要在application.properties文件中配置Redis数据源,包括Redis服务器IP和端口,如下代码所示:
# Redis DataSource
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=
4. 配置RedisTemplate
在Spring Boot中,可以使用RedisTemplate来访问Redis数据库。因此需要进行RedisTemplate的配置。在Spring Boot中,可以通过在@Configuration注解的类中创建RedisTemplate Bean来完成配置。以下是一个例子,我们定义了一个RedisTemplate Bean,设置序列化方式为JSON:
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
// Use Jackson2JsonRedisSerializer to serialize and deserialize the values in redis (default is JdkSerializationRedisSerializer)
Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.setKeySerializer(new StringRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.afterPropertiesSet();
return template;
}
}
5. 编写MySQL和Redis数据访问代码
现在开始编写具体的MySQL和Redis数据访问代码。首先需要定义实体类,其次需要定义数据访问接口和实现类,最后就可以在服务层或控制层中使用MySQL和Redis来进行数据访问了。
以下是一个MySQL访问示例代码:
@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity(name = "user")
public class UserEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false)
private String name;
}
@Repository
public interface UserRepository extends JpaRepository<UserEntity, Long> {
UserEntity findByName(String name);
}
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Override
public UserEntity save(UserEntity userEntity) {
return userRepository.save(userEntity);
}
@Override
public UserEntity getByName(String name) {
return userRepository.findByName(name);
}
}
以下是一个Redis访问示例代码:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserCache {
private Long id;
private String name;
public static UserCache from(UserEntity userEntity) {
return new UserCache(userEntity.getId(), userEntity.getName());
}
}
@Repository
public class UserCacheRepository {
private static final String USER_CACHE_KEY = "user-cache";
@Autowired
private RedisTemplate<String, Object> redisTemplate;
public UserCache save(UserEntity userEntity) {
UserCache userCache = UserCache.from(userEntity);
redisTemplate.opsForHash().put(USER_CACHE_KEY, userCache.getId().toString(), userCache);
return userCache;
}
public UserCache getById(Long id) {
return (UserCache) redisTemplate.opsForHash().get(USER_CACHE_KEY, id.toString());
}
}
@Service
public class UserCacheServiceImpl implements UserCacheService {
@Autowired
private UserCacheRepository userCacheRepository;
@Override
public UserCache save(UserEntity userEntity) {
return userCacheRepository.save(userEntity);
}
@Override
public UserCache getById(Long id) {
return userCacheRepository.getById(id);
}
}
6. 示例说明
以下是一个示例说明。
假设我们有一个用户数据表,包含用户ID和用户名两个字段。我们现在需要编写一个API来查询用户数据,如果Redis缓存中存在对应的数据,则直接返回缓存数据;否则从MySQL中查询并返回数据,并将数据保存到Redis缓存中以便下次查询时使用。
首先,我们需要定义一个UserDTO来封装查询结果,由于返回结果中包含了用户数据以及缓存中的标记,因此可以定义如下代码:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserDTO {
private Long id;
private String name;
private boolean isCached;
}
接着,在UserService中编写一个API来查询用户数据:
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private UserCacheRepository userCacheRepository;
@Override
public UserDTO getUser(Long userId) {
UserDTO res = null;
UserCache cachedUser = userCacheRepository.getById(userId);
if (cachedUser != null) {
res = new UserDTO(cachedUser.getId(), cachedUser.getName(), true);
} else {
UserEntity userEntity = userRepository.findById(userId).orElse(null);
if (userEntity != null) {
UserCache newCachedUser = userCacheRepository.save(userEntity);
res = new UserDTO(newCachedUser.getId(), newCachedUser.getName(), false);
}
}
return res;
}
}
该方法中首先查询Redis缓存,如果存在对应的数据则直接返回缓存数据。如果没有缓存数据,则从MySQL中查询用户数据并返回,并将查询结果存入Redis缓存中以便下次查询时使用。
以上就是Spring Boot整合MySQL和Redis的详细攻略。希望对您有帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot整合Mysql和Redis的详细过程 - Python技术站