自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

蓝天it(让亿万孩子在蓝天下共享优质教育)

让亿万孩子在蓝天下共享优质教育

  • 博客(597)
  • 收藏
  • 关注

原创 ConcurrentHashMap使用的时候一定不需要考虑线程安全问题吗

但是线程2也判断了没有123 比线程1插入更快,而线程1再插入就会出现错误。所以使用ConcurrentHashMap也需要考虑线程安全问题。当线程1判断出没有123字符串 准备插入。

2024-04-19 20:07:07 195

原创 Redis事务

2而事务则是实现在服务器端的行为,用户执行MULTI命令时,服务器会将对应这个用户的客户端对象设置为一个特殊的状态,在这个状态下后续用户执行的查询命令不会被真的执行,而是被服务器缓存起来,直到用户执行EXEC命令为止,服务器会将这个用户对应的客户端对象中缓存的命令按照提交的顺序依次执行。例如在社交网站上用户A关注了用户B,那么需要在用户A的关注表中加入用户B,并且在用户B的粉丝表中添加用户A,这两个行为要么全部执行,要么全部不执行,否则会出现数据不一致的情况。

2024-04-19 10:39:31 1128

原创 Redis高级数据结构HyperLogLog

HyperLogLog(Hyper[ˈhaɪpə®])并不是一种新的数据结构(实际类型为字符串类型),而是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数的统计,数据集可以是IP、Email、ID等。如果统计 PV 那非常好办,给每个网页一个独立的 Redis 计数器就可以了,这个计数器的 key 后缀加上当天的日期。这样来一个请求,incrby 一次,最终就可以统计出所有的 PV 数据。。通过 scard 可以取出这个集合的大小,这个数字就是这个页面的 UV 数据。

2024-04-19 10:35:22 600

原创 ✔ ★Java项目——设计一个消息队列(四)【整合数据库和文件、内存数据结构设计】

此处的 “未确认消息” 就是指在⼿动 ACK 模式下, 该消息还没有被调⽤ basicAck. 此时消息不能删除,其中⼿动 ACK 是指当消息被消费之后, 由消费者主动调⽤⼀个 basicAck ⽅法, 进⾏主动确认. 服务器。硬盘上存储数据, 只是为了实现 “持久化” 这样的效果. 但是实际的消息存储/转发, 还是主要靠内存的结。为了保证消息被正确消费了, 会使⽤两种⽅式进⾏确认. ⾃动 ACK 和 ⼿动 ACK.对于 MQ 来说, 内存部分是更关键的, 内存速度更快, 可以达成更⾼的并发。

2024-04-19 09:27:15 597

原创 Redis的IO模型 和 多线程问题

具体事件处理程序向反应器reactor订阅事件,反应器监测事件,发生后通知具体事件处理程序Redis 基于 Reactor 模式开发了自己的网络事件处理器 - 文件事件处理器(file event handler,后文简称为 FEH),而该处理器又是单线程的,所以redis设计为单线程模型。采用I/O多路复用同时监听多个socket,根据socket当前执行的事件来为 socket 选择对应的事件处理器。

2024-04-16 16:58:11 1178

原创 ✔ ★Java项目——设计一个消息队列(三)【消息的存储和管理】

• 根据 Message 中的 offsetBeg 和 offsetEnd 定位到消息在⽂件中的位置. 通过randomAccessFile.seek 操作⽂件指针偏移过去. 再读取.• 读出的结果解析成 Message 对象, 修改 isValid 字段, 再重新写回⽂件. 注意写的时候要重新设定⽂件指针的位置. ⽂件指针会随着上述的读操作产⽣改变.GC 的时候会把所有有效消息加载出来, 写⼊到⼀个新的消息⽂件中, 使⽤新⽂件, 代替旧⽂件即可.

2024-04-16 10:00:15 559

原创 项目中IO实战

【代码】项目中IO实战。

2024-04-15 19:52:45 105

原创 4.8-4.12算法刷题笔记

开放寻址法代码(有空位就存,空位用null=0x3f3f3f3f)方法 1. 按行遍历(过程中有回溯、剪枝)方法2. 按每个元素遍历(没有减枝)每次遍历dfs参数是 遍历的坑位。

2024-04-14 12:54:12 647

原创 Redis的Stream 和 实现队列的方式【List、SortedSet、发布订阅、Stream、Java】

足够简单,消费消息延迟几乎为零,但是需要处理空闲连接的问题。如果线程一直阻塞在那里,Redis客户端的连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用,这个时候blpop和brpop或抛出异常,所以在编写客户端消费者的时候要小心,如果捕获到异常需要重试。其他缺点包括:做消费者确认ACK麻烦,不能保证消费者消费消息后是否成功处理的问题(宕机或处理异常等),通常需要维护一个Pending列表,保证消息处理确认;不能做广播模式,如pub/sub,消息发布/订阅模型;

