当前位置: 首页 > news >正文

Spring Boot整合Redis

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 {@Beanpublic 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 {@Autowiredprivate 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博客

相关文章:

Spring Boot整合Redis

Spring Boot整合Redis Spring Boot 整合 Redis 是一种常见的做法&#xff0c;用于在 Spring Boot 应用程序中添加缓存、会话管理分布式锁等功能。 浅谈Redis Redis用于存储数据&#xff0c;且在内存当中进行存储。 但是在日常编写代码时&#xff0c;定义一个变量也就是属于在内…...

kafka的leader和follower

leader和follower kafka的leader和follower是相对于分区有意义的&#xff0c;不是相对于broker。 因为每个分区都有leader和follower, leader负责读写数据。 follower负责复制leader的数据保存到自己的日志数据中&#xff0c;并在leader挂掉后重新选举出leader。 kafka会再…...

git 空仓库笔记

标识身份&#xff0c;建议先完成 Git 全局设置 git config --global user.name “账号” git config --global user.email “email” 方式一&#xff1a;克隆仓库 git clone https://url/your.git cd your_path touch README.md git add README.md git commit -m "add …...

字母异位词分组(charyw)

字母异位词分组 题目描述 给定一个字符串数组&#xff0c;将字母异位词组合在一起。字母异位词指字母相同&#xff0c;但排列不同的字符串。 输入格式 第一行正整数n&#xff0c;表示有n个字符串(1<n<1000) 第二行n个字符串&#xff0c;空格隔开 输出格式 多组字母…...

力扣 41.缺少的第一个正整数

题目描述&#xff1a; 给你一个未排序的整数数组 nums &#xff0c;请你找出其中没有出现的最小的正整数。 请你实现时间复杂度为 O(n) 并且只使用常数级别额外空间的解决方案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,0] 输出&#xff1a;3 解释&#xff1a;范围 …...

Git从入门到放弃

由于我的Git学的不太好&#xff0c;所以为了能够将以后我的学习笔记能够整理的更好&#xff0c;我先要系统的学习一下git&#xff0c;文章由此产生。 文章笔记源自尚硅谷Git入门到精通全套教程视频内容 1 进入官网 学习新技术的第一步需要熟悉官网&#xff0c;Git也不例外。ht…...

003.数据分析_PandasSeries对象

我 的 个 人 主 页&#xff1a;&#x1f449;&#x1f449; 失心疯的个人主页 &#x1f448;&#x1f448; 入 门 教 程 推 荐 &#xff1a;&#x1f449;&#x1f449; Python零基础入门教程合集 &#x1f448;&#x1f448; 虚 拟 环 境 搭 建 &#xff1a;&#x1f449;&…...

【介绍下什么是Kubernetes编排系统】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

linux防止nmap扫描

1、首先关闭Centos7自带的firewalld [rootnode ~]# systemctl disable firewalld.service && systemctl stop firewalld.service 2、安装iptables服务 [rootnode ~]# yum install iptables-services iptables-devel -y [rootnode ~]# systemctl enable iptables …...

基于SpringBoot的装饰工程管理系统源码数据库

如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统装饰工程项目信息管理难度大&#xff0c;容错率低&#xff0c;管…...

2024前端面试准备2-JS基础知识回顾

变量类型和计算 1.值类型和引用类型的区别 常见值类型:undefined(定义undefined只能用let,不能用const)、字符串、bool、number、 Symbol; 常见引用类型: 对象, 数组、null(特殊引用类型,指针指向为空地址) 、function(特殊引用类型); 值类型的值直接存储在栈中;引用类型值存储…...

C++ 环形链表(解决约瑟夫问题)

约瑟夫问题描述&#xff1a; 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数&#xff0c;报到 m 的人离开。下一个人继续从 1 开始报数。n-1 轮结束以后&#xff0c;只剩下一个人&#xff0c;问最后留下的这个人编号是多少&#xff1f; 约瑟夫问题例子&#xff1a;…...

【微信小程序】模板语法

数据绑定 对应页面的 js 文件中 定义数据到 data 中&#xff1a; 在页面中使用 {{}} 语法直接使用&#xff1a; 事件绑定 事件触发 常用事件&#xff1a; 事件对象的属性列表&#xff08;事件回调触发&#xff0c;会收到一个事件对象 event&#xff0c;它的详细属性如下&…...

深入了解 C 语言 Bug

目录 一、引言二、Bug的定义三、Bug的由来四、Bug的影响五、应对 Bug 的方法六、结论 一、引言 1、在 C 语言的编程世界中&#xff0c;Bug 是一个我们无法回避的话题。 2、Bug&#xff0c;简单来说&#xff0c;就是程序中存在的错误或缺陷。它可以表现为程序运行结果的异常、崩…...

Redis 内存回收

文章目录 1. 过期key处理1.1 惰性删除1.2 周期删除 2. 内存淘汰策略 Redis 中数据过期策略采用定期删除惰性删除策略结合起来&#xff0c;以及采用淘汰策略来兜底。 定期删除策略&#xff1a;Redis 启用一个定时器定时监视所有的 key&#xff0c;判断key是否过期&#xff0c;过…...

【讲解下ECMAScript和JavaScript之间有何区别?】

&#x1f308;个人主页: 程序员不想敲代码啊 &#x1f3c6;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f44d;点赞⭐评论⭐收藏 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共…...

Linux基本指令查询硬件信息001

在Linux系统中查询硬件信息可以通过多种命令行工具完成&#xff0c;本章主要讲述如何查询Linux硬件信息。 操作系统&#xff1a; CentOS Stream 9 操作步骤&#xff1a; 指令uname -a : 显示内核版本、硬件名称、操作系统等基本信息。 [rootlocalhost ~]# uname -a Linux …...

Spring Boot(七十四):集成Guava 库实现布隆过滤器(Bloom Filter)

之前在redis(17):什么是布隆过滤器?如何实现布隆过滤器?中介绍了布隆过滤器,以及原理,布隆过滤器有很多实现和优化,由 Google 开发著名的 Guava 库就提供了布隆过滤器(Bloom Filter)的实现。在基于 Maven 的 Java 项目中要使用 Guava 提供的布隆过滤器,只需要引入以…...

二叉查找树详解

目录 二叉查找树的定义 二叉查找树的基本操作 查找 插入 建立 删除 二叉树查找树的性质 二叉查找树的定义 二叉查找树是一种特殊的二叉树&#xff0c;又称为排序二叉树、二叉搜索树、二叉排序树。 二叉树的递归定义如下&#xff1a; &#xff08;1&#xff09;要么二…...

3072. 将元素分配到两个数组中 II

题目 给你一个下标从 1 开始、长度为 n 的整数数组 nums 。 现定义函数 greaterCount &#xff0c;使得 greaterCount(arr, val) 返回数组 arr 中 严格大于 val 的元素数量。 你需要使用 n 次操作&#xff0c;将 nums 的所有元素分配到两个数组 arr1 和 arr2 中。在第一次操…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强&#xff0c;React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 &#xff08;1&#xff09;使用React Native…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...

6.9本日总结

一、英语 复习默写list11list18&#xff0c;订正07年第3篇阅读 二、数学 学习线代第一讲&#xff0c;写15讲课后题 三、408 学习计组第二章&#xff0c;写计组习题 四、总结 明天结束线代第一章和计组第二章 五、明日计划 英语&#xff1a;复习l默写sit12list17&#…...

SpringCloud优势

目录 完善的微服务支持 高可用性和容错性 灵活的配置管理 强大的服务网关 分布式追踪能力 丰富的社区生态 易于与其他技术栈集成 完善的微服务支持 Spring Cloud 提供了一整套工具和组件来支持微服务架构的开发,包括服务注册与发现、负载均衡、断路器、配置管理等功能…...

【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 【第1题】【第2题】【第3题】【第4题】【第5题】【第6题】【第7题】【第8题】【第9题】【第10题】【第11题】【第12题】【第13题】【第14题】【第15题】【第16题】【第17题】【第18题】【第19题】【第20~21题】【第…...

解密鸿蒙系统的隐私护城河:从权限动态管控到生物数据加密的全链路防护

摘要 本文以健康管理应用为例&#xff0c;展示鸿蒙系统如何通过细粒度权限控制、动态权限授予、数据隔离和加密存储四大核心机制&#xff0c;实现复杂场景下的用户隐私保护。我们将通过完整的权限请求流程和敏感数据处理代码&#xff0c;演示鸿蒙系统如何平衡功能需求与隐私安…...

后端下载限速(redis记录实时并发,bucket4j动态限速)

✅ 使用 Redis 记录 所有用户的实时并发下载数✅ 使用 Bucket4j 实现 全局下载速率限制&#xff08;动态&#xff09;✅ 支持 动态调整限速策略✅ 下载接口安全、稳定、可监控 &#x1f9e9; 整体架构概览 模块功能Redis存储全局并发数和带宽令牌桶状态Bucket4j Redis分布式限…...