自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(162)
  • 收藏
  • 关注

原创 Java 面试篇-SSM 框架专题(什么是 AOP?Spring 中事务时如何实现的?事务失效的场景?Spring 中循环引用怎么解决?Springboot 的自动配置原理?Spring 常见注解?)

AOP,即面向切面编程,在 Spring 中用于将那些与业务无关但对多个对象产生影响的公共行为和逻辑抽取出来,实现公共模块复用,降低耦合。常见的应用场景包括公共日志保存和事务处理。

2025-02-10 16:16:59 5614 65

原创 Java 面试篇-MySQL 专题(如何定位慢查询、如何分析 SQL 语句、索引底层数据结构、什么是聚簇索引?什么是非聚簇索引?知道什么是回表查询?什么是覆盖索引?事务的特性、并发事务带来的问题?)

可以在 MySQL 的系统配置文件中开启慢查询日志,并设置 SQL 执行时间超过多少就记录到日志文件中,比如说项目设置的是 2 秒,超过这个时间的 SQL 就会记录在日志文件中,我们就可以在日志文件中找到执行慢的 SQL 语句。在使用索引时,遵循索引创建原则,确保索引字段是查询频繁的,使用复合索引覆盖 SQL 返回值,避免在索引上进行运算或类型转换,以及控制索引数量。非聚簇索引则是数据与索引分开存储,B+ 树的叶子节点保存的是主键值,可以有多个非聚簇索引,通常可以自定义的索引都是非聚簇索引。

2025-02-09 11:18:42 4720 46

原创 Java 面试篇-Redis 专题(Redis 常见的面试专题:缓存击穿、缓存雪崩、缓存穿透、什么是布隆过滤器、什么是延时双删、持久化的方式、Redis 分布式锁、I/O 多路复用等等)

缓存穿透是指查询一个一定不存在的数据,由于存储层查不到数据,因此不写入到缓存中,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。这种情况大概率是遭到了攻击。解决方案的话,一般来说有两种:第一种是缓存空对象;第二种是使用布隆过滤器来解决。布隆过滤器主要是用来检索一个元素是否在一个集合中。当时使用的是 Redisson 实现的布隆过滤器。它的底层原理是,先是初始化一个比较大的数组,里面存放的是二进制 0 或 1。

2025-02-07 11:20:41 6053 69

原创 博客之星2024年度-技术总结:技术探险家小板的一年的征程

欢迎来到 2024 年的技术回顾之旅!这一年,我就像一位勇敢的探险家,在技术的广袤世界中穿梭,从数据库的深渊到微服务的云端,从消息队列的迷宫到分布式事务的挑战。这趟旅程充满了惊喜和发现,也伴随着无数次深夜的“啊哈”时刻。今天,就让我们一起回味这段激动人心的技术冒险吧! 想象一下,我们正站在一个神秘的魔法森林前——这就是关系型数据库的世界。在这个充满魔力的地方,每一片树叶都代表着一条记录,每一棵大树都是一个表。而我们的任务是掌握这片森林的秘密,让数据如溪流般顺畅流动。

2025-01-21 21:33:47 1580 72

原创 微服务篇-深入了解 XXL-JOB 分布式任务调度的具体使用(XXL-JOB 的工作流程、框架搭建)

具体是通过 JobHandler 来确定任务逻辑,指定 @XxlJob("demoJobHandler") 注解中的 demoJobHandler 来确定。启动服务之后,访问 "localhost:8080/xxl-job-admin",默认端口号是 8080 ,默认的登录账号。定义一个逻辑任务,使用 @XxlJob("demoJobHandler") 注解,使用该注解标记到方法上,且。port:表示当前执行器的端口,主要作用是:给调用中心发送信息给执行器所用到的端口号。

2024-12-25 17:04:30 3586 117

原创 微服务篇-深入了解 MinIO 文件服务器(你还在使用阿里云 0SS 对象存储图片服务?教你使用 MinIO 文件服务器:实现从部署到具体使用)

