_金欣
醉舞经阁半卷书,坐井说天阔。
展开
-
【Netty系列・高级篇】Netty核心源码解析
注意发送的数据未必能够一次读完,因此会触发多次 nio read 事件,一次事件内会触发多次 pipeline read,一次事件会触发一次 pipeline read complete。NioEventLoop 线程不仅要处理 IO 事件,还要处理 Task(包括普通任务和定时任务),主要任务是执行死循环,不断看有没有新任务,有没有 IO 事件。我们就来看看 netty 中对下面的代码是怎样进行处理的。nio 中如下代码,在 netty 中的流程。启动 EventLoop 主循环。原创 2023-02-27 10:05:55 · 1810 阅读 · 74 评论 -
【Netty系列・NIO】一文读懂NIO:三大组件、 文件编程、网络编程、IO模型
non-blocking io 非阻塞 IOchannel 有一点类似于 stream,它就是读写数据的双向通道,可以从 channel 将数据读入 buffer,也可以将 buffer 的数据写入 channel,而之前的 stream 要么是输入,要么是输出,channel 比 stream 更为底层channelbuffer常见的 Channel 有buffer 则用来缓冲读写数据,常见的 buffer 有selector 单从字面意思不好理解,需要结合服务器的设计演化来理解它的用途socket1t原创 2023-02-20 16:03:02 · 2117 阅读 · 89 评论 -
【Netty系列・初级篇】粘包与半包解决方案、协议设计、聊天室设计
魔数,用来在第一时间判定是否是无效数据包版本号,可以支持协议的升级序列化算法,消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian、jdk指令类型,是登录、注册、单聊、群聊… 跟业务相关请求序号,为了双工通信,提供异步能力正文长度消息正文/*** 用户管理接口/*** 登录* @param username 用户名* @param password 密码* @return 登录成功返回 true, 否则返回 false。原创 2023-02-23 09:08:44 · 941 阅读 · 1 评论 -
【Netty系列・扫盲篇】Netty从入门到学废
Netty技术原创 2023-02-22 10:15:28 · 931 阅读 · 0 评论 -
【Netty系列・中级篇】序列化算法优化、参数优化、RPC设计与实现
SO_TIMEOUT 主要用在阻塞 IO,阻塞 IO 中 accept,read 等都是无限等待的,如果不希望永远阻塞,使用它调整超时时间。在 linux 2.2 之前,backlog 大小包括了两个队列的大小,在 2.2 之后,分别用下面两个参数来控制。第 1,2,3 个客户端都打印,但除了第一个处于 accpet 外,其它两个都处于 accept queue 中。目前的代码仅支持 Java 自带的序列化,反序列化机制,核心代码如下。序列化,反序列化主要用在消息正文的转换上。原创 2023-02-24 13:47:26 · 1391 阅读 · 98 评论 -
【Mybatis源码解析】一级缓存和二级缓存源码解析
新版的源码并没有太多改变,发送请求时,先从二级缓存中取,未取到则去一级缓存中取,仍未取到会去数据库中查,再存到一级缓存中,当事务提交之后,会存到二级缓存中,值得注意的是,mybatis中的一些cashe相关类挺有意思的,用来解决不同场景的问题,比如脏读。MyBatis的二级缓存相对于一级缓存来说,实现了SqlSession之间缓存数据的共享,同时粒度更加的细,能够到namespace级别,通过Cache接口实现类不同的组合,对Cache的可控性也更强。useCache :是否用缓存,默认为true。原创 2023-02-17 18:04:19 · 2208 阅读 · 3 评论 -
【Mybatis源码解析】mapper实例化及执行流程源码分析
基于SpringBoot的Mybatis源码解析:1.如何对mapper实例化bean在加载BeanDefinition时,会将SqlSessionFactory、SqlSessionTemplate、MapperScannerConfigurer加载到注册表中,以供后续进行实例化。而且在此期间,mapper接口已经实例化完成了,后续从缓存中取出即可。初始化时,第一步,使用SqlSessionFactoryBean来生成SqlSessionFactory。原创 2023-02-16 17:07:51 · 2895 阅读 · 133 评论 -
Redis优化
文章目录Redis键值设计优雅的key结构拒绝BigKey什么是BigKeyBigKey的危害如何发现BigKey如何删除BigKey恰当的数据类型批处理优化Pipeline服务端优化集群最佳实践Redis键值设计优雅的key结构Redis的Key虽然可以自定义,但最好遵循下面的几个最佳实践约定:遵循基本格式:[业务名称]:[数据名]:[id]长度不超过44字节不包含特殊字符例如:我们的登录业务,保存用户信息,其key是这样的:优点:可读性强避免key冲突方便管理更节省内存:原创 2022-09-27 13:20:36 · 271 阅读 · 1 评论 -
多级缓存|JVM进程缓存【Caffeine】|OpenResty + Lua|Canal|Redis
传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图:存在下面的问题:• 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈• Redis缓存失效时,会对数据库产生冲击浏览器访问静态资源时,优先读取浏览器本地缓存访问非静态资源(ajax查询数据)时,访问服务端请求到达Nginx后,优先读取Nginx本地缓存如果Nginx本地缓存未命中,则去直接查询Redis(不经过Tomcat)如果Redis查询未命中,则查询Tomcat。原创 2022-09-03 00:51:12 · 336 阅读 · 0 评论 -
Redis分布式缓存
在Sentinel集群监管下的Redis主从集群,其节点会因为自动故障转移而发生变化,Redis的客户端必须感知这种变化,及时更新连接信息。Redis处理的每一个写命令都会记录在AOF文件,可以看做是命令日志文件。单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,就需要搭建主从集群,实现读写分离。通过执行bgrewriteaof命令,可以让AOF文件执行重写功能,用最少的命令达到相同效果。RDB和AOF各有自己的优缺点,如果对数据安全性要求较高,在实际开发中往往会结合两者来使用。...原创 2022-09-01 01:36:42 · 472 阅读 · 3 评论 -
Redis集群|主从集群|哨兵集群|分片集群|Docker版
因为redis-trib.rb是有ruby语言编写的所以需要安装ruby环境。分片集群需要的节点数量较多,这里我们搭建一个最小的分片集群,包含3个master节点,每个master包含一个slave节点。修改redis-6.2.4/redis.conf文件,将其中的持久化模式改为默认的RDB模式,AOF保持关闭状态。要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。要在同一台虚拟机开启3个实例,必须准备三份不同的配置文件和目录,配置文件所在目录也就是工作目录。.原创 2022-08-30 21:31:05 · 811 阅读 · 1 评论 -
Redis消息队列
当我们指定起始ID为$时,代表读取最新的消息,如果我们处理一条消息的过程中,又有超过1条以上的消息到达队列,则下次获取时也只能获取到最新的一条,会出现漏读消息的问题。消费者组会维护一个标示,记录最后一个被处理的消息,哪怕消费者宕机重启,还会从标示之后读取消息。确保每一个消息都会被消费。消息队列(Message Queue),字面意思就是存放消息的队列。队列中的消息会分流给组内的不同消费者,而不是重复消费,从而加快消息处理的速度。ID:起始ID标示,$代表队列中最后一个消息,0则代表队列中第一个消息。原创 2022-08-24 10:14:55 · 893 阅读 · 1 评论 -
Redis分布式锁Redisson
原理:利用setnx的互斥性;释放锁时判断线程标示 缺陷:不可重入、无法重试、锁超时失效。原理:利用hash结构,记录线程标示和重入次数;利用watchDog延续锁时间;利用信号量控制锁重试等待。分布式锁:满足分布式系统或集群模式下多进程可见并且互斥的锁。在释放锁时先获取锁中的线程标示,判断是否与当前线程标示一致。在获取锁时存入线程标示(可以用UUID表示)缺陷:redis宕机引起锁失效问题。互斥:确保只能有一个线程获取锁。如果不一致则不释放锁。原创 2022-08-23 14:07:10 · 597 阅读 · 2 评论 -
redis + lua实现分布式接口限流实现方案
redis + lua脚本已然成为了单体项目主流的限流方案。原创 2022-06-24 17:40:39 · 1344 阅读 · 4 评论 -
【Redis实现秒杀业务③】超卖问题之乐观锁具体实现
版本号机制实现的方式常用的也有两种:使用数据版本(Version)记录机制实现,这是乐观锁最常用的一种实现方式。何谓数据版本?即为数据增加一个版本标识,一般是通过为数据库表增加一个数字类型的 “version” 字段来实现。当读取数据时,将version字段的值一同读出,数据每更新一次,对此version值加一。当我们提交更新的时候,判断数据库表对应记录 的当前版本信息与第一次取出来的version值进行比对,如果数据库表当前版本号与第一次取出来的version值相等,则予以更新,否则认为是过期数据。..原创 2022-06-24 17:36:32 · 665 阅读 · 4 评论 -
【Redis实现秒杀业务②】超卖问题的解决方案
我们在上一篇的文章中,实现了秒杀的基本业务,但是在并发的场景下,我们会发现代码存在诸多问题,超卖就是经典的问题之一。原创 2022-06-24 17:36:02 · 1364 阅读 · 3 评论 -
【Redis实现秒杀业务④】一人一单,不可重复购买
对于秒杀水果,一个用户只能秒杀一种水果的一单。原创 2022-06-24 17:36:55 · 1068 阅读 · 0 评论 -
【Redis实现秒杀业务①】秒杀流程概述|基本业务实现
我们大概的思路就是设计一个水果秒杀小项目。首先我们会有一种水果,该水果拥有名字、数量、抢购开始时间和抢购结束时间。原创 2022-06-23 13:26:02 · 786 阅读 · 4 评论 -
一把王者的时间,我就学会了Nginx
Nginx("engine x") 是一个高性能的 HTTP 和反向代理服务器,特点是占有内存少,并发能力强,事实上 nginx 的并 发能力确实在同类型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京东、新浪、网易、腾讯、 淘宝等。......原创 2022-03-21 08:06:57 · 24213 阅读 · 206 评论 -
Redis实现全局唯一ID
分布式系统中由于跨进程跨系统,在某些场景中,我们需要生成全局的唯一ID,例如订单系统,并发情况下,不同的系统需要同时生成不一样的订单ID方便后续的订单下单与查询等等。原创 2022-06-23 10:15:24 · 1337 阅读 · 3 评论 -
RedisClient——解决缓存穿透和缓存击穿的工具类
Redis解决缓存穿透和缓存击穿的工具类原创 2022-06-16 14:17:13 · 468 阅读 · 4 评论 -
Redis三大难点之缓存击穿
缓存击穿问题也叫热点Key问题,就是一个被高并发访问并且缓存重建业务较复杂的key突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。原创 2022-06-14 10:29:23 · 514 阅读 · 5 评论 -
Redis三大难点之缓存雪崩
缓存雪崩是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。原创 2022-06-14 10:28:52 · 308 阅读 · 0 评论 -
Redis三大难点之缓存穿透
缓存穿透是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,这些请求都会打到数据库。原创 2022-06-14 10:28:26 · 379 阅读 · 0 评论 -
〖Redis指南⑤〗RedisTemplate实例注入异常解决
RedisTemplate实例注入异常解决原创 2022-05-29 03:29:39 · 2025 阅读 · 6 评论 -
〖Redis指南④〗Redis序列化实战之RedisSerializer
Redis序列化实战之RedisSerializer原创 2022-05-29 02:15:44 · 3674 阅读 · 4 评论 -
〖Redis指南③〗Redis高级Java客户端Lettuce整合SpringBoot
Lettuce是一个高性能基于Java编写的Redis驱动框架,底层集成了Project Reactor提供天然的反应式编程,通信框架集成了Netty使用了非阻塞IO,5.x版本之后融合了JDK1.8的异步编程特性,在保证高性能的同时提供了十分丰富易用的API。......原创 2022-05-29 01:16:46 · 396 阅读 · 1 评论