2024-04-13 21:12:03 1036

原创 ✔ ★Java项目——设计一个消息队列(二)

Java项目——设计一个消息队列四. 项⽬创建五. 创建核⼼类创建 Exchange(名字、类型、持久化)创建 MSGQueue(名字、持久化、独占标识)创建 Binding(交换机名字、队列名字、bindingKey用于与routingKey匹配)创建 Message(序列化、消息属性、消息体、起始位置和结束位置、有效、工厂方法)六. 数据库设计配置 sqlite实现创建表实现数据库基本操作实现 DataBaseManager测试 DataBaseManager四. 项⽬创建创建 SpringBoot

2024-04-11 21:25:17 884

原创 redis缓存 ★代码★ 实战【红锁问题(主从同步)、分布锁性能优化、缓存数据冷热分离、大量缓存重建、双写一致问题】

【代码】redis缓存 ★代码★ 实战【红锁问题(主从同步)、分布锁性能优化、缓存数据冷热分离、大量缓存重建、双写一致问题】

2024-04-11 10:39:18 221

原创 算法数据结构(17道题)【acwing上的题在力扣的对应题】【单链表、双链表、模拟栈、队列、单调栈、单调队列、KMP、Trie树、并查集、堆、哈希表】

法一: x,x+n,x+n+n merge(f[x+n],f[x])开放寻址法代码(有空位就存,空位用null=0x3f3f3f3f)法二:将有关系的都存储在一个部落,用到根节点的距离表示关系。则让f[A] = B。

2024-04-08 11:21:33 696

原创 4.1-4.5算法刷题笔记(17道题)

法一: x,x+n,x+n+n merge(f[x+n],f[x])法二:将有关系的都存储在一个部落,用到根节点的距离表示关系。则让f[A] = B。

2024-04-08 09:58:45 1068

原创 ✔ ★Java项目——设计一个消息队列(一)【消息队列的背景知识、项目的需求分析、项目的模块划分】

另⼀⽅⾯, Producer 和 Consumer 则通过⽹络的⽅式, 远程调⽤这些 API, 实现 ⽣产者消费者模型.• Topic 是发⼀个画图红包, 发 10 块钱红包, 同时出个题, 得画的像的⼈, 才能领. 也是每个领到的⼈。在实际的后端开发中, 尤其是分布式系统⾥, 跨主机之间使⽤⽣产者消费者模型, 也是⾮常普遍的需求.⼿动应答的⽬的, 是为了保证消息确实被消费者处理成功了. 在⼀些对于数据可靠性要求⾼的场景, ⽐。

2024-04-06 21:11:29 690

原创 redis应用于公司项目实战中的分布式锁问题(减库存)【synchronized-setnx-过期时间解决死锁问题-设置锁标识解决锁误删问题-redisson解决锁续命问题】

对于一个减redis中缓存的库存数量的实战背景是分布式环境下。

2024-04-06 20:01:44 146

原创 Redis缓存设计与性能优化【缓存和数据库不一致问题,解决方案:1.加过期时间这样可以一段时间后自动刷新 2.分布式的读写锁】

以上我们针对的都是读多写少的情况加入缓存提高性能,如果写多读多的情况又不能容忍缓存数据不一致,那就没必要加缓存了,可以直接操作数据库。当然,如果数据库抗不住压力,还可以把缓存作为数据读写的主存储,异步将数据同步到数据库,数据库只是作为数据的备份。4、也可以用阿里开源的canal通过监听数据库的binlog日志及时的去修改缓存,但是引入了新的中间件,增加了系统的复杂度。1、对于并发几率很小的数据(如个人维度的订单数据、用户数据等),这种几乎不用考虑这个问题,很少会发生缓存不一致,,读读的时候相当于无锁。

2024-04-02 21:13:48 849

原创 Redis缓存设计与性能优化【并发创建同一个缓存,解决方案:互斥锁】

开发人员使用“缓存+过期时间”的策略既可以加速数据读写, 又保证数据的定期更新, 这种模式基本能够满足绝大部分需求。来解决,此方法只允许一个线程重建缓存, 其他线程等待重建缓存的线程执行完, 重新从缓存获取数据即可。重建缓存不能在短时间完成, 可能是一个复杂计算, 例如复杂的SQL、 多次IO、 多个依赖等。在缓存失效的瞬间, 有大量线程来重建缓存, 造成后端负载加大, 甚至可能会让应用崩溃。当前key是一个热点key(例如一个热门的娱乐新闻),并发量非常大。

