锋盈数科-知识库 Logo
首页
软件开发
计算机基础
Hello Halo
新手必读
关于本知识库
登录 →
锋盈数科-知识库 Logo
首页 软件开发 计算机基础 Hello Halo 新手必读 关于本知识库
登录
  1. 首页
  2. 软件开发
  3. JAVA
  4. Spring Boot整合Redis

Spring Boot整合Redis

0
  • JAVA
  • 发布于 2024-08-15
  • 0 次阅读
黄健
黄健

本文由 简悦 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
  1. 简单性:Jedis 的 API 设计直观,易于理解和使用。
  2. 阻塞 I/O:Jedis 使用标准的 Java 阻塞 I/O 模型,这意味着在执行网络操作时,线程会被阻塞,直到操作完成。
  3. 连接池:Jedis 提供了一个简单的连接池实现,可以帮助管理 Redis 连接。
  4. 多线程:Jedis 不是线程安全的,每个线程应该使用自己的 Jedis 实例,或者使用 JedisPool 来管理连接。
  5. 支持集群:Jedis 支持 Redis 集群模式,但需要使用 JedisCluster 类
Lettuce
  1. 异步 I/O:Lettuce 基于 Netty 框架,使用非阻塞 I/O 模型,这意味着它可以在不阻塞线程的情况下执行网络操作,从而提高性能。
  2. 响应式编程:Lettuce 支持响应式编程模型,允许使用 Project Reactor 或 Spring WebFlux 等库进行编程。
  3. 连接池:Lettuce 提供了一个高级的连接池实现,支持自动重连和连接的自动管理,
  4. 线程安全:Lettuce 的 API 设计为线程安全,可以在多个线程之间共享同一个实例。
  5. Redis 集群和哨兵:Lettuce 原生支持 Redis 集群和哨兵模式,提供了更高级的高可用性和分区功能。
选择 Jedis 还是 Lettuce?

        选择哪个库取决于您的具体需求和偏好:

        如果您需要一个简单、直观的客户端,并且不介意使用阻塞 I/O 模型,Jedis 可能是一个不错的选择。

        如果您正在构建一个高性能的应用程序,需要利用非阻塞 I/O 和异步编程的优势,或者需要原生支持 Redis 集群和哨兵,Lettuce 可能是更好的选择。

RedisTemplate 基本介绍

        RedisTemplate 提供了对 Redis 各种数据类型 (如字符串、列表、集合、散列、有序集合等) 的基本操作。

  1. ValueOperations:简单 K-V 操作。
  2. SetOperations:set 类型数据操作。
  3. ZSetOperations:zset 类型数据操作。
  4. HashOperations:针对 map 类型的数据操作。
  5. 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”

  1. getUserById(Stringid) 方法通过用户的 ID 获取用户信息。它首先尝试从 Redis 中获取用户信息,如果找不到,则假设从数据库中获取 (这里代码中并没有实现数据库操作,只是创建了一个空的 User 对象作为示例)。
  2. 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 博客

标签: #软件开发 1171 #JAVA 991
相关文章

Spring 实现 3 种异步接口 2024-10-18 09:07

大家好,我是苏三~ 如何处理比较耗时的接口? 这题我熟,直接上异步接口,使用 Callable、WebAsyncTask 和 DeferredResult、CompletableFuture等均可实现。 但这些方法有局限性,处理结果仅返回单个值。在某些场景下,如果需要接口异步处理的同时,还持续不断地

重学SpringBoot3-集成Redis(五)之布隆过滤器 2024-10-08 11:24

更多SpringBoot3内容请关注我的专栏:《SpringBoot3》 期待您的点赞👍收藏⭐评论✍ 重学SpringBoot3-集成Redis(五)之布隆过滤器 1. 什么是布隆过滤器? * 基本概念 适用场景 2. 使用 Redis 实现布隆过滤器 * 项目依赖 Redis 配置

SpringBoot整合异步任务执行 2024-10-08 11:24

同步任务: 同步任务是在单线程中按顺序执行,每次只有一个任务在执行,不会引发线程安全和数据一致性等 并发问题 同步任务需要等待任务执行完成后才能执行下一个任务,无法同时处理多个任务,响应慢,影响用 户体验 异步任务: 异步任务是在多线程中同时执行,多个任务可以并发执行,同时处理多个请求,响应快,资源

springboot kafka多数据源,通过配置动态加载发送者和消费者 2024-10-08 11:24

前言 最近做项目,需要支持kafka多数据源,实际上我们也可以通过代码固定写死多套kafka集群逻辑,但是如果需要不修改代码扩展呢,因为kafka本身不处理额外逻辑,只是起到削峰,和数据的传递,那么就需要对架构做一定的设计了。 准备test kafka本身非常容易上手,如果我们需要单元测试,引入ja

SpringBoot 集成 Redis 2024-10-08 11:24

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客户端可以使用多种语

SpringBoot整合QQ邮箱 2024-10-08 11:24

SpringBoot可以通过导入依赖的方式集成多种技术,这当然少不了我们常用的邮箱,现在本章演示SpringBoot整合QQ邮箱发送邮件…. 下面按步骤进行: 1.获取QQ邮箱授权码 1.1 登录QQ邮箱 1.2 开启SMTP服务 找到下图中的SMTP服务区域,如果当前账号未开启的话自己手动开启。

目录

IT 外包服务商

  • 意见投递
  • zyf6619

软件开发应用

主菜单

  • 首页
  • 软件开发
  • 计算机基础
  • Hello Halo
  • 新手必读
  • 关于本知识库
Copyright © 2024 your company All Rights Reserved. Powered by Halo.