MinIO 是一个高性能的对象存储服务器,专门设计用来处理大规模的非结构化数据。它提供与 Amazon S3(简单存储服务)兼容的 API,使得开发人员和运维团队能够轻松实现数据存储和管理。以下是 MinIO 的一些关键特点和概述: 1)高性能:MinIO 具有极高的吞吐量,能够支持大规模的并发请求,适用于需要快速处理大量数据的应用场景,如机器学习和数据分析等。 2)易于部署:MinIO 可以在多种环境中部署,包括本地服务器、虚拟机、容器(如 Docker和 Kubernetes

2024-12-24 10:07:07 2545 66

原创 Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:教室信息管理系统(前后端源码 + 数据库 sql 脚本)

(1)用户信息管理:添加、修改、删除、查询等功能。(2)角色信息管理:添加、修改、删除、查询等功能。(1) 角色信息管理:添加、修改、删除、分配权限等功能。(1) 教室设施信息:添加、修改、删除、查询等功能。(1)教室使用记录:添加、修改、删除、查询等功能。(1) 教室管理:添加、修改、删除、查询等功能。(1) 教师管理:添加、修改、删除、查询等功能。(1) 课程管理:添加、修改、删除、查询等功能。(1) 设施管理:添加、修改、删除、查询等功能。(1) 课程安排:添加、修改、删除、查询等功能。

2024-12-17 15:15:36 10484 110

原创 Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:药品进销存信息管理系统(前后端源码 + 数据库 sql 脚本)

(1)用户信息管理:添加、修改、删除、查询等功能。(2)角色信息管理:添加、修改、删除、查询等功能。(1) 角色信息管理:添加、修改、删除、分配权限等功能。(1) 供应商信息管理:添加、修改、删除、查询等功能。(1) 采购登记管理:添加、修改、删除、查询等功能。(1) 销售记录管理:添加、修改、删除、查询等功能。(1) 退货记录管理:添加、修改、删除、查询等功能。(1) 库存变动管理:添加、修改、删除、查询等功能。(1) 药品管理:添加、修改、删除、查询等功能。对药品进行采购、销售、调整都会进行记录。

2024-12-15 20:32:36 7703 76

原创 微服务篇-深入了解 Elasticsearch DSL 查询和 RestClient 查询、数据聚合(Bucket 聚合、带条件聚合、Metric 聚合)

导入了大量数据到 Elasticsearch 中,实现了数据的存储。不过查询数据时依然采用的是根据 id 查询,而非模糊搜索。 所以来研究下 Elasticsearch 的数据搜索功能。Elasticsearch 提供了基于 JSON 的 DSL(Domain Specific Language)语句来定义查询条件,其 JavaAPI 就是在组织 DSL 条件。举个例子: 查询所有数据: 以最简单的无条件查询为例,无条件查询的类型是:match_all

2024-12-11 15:09:19 3544 85

原创 微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)

微服务篇-深入了解索引库与文档 CRUD 操作、使用 RestCliet API 操作索引库与文档 CRUD(Java 客户端连接 Elasticsearch 服务端)Index 就类似数据库表,Mapping 映射就类似表的结构。要向 es 中存储数据,必须先创建 Index 和 Mapping 。

2024-12-09 15:05:01 6843 88

原创 微服务篇-深入了解 Elasticsearch 基础概念、Elasticsearch 倒排索引、IK 分词器(拓展词典)

数据库模糊查询随着表数据量的增多,查询性能的下降会非常明显,而搜索引擎的性能则不会随着数据增多而下降太多。目前仅 10 万不到的数据量差距就如此明显,如果数据量达到百万、千万、甚至上亿级别,这个性能差距会非常夸张。其次,功能单一数据库的模糊搜索功能单一,匹配条件非常苛刻,必须恰好包含用户搜索的关键字。而在搜索引擎中,用户输入出现个别错字,或者用拼音搜索、同义词搜索都能正确匹配到数据。

2024-12-08 15:32:29 3167 60

