本文由 简悦 SimpRead 转码, 原文地址 blog.csdn.net
Spring Boot 整合 Redis
Spring Boot 整合 Redis 是一种常见的做法,用于在 Spring Boot 应用程序中添加缓存、会话管理分布式锁等功能。
浅谈 Redis
Redis 用于存储数据,且在内存当中进行存储。
但是在日常编写代码时,定义一个变量也就是属于在内存当中存储一个数据。
Redis 主要会在分布式系统当中发挥重要作用,如果是单机系统,直接通过变量存储数据的方式会比使用 Redis 更优。
为什么会使用 Redis?
主要原因是:当今的系统一般是分布式系统,存在多个进程,而进程是具有隔离性的。
我们如果要在进程之间通信,就需要通过网络的方式。
所以,Redis 是基于网络的,可以把自己的内存中的变量给别的进程,甚至别的主机的进程进行使用。
与 MySQL 对比
MySQL 存在一个最大的问题:访问数据的速度很慢。MySQL 的数据存在于硬盘当中。
很多互联网产品对于性能的要求极高。
所以 Redis 也可以作为数据库进行使用。
Redis 虽然快,但是存储空间小。
是否能让 Redis 和 MySQL 的优点相结合?
把常使用数据存放在 Redis 当中,将不常用的数据存储在 MySQL 当中。
当然代价是有的,就是系统的复杂度提升。
数据发生修改,还存在 Redis 和 MySQL 的数据同步问题。
浅谈 Redis 博客在右侧链接:浅谈 Redis 和分布式系统 - CSDN 博客
Spring Boot 整合 Redis
Redis 客户端
Jedis 和 Lettuce 是两个流行的 Java Redis 客户端库,它们都提供了对 Redis 数据库的访问和操作。下面是对这两个库的简要介绍:
Jedis
- 简单性:Jedis 的 API 设计直观,易于理解和使用。
- 阻塞 I/O:Jedis 使用标准的 Java 阻塞 I/O 模型,这意味着在执行网络操作时,线程会被阻塞,直到操作完成。
- 连接池:Jedis 提供了一个简单的连接池实现,可以帮助管理 Redis 连接。
- 多线程:Jedis 不是线程安全的,每个线程应该使用自己的 Jedis 实例,或者使用 JedisPool 来管理连接。
- 支持集群:Jedis 支持 Redis 集群模式,但需要使用 JedisCluster 类
Lettuce
- 异步 I/O:Lettuce 基于 Netty 框架,使用非阻塞 I/O 模型,这意味着它可以在不阻塞线程的情况下执行网络操作,从而提高性能。
- 响应式编程:Lettuce 支持响应式编程模型,允许使用 Project Reactor 或 Spring WebFlux 等库进行编程。
- 连接池:Lettuce 提供了一个高级的连接池实现,支持自动重连和连接的自动管理,
- 线程安全:Lettuce 的 API 设计为线程安全,可以在多个线程之间共享同一个实例。
- Redis 集群和哨兵:Lettuce 原生支持 Redis 集群和哨兵模式,提供了更高级的高可用性和分区功能。
选择 Jedis 还是 Lettuce?
选择哪个库取决于您的具体需求和偏好:
如果您需要一个简单、直观的客户端,并且不介意使用阻塞 I/O 模型,Jedis 可能是一个不错的选择。
如果您正在构建一个高性能的应用程序,需要利用非阻塞 I/O 和异步编程的优势,或者需要原生支持 Redis 集群和哨兵,Lettuce 可能是更好的选择。
RedisTemplate 基本介绍
RedisTemplate 提供了对 Redis 各种数据类型 (如字符串、列表、集合、散列、有序集合等) 的基本操作。
- ValueOperations:简单 K-V 操作。
- SetOperations:set 类型数据操作。
- ZSetOperations:zset 类型数据操作。
- HashOperations:针对 map 类型的数据操作。
- ListOperations:list 类型的数据操作。
RedisTemplate 支持自定义序列化机制,允许你定义如何序列化和反序列化存储在 Redis 中的对象。Spring Data Redis 默认使用 Java 的序列化机制,但你可以根据需要配置为 JSON 序列化、进制序列化等。
RedisTemplate 和 StringRedisTemplate 的区别
- StringRedisTemplate 继承 RedisTemplate。
- 两者的数据是不共通的 (默认的序列化机制导致 key 不一样)。
- StringRedisTemplate 默认采用的是 String 的序列化策略。
- RedisTemplate 默认采用的是 JDK 的序列化策略,会将数据先序列化成字节数组然后在存入 Redis 数据库。
总结:
- 当 redis 数据库里面本来操作的是字符串数据的时候,那使用 StringRedisTemplate 即可。
- 数据是复杂的对象类型,那么使用 RedisTemplate 是更好的选择。
6.2.4 RedisTemplate 序列化和反序列化机制
什么是序列化
- 把对象转换为字节序列的过程称为对象的序列化。
- 把字节序列恢复为对象的过程称为对象的反序列化
对象的序列化主要有两种用途
- 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中
- 在网络上传送对象的字节序列。
Redis 为什么要序列化
- 性能可以提高,不同的序列化方式性能不一样。
- 可视化工具更好查看
- 采用默认的 jdk 方式会乱码 (POJO 类需要实现 Serializable 接口)
- 采用 JSON 方式则不用,且可视化工具更好查看
自定义序列化
@Configuration
public class RedisTemplateConfiguration {
@Bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 使用GenericJackson2JsonRedisSerializer 替换默认序列化
GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
// 设置key和value的序列化规则
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// 设置hashKey和hashValue的序列化规则
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}
Redis 实践
还是那个业务,这次将使用 Spring Boot 框架和 Redis 缓存来管理用户的信息。
整个应用程序的业务逻辑是围绕用户信息的增 (add) 和查 (get) 操作展开的。使用 Redis 作为缓存层可以提高应用程序的性能,尤其是在读操作比写操作频繁的场景中。当用户信息被请求时,应用程序首先检查 Redis 缓存,如果缓存中存在,则直接返回缓存的数据,否则从数据库中获取并缓存到 Redis 中。当新用户被添加时,用户信息被保存到数据库,并立即缓存到 Redis 中,以便后续的快速访问。
用户控制器 (UserController 类):
REST 控制器,所有的请求基础路径为 “/users”
- getUserById(Stringid) 方法通过用户的 ID 获取用户信息。它首先尝试从 Redis 中获取用户信息,如果找不到,则假设从数据库中获取 (这里代码中并没有实现数据库操作,只是创建了一个空的 User 对象作为示例)。
- adduser (user user) 方法添加一个新用户。同样,它首先假设将用户信息保存到数据库 (这里没有实现数据库操作),然后将用户信息缓存到 Redis 中。
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/{id}")
public User getUserById(@PathVariable String id) {
return userService.getUserById(id);
}
@PostMapping("/")
public User addUser(@RequestBody User user) {
return userService.addUser(user);
}
}
Redis ttl 与 key 过期策略
略,详细请访问右侧博客地址:Redis ttl 与 key 过期策略 - CSDN 博客
有关 Redis 其他内容,均放置于右侧博客专栏中:Redis 的学习_写 bug 的小屁孩的博客 - CSDN 博客