2024-04-02 21:11:17 563

原创 Redis缓存设计与性能优化【缓存穿透、缓存击穿、缓存雪崩】

向布隆过滤器询问 key 是否存在时,跟 add 一样,也会把 hash 的几个位置都算出来,看看位数组中这几个位置是否都为 1,只要有一个位为 0,那么说明布隆过滤器中这个key 不存在。由于缓存层承载着大量请求, 有效地保护了存储层, 但是如果缓存层由于某些原因不能提供服务(比如超大并发过来,缓存层支撑不住,或者由于缓存设计不好,类似大量请求访问bigkey,导致缓存能支撑的并发急剧下降), 于是大量请求都会打到存储层, 存储层的调用量会暴增, 造成存储层也会级联宕机的情况。

2024-04-02 21:10:50 1558

原创 算法基础(20道题)【acwing上的题在力扣的对应题】【快排、归并、二分、高精度、前缀和与差分、双指针、二进制、离散化、区间合并】

力扣链接acwing链接} else {r = mid;l = 0;l = mid;} else {

2024-04-01 14:01:35 1101

原创 Redis分布式锁【synchronized不能用于分布锁,redis分布锁的死锁、加过期时间、锁误删、锁续命问题】【Redission源码分析】【redlock(主从同步问题)】【分段锁 提升性能】

但是,万一,真的出现了客户端1在拿到锁之后,还没走到释放锁的代码就宕机了,那完了,资源没办法被释放!很显然,目前这两步操作不是【原子性】的,Java代码嘛,肯定是一条一条按顺序执行的,就跟上面的例子一样,当我们出现极端情况,诶,这么说,上面这种方式在一个tomcat下,单进程的时候,是有效的,但是大伙忘了我们当前的环境,2个tomcat,分布式环境啊!其实时间设置过短,我想大家也能想得到会出现什么问题,可能业务没执行完就释放锁了,最后锁形同虚设,其他请求一样进来了,到时候又出现了跟最开始说的情景。

2024-03-31 16:36:54 534

原创 算法刷题笔记(3.25-3.29)

力扣链接acwing链接} else {r = mid;l = 0;l = mid;} else {

2024-03-31 15:24:14 1297

原创 前后端分离开发【Yapi平台】【Swagger注解自动生成接口文档平台】

前后端分离开发,就是在项目开发过程中,对于前端代码的开发由专门的前端开发人员负责,后端代码则由后端开发人员负责,这样可以做到分工明确、各司其职,提高开发效率,前后端代码并行开发,可以加快项目开发进度。目前,前后端分离开发方式已经被越来越多的公司所采用,成为当前项目开发的主流开发方式。前后端分离开发后,从工程结构上也会发生变化,即前后端代码不再混合在同一个maven工程中,而是分为 前端工程 和 后端工程。

2024-03-28 10:38:35 1338

原创 Nginx【概述:网页服务器 并发能力强】【常见命令】【部署实战】【反向代理】

Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx的网站有:百度、京东、新浪、网易、腾讯、淘宝等。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。官网:https://nginx.org/Nginx可以作为静态web服务器来部署静态资源。

2024-03-28 10:28:43 1432

原创 在项目中数据库如何优化?【MySQL主从复制(创建一个从节点复制备份数据)】【数据库读写分离ShardingJDBC(主库写,从库读)】

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。二进制日志:​二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。

2024-03-26 14:50:05 1232

原创 在项目中缓存如何优化?SpringCache接口返回值的缓存【CachePut、CacheEvict、Cacheable】

Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能,大大简化我们在业务中操作缓存的代码。Spring Cache只是提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。

2024-03-26 14:17:08 845

原创 SpringBoot如何实现缓存预热?【监听ioc或者bean更新事件、PostConstruct、初始化事件中添加、】

转自 www.javacn.site在 Spring Boot 启动之后,可以通过以下手段实现缓存预热:ContextRefreshedEvent Vs ApplicationReadyEventContextRefreshedEvent 和 ApplicationReadyEvent 发生的时间和应用场景略有不同:所以说,ContextRefreshedEvent 事件被触发时,Spring容器中的 Bean 已经准备好了,但应用可能还没有完全启动,尚未准备好接收请求。而 ApplicationRe

2024-03-25 16:23:20 809

原创 StringRedisTemplate与RedisTemplate详解【序列化的方式不同】

来进行对redis的各种操作,它支持所有的 redis 原生的 api。RedisTemplate中定义了对5种数据结构操作。spring 封装了。

2024-03-24 21:15:40 245

原创 【Redis主从架构。主从工作原理psync、bgsave、部分数据复制、主从复制风暴解决方案】【Redis哨兵高可用架构。sentinel】【redis管道和lua脚本】

缓存最近一段时间的数据,master和它所有的slave都维护了复制的数据下标offset和master的进程id,因此,当网络连接断开后,slave会请求master继续进行未完成的复制,从所记录的数据下标开始。如果master进程id变化了,或者从节点数据下标offset太旧,已经不在master的缓存队列里了,那么将会进行一次全量数据的复制。如果有很多从节点,为了缓解主从复制风暴(多个从节点同时复制主节点导致主节点压力过大),可以做如下架构,让部分从节点与从节点(与主节点同步)同步数据。

2024-03-24 21:06:38 527

原创 Redis持久化【RDB,bgsave的写时复制机制】【AOF,aof重写机制】【Redis混合持久化,以及对应改变aof重写规则】【Redis数据备份策略】

如果开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理,并且将RDB快照内容和增量的AOF修改内存数据的命令存在一起,都写入新的AOF文件,新的文件一开始不叫appendonly.aof,等到重写完新的AOF文件才会进行改名,覆盖原有的AOF文件,完成新旧两个AOF文件的替换。从 1.1 版本开始,注意,如果执行带过期时间的set命令,aof文件里记录的是并不是执行的原始命令,而是记录key过期的时间戳。

2024-03-24 20:59:59 851

原创 我的算法刷题笔记(3.18-3.22)

【代码】我的算法刷题笔记(3.18-3.22)

2024-03-24 20:29:32 1328

原创 【redis的高级命令:keys 支持通配符查询但是也是查全部】【redis的高级命令:scan cursor match count】【redis的高级命令:info】

全量遍历键,用来列出所有满足特定正则字符串规则的key,当redis数据量比较大时,性能比较差,要避免使用。

2024-03-23 10:54:38 133

原创 【redis单线程:键值对读写和单个网络IO处理、多线程:网络IO和持久化、异步删除、集群数据同步】【redis快的原因:内存、避免多线程切换】【redis处理多并发客户端:IO多路复用,事件分配器】

正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些耗时的指令(比如keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如。等,其实是由额外的线程执行的。

2024-03-23 10:45:15 142

原创 Redis五种数据结构,以及所对应在大厂中的实战应用

原因是:大规模集群,用hash存储,只能部署在一个机器上,那么所有访问都访问在一个机器上,效率底。

2024-03-22 21:38:26 340

原创 try catch捕获异常,如果代码多了就显得冗余重复。我们可以用ControllerAdvice捕获全局异常变量处理

【代码】try catch捕获异常,如果代码多了就显得冗余重复。我们可以用ControllerAdvice捕获全局异常变量处理。

2024-03-17 15:10:22 344

原创 AntPathMatcher【Spring中提供的路径匹配器】

那我们只需要写出用AntPathMatcher判断访问url是否与/**/*.html匹配便可以知道结果。我们要求所有以html结尾的访问,都放行。

2024-03-16 02:48:24 357

原创 MongoDB快速⼊⻔【简介、基本操作、索引、执行计划、UI客户端工具、SpringBoot整合MongoDB】

转自 黑马

2024-03-04 23:22:21 500

原创 Lombok的常用注解示例【Data、Setter、Getter、Slf4j、NoArgsConstructor、AllArgsConstructor、Builder】

配置安装。

2024-03-03 22:50:09 335

原创 Nginx-概述

Nginx-概述介绍下载和安装目录结构Nginx-命令Nginx-应用配置文件结构部署静态资源反向代理介绍下载和安装目录结构Nginx-命令Nginx-应用配置文件结构部署静态资源反向代理

2024-03-03 14:15:38 393 1

原创 项目实战 MySQL读写分离【构建主从结构数据库(查从库)(增删改主库)】【ShardingJDBC实现读写分离】

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制,然后再解析日志并应用到自身,最终实现 从库 的数据和 主库 的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。二进制日志:​ 二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。

2024-03-03 11:58:04 470

原创 Redis缓存示例【一篇看懂数据库缓存的技术redis】

所以,这里面我们在缓存时,可以根据菜品的分类,缓存多份数据,页面在查询时,点击的是哪个分类,我们就查询该分类下的菜品缓存数据。​ 在使用缓存过程中,要注意保证数据库中的数据和缓存中的数据一致,如果数据库中的数据发生变化,需要及时清理缓存数据。3). 在服务端UserController的login方法中,从Redis中获取缓存的验证码,如果登录成功则删除Redis中的验证码;当服务器想访问数据库时,可以先访问redis,看是否之前访问过想要的数据,这样就可以直接拿到想要的数据,而不需要再次访问读写数据库。

2024-03-03 10:46:31 847

空空如也

空空如也

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

TA关注的人

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