原创 微服务篇-深入了解 XA 模式与 AT 模式、分布式事务(部署 TC 服务、微服务集成 Seata )

GlobalTransactional 注解就是在标记事务的起点,将来 TM 就会基于这个方法判断全局事务范围,初始化全局事务。首先,要在配置文件中指定要采用的分布式事务模式。Processing)标准,XA 规范描述了全局的 TM 与局部的 RM 之间的接口,几乎所有主流的数据库。册一下分支事务,属于哪个全局,然后才能去执行业务 sql,sql 执行完后,但是 XA 规范规定 sql。每一个分支事务就是传统的单体事务,都可以满足 ACID 特性,但全局事务跨越多个服务,

2024-12-05 11:31:49 2580 98

原创 Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:智行无忧停车场管理系统(前后端源码 + 数据库 sql 脚本)

统计相关车辆的信息,使用柱状图和圆饼图来展示出来,会更加直观。用户根据正确的用户名、密码且通过正确的校验码进行登录。10.0 用户信息管理功能。4.0 车辆信息管理功能。6.0 入场登记管理功能。9.0 出场登记管理功能。5.0 停车位管理功能。2.0 用户登录功能。7.0 预约管理功能。8.0 收费规则功能。

2024-12-04 20:36:07 10996 83

原创 微服务篇-微服务保护:使用 Sentinel 来实现请求限流、线程隔离、服务熔断和 Fallback 备用方案的使用

微服务保护的方案有很多,比如:请求限流、线程隔离、服务熔断。这些方案或多或少都会导致服务的体验上略有下降,比如请求限流,降低了并发上限;线程隔离,降低了可用资源数量;服务熔断,降低了服务的完整度,部分服务变的不可用或弱可用。因此这些方案都属于服务降级的方案。但通过这些方案,服务的健壮性得到了提升。

2024-11-30 15:50:39 3040 100

原创 微服务篇-深入了解 Gateway 网关路由实现路由转发、配置管理与登录校验(使用自定义过滤器 GlobalFilter、GatewayFilter 与 RequestInterceptor 拦截器)

无论是 GatewayFilter 还是 GlobalFilter 都支持自定义,只不过编码方式、使用方式略有差别。自定义 GatewayFilter 不是直接实现 GatewayFilter,而是实现 AbstractGatewayFilterFactory。@Component@Override@Override// 获取请求// 编写过滤器逻辑System.out.println("过滤器执行了");// 放行直接在 filter 函数中编写登录校验代码。

2024-11-28 19:28:35 1595 92

原创 微服务篇-深入了解使用 RestTemplate 远程调用、Nacos 注册中心基本原理与使用、OpenFeign 的基本使用

比如刚才通过 Swagger 测试商品查询接口,而这种查询就是通过 http 请求的方式来完成的,不仅仅可以实现远程查询,还可以实现新增、删除等各种远程请求。项目的架构设计、开发模式都非常简单。在微服务中,每一个模块都是独立的,那么模块与模块之间就不能直接通过 Bean 对象注入的方式来访问不同模块的方法了,则需要通过网络来建立模块与模块之间的联系了。- 服务提供者会定期向注册中心发送请求,报告自己的健康状态(心跳请求),当注册中心长时间收不到提供者的心跳时,会认为该实例宕机,将其从服务的实例列表中剔除。

2024-11-26 21:37:51 2671 76

原创 Web 毕设篇-适合小白、初级入门练手的 Spring Boot Web 毕业设计项目:电影院后台管理系统(前后端源码 + 数据库 sql 脚本)

文章目录 1.0 项目介绍 2.0 用户登录功能 3.0 用户管理功能 4.0 影院管理功能 5.0 电影管理功能 6.0 影厅管理功能 7.0 电影排片管理功能 8.0 用户评论管理功能 9.0 用户购票功能 10.0 用户购票记录管理 开发工具:IDEA、VScode 服务器:Tomcat, JDK 17 项目构建:mave

2024-11-23 12:23:31 23492 92

原创 Docker 篇-Docker 详细安装、了解和使用 Docker 核心功能(数据卷、自定义镜像 Dockerfile、网络)

