MVCC数据库多版本并发控制
参考:微信公众号——Java随想录(全网最详细MVCC讲解,一篇看懂)
MVCC解读MVCC介绍MVCC是数据库一种不加锁来解决读写冲突的方案,可以提高数据库并发性能,更好地处理读写冲突。
相较于传统锁机制传统锁机制也可以解决读写冲突,但使用锁同时也会带来死锁或者阻塞的风险。
MVCC的优势
读写操作不会冲突,这极大地提高了数据库的并发性能
降低死锁风险
MVCC原理MVCC机制的核心在于三点:隐藏字段、Undo Log、Read View
隐藏字段Mysql的行数据除了我们自定义的数据,另外还有一部分隐藏的数据字段
字段
含义
DB_ROW_ID
作为行数据的隐藏主键,如果表中没有设定主键字段,那InnoDB会默认产生该字段,并选择为隐藏主键
DB_TRX_ID
当先行数据所属的事务ID,事务ID是唯一的
DB_ROLL_PTR
回滚指针,指向的是每个数据的上一个版本
Undo LogUndo log里存放的是反操作,比如执行insert操作,则会在日志中记录delete,然后每条记录都与创建它的事务相关联,能够依次知道该回滚哪个事务的操作。
作用
事务 ...
利用RequestRateLimiter实现简单限流
自己做的微服务网站今天终于算是上线了(内部测试),虽然是内部测试,但在上线之前还是考虑做了一下gateway网关的限流,担心群众里面有坏人🐍
利用RequestRateLimiter实现简单限流RequestRateLimiter是gateway自带的 过滤器。
RequestRateLimiter 过滤器可以基于令牌桶算法实现请求限流。其具体原理如下:
创建令牌桶:在 RequestRateLimiter 过滤器初始化时,会读取配置参数创建对应的令牌桶。
生成令牌:当新的请求到达 RequestRateLimiter 过滤器时,它会检查令牌桶中是否有足够的令牌。如果有,则从令牌桶中移除一个令牌;否则请求被拒绝。
限制连接数:在超出最大连接数之后会在队列里等待。
计时更新令牌桶大小:RequestRateLimiter 过滤器会定期计时更新令牌桶的大小,确保让进入的请求有机会得到执行,同时防止恶意攻击或者系统故障导致服务器负载过重。
在使用 RequestRateLimiter 过滤器时,我们可以通过设置参数 replenishRate 和 burstCapacity 来 ...
Redisson实现可重入锁原理
Redisson实现可重入锁原理Redisson底层实现分布式锁是采用hash结构存储锁,
其中Key代表锁名,也是一把锁的唯一标识,key存在说明此时这把锁已经被持有了
Value中的key按照id + “:” + threadId命名,作为当Key一致时,即有线程想获取同一把锁时,分辨是否是当前锁的进程,如果不是,则加锁失败
Value中的小value作为锁的计数器,每次线程获取锁,则加1,释放锁就减1,只有同一线程中才可以重入同一把锁,每重入一次,value就计数一次
下面是加锁的lua脚本代码
1234567891011"if (redis.call('exists', KEYS[1]) == 0) then " + "redis.call('hset', KEYS[1], ARGV[2], 1); " + "redis.call('pexpire', KEYS[1], ARGV[1]); " ...
Resource和Autowired区别
@Resource和@Autowired区别@Resource和@Autowired都是用来做依赖注入的,但他们存在几点不同:
1.来源不同@Resource来源于Java定义的注解,来自于JSR-250
@Autowired来自于Spring定义的注解
2.支持参数不同@Resource 支持七个参数
name:资源的JNDI名称。在spring的注入时,指定bean的唯一标识。
type:指定bean的类型。
lookup:引用指向的资源的名称。它可以使用全局JNDI名称链接到任何兼容的资源。
authenticationType:指定资源的身份验证类型。它只能为任何受支持类型的连接工厂的资源指定此选项,而不能为其他类型的资源指定此选项。
shareable:指定此资源是否可以在此组件和其他组件之间共享。
mappedName:指定资源的映射名称。
description:指定资源的描述。
@Autowired 仅支持一个参数requied
3.依赖查找顺序不同@Resource先根据name查找对象,如果通过name找不到,则通过类型查找
@Autowired和Resou ...
Nginx怎么解决跨域问题
Nginx是怎么解决跨域问题的跨域问题:具体来说是浏览器如果向一个地址不同,或者端口号不同的链接发送请求,那么浏览器会禁止这种请求。
Nginx解决跨域问题,主要的方法是反向代理,何为正向代理,何为反向代理?
正向代理:正向代理代理客户端,如果我们想要访问某个网站,但是该网站无法直接访问,那我们可以通过某个服务器的正向代理,来间接访问该网站,其中最典型的例子就是VPN
反向代理:反向代理代理服务器,即你想要访问网站A,但网站A实际上会跳转到网站B,但是用户并不清楚,用户只认为自己访问了网站A,这就可以称网站A反向代理了网站B。
总结其实不仅仅是用户不知道自己访问的是网站B,浏览器也察觉不到,在浏览器的视角里,它是对自己的IP和端口发送了请求,这样并不会违反浏览器的跨域规则,然而实际上发送的请求都被转发到真正的后端服务器上的了,跨域问题就这样解决了。
附上nginx反向代理的配置123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051worker_proces ...
Session,Cookie,Jwt,Filter,Interceptor区别
Cookie,Session,JWT三者普遍都是用来做登录验证的:
cookie:客户端会话跟踪登录成功后会在浏览器存一个cookie,服务端检查请求中是否存在cookie,以此来做登录验证
缺点:移动端无法使用,不安全(可能被窃取——XSS),不能跨域
Session:服务端会话跟踪服务端存储用户登录信息
缺点:
集群环境下无法使用
存在和cooike一样的缺点
JWT:令牌登录成功生成令牌,客户端存放令牌,每次请求时在请求头中携带令牌,安全系数较高,无法被篡改
Filter,InterceptorInterceptor拦截器:
由Spring框架提供,是一种动态拦截方法的机制
filter 过滤器:
javaweb三大组件(servlet,filter,listener)之一,可以拦截对资源的请求,一般完成一些通用操作
两者区别:
1.接口规范不同:过滤器需要实现Filter接口,拦截器需要实现HandlerInterceptor接口
2.拦截范围不同:filter会拦截所有对资源的请求,interceptor只会拦截对Spring环境中的资源的请求
s
JWT基础教学
介绍JWT全称JSON WEB TOKENS,是当下非常流行的跨域身份验证方法。传统的身份验证需要服务端将用户信息,比如登录信息存入session,然后在用户想要访问后端服务时,通过比对用户的登录状态和session中的数据来进行身份验证。但这种方式在分布式中就显得很麻烦了,JWT 可以跨域传输,适用于微服务、API网关等场景,因为它在客户端存储用户信息,减轻了服务器的内存压力
JWT的组成JWT整体由三部分组成:Header、Payload、Signature
HeaderHeader通常由令牌的类型和加密的算法组成,例如:
1234{ "alg": "HS256", "typ": "JWT"}
Payload这部分主要是记录我们所存储的简单且不重要的信息。例如:用户名,过期时间,用户id等等,注意payload中的数据为公开的,不能在里面存放敏感数据,例如password
12345{ "sub": "1234567890", ...
我的生活(一)
从开始做博客也一年多了,期间我一直将博客作为一个可以优雅地(相较于直接看markdown)复习我的学习笔记的平台,但是思来想去,一个博客好像不该如此枯燥无味,一个正常的博客貌似应该提供一个专门的板块,供作者(也就是我)发发牢骚,随便瞎聊点日常,或者碎碎念一些小破事,这样日后如果博客能做大做强,有更多人来看我的笔记,听我发发牢骚,或者在评论区对我发发牢骚,这想必比一个铺天盖地是学习资料的网站要有趣得多。
——————lf 2024.2.18
Docker教学
Docker教学1.什么是Docker你可以把Docker看作一个容器,就像是一个可以装载软件和代码的集装箱。通过使用Docker,你可以将应用程序及其所有依赖项打包到一个独立的容器中,而不必担心它们会与其他应用程序或系统环境发生冲突。
使用Docker,你可以快速地在不同的计算机上部署应用程序,而不必担心配置和依赖问题。这意味着你可以在你的电脑上开发一个应用程序,并将其相同的运行环境在其他人的电脑或服务器上轻松地运行起来,而不需要重新配置和安装依赖项。
另外,Docker还使得应用程序的交付更加简单和可靠。你可以将应用程序和其依赖项打包到一个容器中,并将其发布到云端或其他服务器上,其他人只需要运行这个容器,就能够轻松地使用你的应用程序。
总之,Docker可以帮助开发者更轻松地构建、打包和运行应用程序,提供了一种简单、可靠的应用程序交付方式。它的优势在于提供了一致的运行环境,并且可以在不同的计算机上进行部署,极大地简化了开发和部署的过程。
2.Docker和虚拟机差别虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系 ...
Nacos教程
Nacos教程NacosNacos是阿里提供的注册中心,功能类似于Eureka且要更强大,两种注册中心都要学一下
安装GitHub主页:https://github.com/alibaba/nacos
GitHub的Release下载页:https://github.com/alibaba/nacos/releases
安装完成后进行解压
配置conf/application.properties这是nacos的配置文件,可以在里面进行一些常规的端口配置
启动在bin目录下,你可以直接双击startup.cmd
也可以在命令行模式下运行指令
startup.cmd -m standalone
此处为单机启动
启动界面:
然后我们可以访问上面给出的网页,可以看到nacos的界面
默认登录名和密码都是nacos
这就是nacos的界面,之后我们会在这里进行操作
关闭的话就是运行shutdown.cmd
Nacos快速入门首先在项目的父工程中添加spring-cloud-alilbaba管理依赖,进行包管理
1234567<dependency> &l ...
Nginx入门
Nginx入门
部分词条来自百度百科
概述Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。
命令ubuntu下:
/usr/sbin/nginx:主程序,启动文件/etc/nginx:存放配置文件/var/www/html:存放项目目录/var/log/nginx:存放日志
启动:
在sbin目录下
./nginx
启动后我们就可以通过虚拟机的ip地址访问到nginx的默认页面(如果访问不到,请关闭linux防火墙)
关闭nginx
./nginx -s stop
重新加载nginx
./niginx -s reload
配置环境变量在etc/profile文件中追加:
/user/sbin(你的ngi ...
Mysql主从复制
Mysql主从复制背景当所有的读写操作都集中在一台mysql服务器上时,会使得该台服务器负载增大,其次是,当数据全部集中到一台服务器上,且没有其他服务器做备份的话,一旦发生事故导致数据丢失,会带来巨大的损失。要想解决这两个问题,就引出了Mysql主从复制的功能,即将主服务器上的数据“备份”一份,放到从服务器上,然后让从服务器也承担一部分数据库功能,比如专门查询,这样既缓解了一个服务器的压力,又能存在备份。
框架图
步骤
主库将所有的写操作记录到binlog日志中并生成一个log dump线程,将binlog日志传给从库的I/O线程。
从库的IO线程会读取主库的binlog日志,然后将读到的日志写入relaylog(中继日志)中
从库的sql线程再读取relaylog然后复现日志中的sql操作,达成主从数据一致
操作两台服务器,分别配置Mysql比如:主库: 192.168.138.100
从库: 192.168.138.101
配置主库修改配置文件 /etc/my.conf
1234vim /etc/my.cnf server-id=11 log-b ...