Docker 是一个开源平台,用于自动化应用程序的部署、扩展和管理,采用的是容器化技术。它允许开发者将应用程序及其所有依赖项打包成轻量级、可移植的容器,从而确保无论在何种环境中运行,应用程序都能够保持一致的行为。1)docker pull:拉取镜像2)docker push:推送镜像3)docker images:查看本地镜像4)docker rmi:删除指定本地镜像5)docker run:创建容器并运行容器6)docker stop:停止指定容器7)docker start:启动指定容器。

2024-11-14 18:19:35 4708 115

原创 MybatisPlus 篇-MybatisPlus 依赖引入与基础使用(核心功能的使用、BaseMapper 接口中方法的使用、IService 接口中方法的使用、分页插件、代码自动生成等等扩展功能)

在日常开发中应该能发现,单表的 CRUD 功能代码重复度很高,也没有什么难度。而这部分代码量往往比较大,开发起来比较费时。因此,目前企业中都会使用一些组件来简化或省略单表的 CRUD 开发工作。目前在国内使用较多的一个组件就是 MybatisPlus。MyBatis-Plus 🚀 为简化开发而生为了简化单表 CRUD,MybatisPlus 提供了一个基础的 BaseMapper 基类,其中已经实现了单表的 CRUD:@MapperBaseMapper 实现的方法:测试://首先引入依赖。

2024-11-12 17:40:23 3236 93

原创 RabbitMQ 篇-深入了解延迟消息、MQ 可靠性(生产者可靠性、MQ 可靠性、消费者可靠性)

如果消息的延迟时间设置较长,可能会导致堆积的延迟消息非常多,会带来较大的 CPU 开销,同时延迟消息的时间会存在误差。不过 SpringAMQP 提供的重试机制时阻塞式的重试,也就是说多次重试等待的过程中,当前线程式被阻塞的。该插件的原理是设计了一种支持延迟消息功能的交换机,当消息投递到交换机后可以暂存一定时间,到期后再投递到队列中。当重试失败之后,不会直接将消息丢失而是交给专门接收失败信息的交换机,再由专门的消费者进行消费,比如说监听到队列中有接收失败的信息,将其写入日志中等等处理的方法。

2024-11-10 10:24:56 8693 93

原创 RabbitMQ 篇-深入了解 RabbitMQ 安装以及 SpringAMQP 的基础使用(声明队列和交换机、发送接收消息、配置 JSON 消息转化器)

但是在实际开发时,队列和交换机是程序员定义的,将来项目上线,又要交给运维去创建,那么程序员就需要把程序中运行的所有队列和交换机都写下来,交给运维,在这个过程中是是很容易出错的。默认情况下,消息是平均分配每个消费者,并没有考虑到消费者的处理能力,没有充分利用每一个消费者的能力,这样显然是有问题的。Work queues,任务模型,简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息,如果直接将消息发送到队列中,则队列每一个消息只能被处理一次,每一个消息都不能被多个消费者同时消费。

2024-11-08 17:04:00 6553 76

原创 Spring Security 框架篇-深入了解 Spring Security 的授权核心功能(RBAC 权限模型、自定义异常处理器、校验权限方法)

如果其他类频繁的调用 getAuthorities() 方法来获取权限信息,就会重复的进行封装 GrantedAuthority 实体类,因此,当 authorities 不为 Null,说明之前已经被调用 getAuthorities() 方法来获取权限信息,现在直接可以从 authorities 实体获取权限信息即可。Spring Security 为我们提供了基于注解的权限控制方案,可以使用注解去指定访问对应的资源所需的权限,需要手动开启,在 SecurityConfig 配置类上开启预授权功能。

2024-11-05 09:06:44 6656 116

原创 Spring Security 框架篇-深入了解 Spring Security 的认证功能流程和自定义实现登录接口(实现自定义认证过滤器、登出功能)

使用 springboot 3.XX.XX无法导入 WebSecurityConfigurerAdapter 类( WebSecurityConfigurerAdapter 被当前版本的 spring 弃用了),将版本改查 2.X.X 就可以解决了(无需添加 spring-security-config,会引发依赖冲突,因为 starter-security 的子依赖包含 security-config )

2024-11-02 10:36:17 4474 108

原创 若依框架篇-若依集成 X-File-Storage 框架(实现图片上传阿里云 OSS 服务器)、EasyExcel 框架(实现 Excel 数据批量导入功能)

阿里云对象存储 OSS(Object Storage Service),是一款海量、安全、低成本、高可靠的云存储服务。使用 OSS,您可以通过网络随时存储和调用包括文本、图片、音频和视频等在内的各种文件。使用了阿里云 OSS 对象存储服务之后,我们的项目当中如果涉及到文件上传这样的业务,在前端进行文件上传并请求到服务端时,在服务器本地磁盘当中就不需要再来存储文件了。我们直接将接收到的文件上传到 oss,由 oss 帮我们存储和管理,同时阿里云的 oss 存储服务还保障了我们所存储内容的安全可靠。

2024-10-22 12:02:05 8273 130

原创 若依框架篇-若依框架搭建具体过程、后端源代码分析、功能详解(权限控制、数据字典、定时任务、代码生成、表单构建、接口测试)

若依(RuoYi)框架是一个基于 Java 的开源企业级快速开发框架,主要用于构建信息管理系统。它结合了多种前端和后端技术,提供了高效的开发工具。用到的技术栈: 1)后端:采用了 Spring Boot、MyBatis、Redis 等流行技术。 2)前端:使用 Vue3 框架,结合 ElementPlus 组件库,提供了现代化的用户界面。模块化设计: 若依框架采用了模块化设计,支持多种功能模块的集成和扩展,如用户管理、角色管理、菜单管理等 RuoYi-

2024-10-16 19:22:57 12527 116

原创 工具篇-完整的 Git 项目管理工具教程(在命令框中使用 Git、在 IDEA 中使用 Git)

深入了解 git 在命令框中使用、在 IDEA 环境中使用、解决分支冲突

2024-10-12 20:30:14 5032 60

原创 MySQL 篇-深入了解 InnoDB 引擎的逻辑存储结构、架构、事务原理、MVCC 原理分析(RC 级别、RR 级别)

需要注意的是,此时修改之后的数据页在缓冲区中,是根据一定的时间才将脏数据页刷新到磁盘中,而不是数据修改完之后马上刷新的,也不是提交事务完之后马上提交的。2)Change Buffer:更改缓冲区(针对于非唯一的二级索引页),在执行 MDL 语句时,如果这些数据 Page 没有在 Buffer Pool 中,不会直接操作磁盘,而会将数据变更存放到更改缓冲区 Change Buffer 中,在未来数据被读取时,再将数据合并恢复到 Buffer Pool 中,再将合并后的数据刷新到磁盘中。

2024-10-11 10:46:24 17254 100

原创 MySQL 篇-深入了解 MySQL 锁的机制(表锁、意向锁、行锁、间隙锁、临键锁等)

对于一张表进行数据的增删改的时候,会自动加上 shared_write 锁,而进行查询的时候,会自动加上 share_read 锁,对于 shared_write 与 shared_read 都是兼容的。可以发现,在 3 加上了临键锁,将 3 的行数据锁上,还把 3 之前的全部间隙锁上,再有 3 的行锁,将 3 的行数据锁上,再接着将 3 - 7 之间的全部间隙锁上。此时锁的类型为间隙锁,将 id 为 8 - 10 之间的空隙锁起来了,而 id 为 8 和 10 的行数据不会被锁起来,锁的只是间隙。

2024-10-10 10:06:40 1699 82

原创 MySQL 篇-深入了解视图、SQL 优化(主键优化、order by 优化、group by 优化、update 优化等)

在对数据进行修改的时候,条件中的字段是存在索引且没有失效的时候,则会对索引进行加锁,也就是说其他线程再来对该行数据进行修改的时候会阻塞等待,直到锁被释放。只不过,在视图中进行增删改查的操作之前,可以对条件进行检查,满足条件就可以在表中操作数据,需要注意的是,实际是对表中的数据进行操作,视图只是映射基表中的数据。但是,对于多个字段的排序的方式不同,就需要在创建索引的时候,分别指定的排序方式,否则在查询的时候,没有对应的索引排序方式,就会走全表查询,使用 using filesore 的方式,效率较低。

2024-10-08 10:15:09 7496 94

原创 MySQL 篇-深入了解存储引擎、索引(InnoDB 索引结构 B+Tree、索引使用规则)

索引是帮助 MySQL 高效获取数据的有序的数据结构。在数据之外,数据系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用指向数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。索引的优缺点:优点:1)提高数据检索的效率,降低数据库的 IO 成本。2)通过索引列对数据进行排序,降低数据排序的成本,降低 CPU 的消耗。缺点:1)索引列也是要占用空间的。

2024-10-06 19:50:43 3600 77

原创 Redis 篇-深入了解 Redis 中的 RESP 通信协议与内存回收(过期 key 处理、内存淘汰策略)

删除完之后,再判断内存是否充足,如果还是不足,那么会接着循环来删除 key,如果达到充足的内存,则直接退出删除 key 的操作。若选择的删除策略为:TTL、LRU、LFU 这些策略,先创建一个池,用来存放准备删除的 key,在 Redis 数据库中从 0 直到 15 的数据库进行遍历抽样选择要放入池中的 key,默认每次抽样 5 个 key。如果当前内存不充足时,继续判断内存策略是否为默认 noeviction 策略,也就是即使内存满了,也不会执行删除 key 的操作,会发出错误信息。

2024-09-29 10:19:24 2975 98

原创 Redis 篇-深入了解在 Linux 的 Redis 网络模型结构及其流程(阻塞 IO、非阻塞 IO、IO 多路复用、异步 IO、信号驱动 IO)

1)抛开持久化不谈,Redis 是纯内存操作,执行速度非常快,它的性能瓶颈是网络延迟而不是执行速度,因此多线程并不会带来巨大的性能提升。2)多线程会导致过多的上下文切换,带来不必要的开销。3)引入多线程会面临线程安全问题,必然要引入线程锁这样的安全手段,实现复杂度增高,而且性能也会大打折扣。

2024-09-26 16:28:09 3852 97

原创 Redis 篇-深入了解 Redis 五种数据类型和底层数据结构(SDS、Intset、Dict、ZipList、SkipList、QuickList)

每次执行新增、查询、修改、删除操作时,都检查一下 dict.rehashidx 是否大于 -1,如果是则将 dict.ht[0].table[rehashidx] 的 entry 链表 rehash 到 dict.ht[1],并且将 rehashidx++。:如果当前层已经达到目标值或找到了更大的值,改变层级,将 current 指针向下移动到下一层。5)将 dict.ht[1] 赋值给 dict.ht[0],给 dict.ht[1] 初始化为空哈希表,释放原来的 dict.ht[0] 的内存。

2024-09-24 15:55:26 2536 71

原创 Redis 篇-初步了解 Redis 持久化、Redis 主从集群、Redis 哨兵集群、Redis 分片集群

在子进程写入磁盘过程中,主进程有可能会进行写操作,所有为了防止脏读的情况,在写数据的时候,将内存的数据进行拷贝,再来进行写操作。在 slave 加载 RDB 文件的时候,master 也会不断接收写操作的请求命令,这些命令会先保存到 repl_baklog 文件中,等待 slave 加载完成之后,master 发送 repl_baklog 中的命令到 slave 节点中,而 slave 节点接收到命令就会执行。重新启动该 Redis 服务之后,会自动从 RDB 文件中获取数据,重新将数据放到内存中。

2024-09-17 20:49:07 2116 88

原创 Redis 篇-深入了解使用 Redis 中的 GEO 数据结构实现查询附近店铺、BitMap 实现签到功能、HyperLogLog 实现 UV 流量统计

GEO 就是 Geolocation 的简写形式,代表地理坐标。Redis 在 3.2 版本中加入了对 GEO 的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。

2024-09-14 10:22:44 2368 67

原创 Redis 篇- 实战项目中使用 Redis 实现经典功能(异步秒杀商品、点赞功能、共同关注的好友、投喂功能)

查看消息的时候,按照时间来查看,从最新的时间到最旧的时间的顺序来进行查看,比如说,朋友圈,打开朋友圈最先看到的是最新的好友信息,用户查询自己的收件箱,比如像朋友圈,按照时间来排序好友发布的信息,而查看好友的朋友圈的时候,从上至下,来查看好友的消息。从用户集合中查询信息也不难,在实现的时候不就是直接去查看当前用户的收件箱,其实不然,需要考虑的细节还挺多的。

2024-09-11 22:29:47 2569 60

原创 Redis 篇-深入了解基于 Redis 实现消息队列(比较基于 List 实现消息队列、基于 PubSub 发布订阅模型之间的区别)

key 为队列名称,*|ID 为消息的唯一 id,* 代表由 Redis 自动生成。group 代表组名,consumer 代表组内消费者名称,count 代表每次读取的最大数量,milliseconds 代表当没有消息时最长的等待时间,NOACK 代表无需手动 ACK,获取消息后自动确认。当使用 Stream 单消费者模式的时候,我们指定起始 ID 为 $ 时,代表读取最新的消息,如果我们处理一条消息的过程中,又有超过 1 条以上的消息到达队列,则下次获取时也只能获取到最新的一条,会出现漏读消息的问题。

2024-09-10 10:14:04 2203 56

原创 Redis 篇-深入了解分布式锁 Redisson 原理(可重入原理、可重试原理、主从一致性原理、解决超时锁失效)

Redisson 是一个在 Redis 的基础上实现的 Java 驻内存数据网络。它不仅提供了一系列的分布式的 Java 常用对象,还提供了许多分布式服务,其中包含了各种分布式锁的实现。Redisson 解决了不可重入问题、不可重试问题、超时释放问题、主从一致性问题。比如说,分布式锁的可重入锁、公平锁、联锁、红锁等等。

2024-09-08 21:36:17 5097 54

原创 Redis 篇-深入了解基于 Redis 实现分布式锁(解决多线程安全问题、锁误删问题和确保锁的原子性问题)

假设线程一正常获取锁之后,执行任务,但是该任务出现了阻塞情况,等待的时间较久,此时当锁到过期时间之后,就会自动被释放了,当时此时线程一还不知道当前锁被释放了,就在这时候,线程二来正常的获取锁,因为锁已经被释放了,所以线程二是可以获取锁成功的,接着,线程二获取锁之后,就开始执行任务了,此刻线程一任务执行完之后,会直接释放锁,这就出现线程一误删了线程二的锁问题。为了解决 Redis 分布式锁被误删的问题,可以想到的办法是:在释放锁之前,判断当前的锁 “是否” 是自己之前获取的锁,如果是,则可以直接释放锁;

2024-09-07 18:03:03 2131 38

原创 Redis 篇-深入了解查询缓存与缓存所带来的问题(读写不一致、缓存穿透、缓存雪崩、缓存击穿)

如果没有命中,根据用户 id 到数据库中查询用户信息,如果用户信息不为 null ,则说明用户信息是存在的,那么将用户信息写回到缓存中,方便下一次查询可以直接从缓存中获取用户信息;第一次会到数据库查询该用户信息,当该用户信息不存在时,则会在 redis 中设置空值,这样的好处,下一次的查询该用户,就不会打到数据库中了,减少了数据库的压力。设置缓存中 key 的逻辑过期,顾名思义:在实际上,缓存中的 key 是设置永远不过期,将其添加过期字段,通过查看该字段,来判断该 key 在缓存中是否已经过期了。

2024-09-03 10:30:36 2796 67

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除