Title

接口幂等性,qps,tps,并发量,pv,uv,脏读,不可重复读,幻读

1 脏读,不可重复读,幻读 ,mysql5.7以后默认隔离级别是什么?

整理
	-#脏读
    	-当前事务读取到其他事务没有提交的数据,没有提交意味着可能出现回滚,数据没有存入数据库,而我们读取到他的数据,我们把它存储到数据库了,出现了脏读的现象
    -#不可重复度
    	-在一个事务内,最开始读到的数据和事务结束前读到的数据出现了不一致的情况
        -导致的原因:事务A多次读取同一个数据,事务B在事务A多次读取的过程中,对数据进行了更新并提交,导致事务A多次读取同一个数据,结果出现了不一致
    -#幻读:解决了不可重复读的问题
    	-当我们想插入数据时,去查询数据是否存在,发现不存在,准备插入数据,但执行insert时,发现记录已经存在,无法插入,出现了幻读
    -#每个隔离级别分别解决了什么问题
    	-读未提交(ru):存在脏读,不可重复读,幻读
        -读已提交(rc):解决了脏读,但存在不可重复读,幻读问题
        -可重复读(rr):解决了脏读,不可重复读,存在幻读问题
        -串行化:解决了脏读,不可重复读,幻读问题,但牺牲了效率
    -#mysql5.7默认隔离级别是:可重复读(rr)
    -#oracle仅主持两种隔离级别
    	-Read Committed:读已提交
    	-Serializable:默认基本为RC  存在不可重复读问题
     
    
    









脏读:'当一个事务读取了另一个未提交事务的数据时,称为脏读。当事务A读取到事务B尚未提交的数据时,如果事务B回滚,那么事务A读取的数据就是无效的或者不一致的,导致脏读的结果是不可靠的。'
不可重复读:'在同一个事务中,对于相同的查询,第二次读取数据时,得到的结果与第一次读取数据时不相同,称为不可重复读。不可重复读的问题在于其他事务可能在两次读取之间修改了数据,导致了结果的不一致性。'
幻读:'在同一个事务中,对于相同的查询,第二次读取数据时,得到了新增或删除的额外数据行,称为幻读。幻读问题发生在并发事务中,其中一个事务在读取数据的同时,另一个事务执行了插入或删除操作,导致第一个事务读取的数据发生了改变。'
mysql5.7以后默认隔离级别是:'可重复读'
在MySQL 5.6及之前的版本中,默认的隔离级别是"读已提交"
若要修改,需要编辑my.cnf文件
在末尾添加:transaction-isolation=READ-COMMITTED

1	读未提交	READ-UNCOMMITTED
2	读提交		 READ-COMMITTED
3	可重复读	REPEATABLE-READ
4	串行化		 SERIALIZABLE

2 什么是qps,tps,并发量,pv,uv

整理
	-#qps Queries Per Second:每秒查询率,一台服务器每秒能够响应的查询次数,每次的响应请求数
    -#TPS:Transactions Per Second,每秒处理的事务数,包括一条信息入,一条信息出,加上一次用户数据访问
    	-tps的过程包括,客户端请求服务端,服务端内部处理,服务端返回客户端
        -例如,访问一个index页面会请求服务器3次,包括一次html,一次css一次js,n那么这个页面就会产生一个T,产生san个Q
    -#并发量:系统同时处理的请求或事务数,可以理解为,系统同时处理请求的数量
    	-qps=并发量/平均响应时间
        -并发量=qps*平均响应时间
    -#pv(page view):页面访问量,即页面浏览量或点击量,用户每次刷新计算一次,可以统计服务一天的访问日志得到
    -#uv(unique view):独立访客,统计一天内访问的用户数量,可以统计服务一天的访问日志并根据用户的唯一标识去重得到
    -#DAU(日活):日活用户数量,指网站,app,网游的运营情况
    	-dau统计一日之内,登录或使用某个产品的用户量(去除重复登录用户)
    -#MAU(月活):月活跃用户数量,指网站、app等去重后的月活跃用户数量



qps(Queries Per Second):'每秒查询率,表示在一秒内数据库系统能够处理的查询请求数量,他是衡量系统性能的标准,越高则表示系统处理能力越来强'
tps(Transactions Per Second):'每秒事务处理量,表示在一秒内系统能够处理的事务数量,一个事务可以包括多个查询操作,因此TPS一般会小于等于QPS'
并发量:'指系统在某个时间段内处理请求的数量,也可以了理解为系统的并发链接数,并发量大则可以表示系统在某个时间段内承载了更多的请求,具备并发处理能力'
pv(Page View):'页面浏览量,表示网站或应用在一段时间内被访问的页面次数,PV是衡量网站或应用的访问量的指标,他可以用来分析用户的访问行为和访问规模'
uv(Unique Visitor):'唯一的访客,表示在一段时间内访问网站或应用的独立用户数量,UV是根据用户的设备唯一标识或ip地址等信息来区分用户的,他用来衡量网站或应用的用户数量'

#QPS(Queries Per Second)表示每秒查询率,衡量数据库系统处理查询请求数量的能力。
#TPS(Transactions Per Second)表示每秒事务处理量,衡量系统处理完整事务的能力。
#并发量指系统在某个时间段内同时处理的请求数量,是系统的并发连接数。
#PV(Page View)表示网站或应用在一段时间内被访问的页面次数,用来分析访问规模和用户行为。
#UV(Unique Visitor)表示访问网站或应用的独立用户数量,用来衡量用户数量。

3 什么是接口幂等性问题,如何解决?

整理
	-#幂等操作:多次执行所产生的影响与一次执行产生的影响相同
    	-接口幂等性:无论调用多次,产生的效果是一样的
        	-get 获取数据天然幂等
            -put 修改数据天然幂等
            	-修改库存(数字加减):不幂等
            -delete 删除天然幂等
            -post 新增数据,会出现不幂等情况,要把它做成幂等性的
    -#解决方案
    	-1 token机制
        	-下单接口的前一个接口,只要访问,后端生产一个字符串,保存到redis中,把这个字符串返回给前段
            -当前段调用接口时,把这个字符串一起携带过去,一般放在请求头中
            -服务端去redis中,存在这个字符串则表示第一次请求,删除redis中的字符串,进行执行业务
            -如果这个字符串不存在于redis中,表示是重复操作,直接返回重复标志给前端
    -#乐观锁:更新的场景
    	-update t_goods set count=count-1,version=version+1 where good_id=2 and version =1
    -#唯一主键
    	-利用数据库的主键唯一约束,解决了在insert场景时幂等问题,但主键的要求不是自增的主键,这样就需要业务生产全局唯一的主键
    -#唯一id
    	-调用接口时,生产一个唯一id,redis将数据保存到集合中(去重),存在即处理
    -#防重表
    	-使用订单号做为去重表的唯一索引,把唯一索引插入去重表,在执行业务操作,且他们在同一个事务中,为了保证了重复请求时,因为去重表用唯一的约束,导致请求失败,避免了幂等问题这里要注意的是,去重表和业务表应该在同一个库中,这样就保证了在同一个事务,即业务操作失败,也会把去重表的数据回滚,这样很好保证了数据一致性
    -#按钮只能点击一次






接口幂等性:'指在分布式系统中,由于网络原因或其他原因导致请求重复发送,从而导致系统产生重复的操作或数据,比如重复扣款、重复下单、重复发送短信等'
同一个接口,多次发出同一个请求,必须保证操作只执行一次
-支付接口,重复支付会导致多次扣钱 ;订单接口,同一个订单可能会多次创建。
什么情况下,会产生接口幂等性的问题呢?
	-网络波动, 可能会引起重复请求
	-用户重复操作,用户在操作时候可能会无意触发多次下单交易,甚至没有响应而有意触发多次交易应用
	-使用了失效或超时重试机制(Nginx重试、RPC重试或业务层重试等)
	-页面重复刷新
    -使用浏览器后退按钮重复之前的操作,导致重复提交表单
    -使用浏览器历史记录重复提交表单
    -浏览器重复的HTTP请求
    -定时任务重复执行
    -用户双击提交按钮
解决方法:
	-按钮只能操作一次
    	-提交后把按钮置灰或loding状态,消除用户因为重复点击而产生重复记录
    -token机制
    	-允许重复提交,但不能产生副作用,进入页面时申请一个token,然后所有请求都带着token,后端根据token来避免重复请求,将token存入redis,请求来了之后把redis中的token清除,当重复请求来,发现没有token,不做处理。
    -使用post/redirect/get模式(PRG)
    	-在提交后执行页面重定向,在用户提交后跳转到一个重定向的信息页面,避免用户按F5刷新页面导致重复提交,而且也不会出现浏览器表单重复提交的警告,也能消除按浏览器前进或后退导致同样重复提交的问题
    -在session存放特殊标识
    	-在服务端生产一个唯一的标识符,存入session,同时前端获取到这个标识符,将这个标识符一并提交到后端,在服务器获取到前段传入的标识符,与session中的比较,如果一致,代表是首次提交,处理本次请求,移除标识符,不相等,不做处理
    -使用唯一索引防止新增脏数据
    	-利用数据库的唯一索引机制,插入数据库会抛出异常,保证不会出现脏数据
    -乐观锁:'乐观锁在操作数据时非常乐观,认为别人不会同时修改数据。. 因此乐观锁不会上锁,只是在执行更新的时候判断一下在此期间别人是否修改了数据:如果别人修改了数据则放弃操作,否则执行操作'
    	-为数据增加一个version字段,当数据需要更新时,先去数据库里获取此时的version版本号
        -更新数据时首先和版本号作对比,如果不相等说明已经有其他请求去更改新数据了,提示更新失败
    -悲观锁
    	-在获取数据时进行加锁,当同时有多个重复请求时其他请求都无法进行操作
    -分布式锁
    	-幂等的本质就是分布式锁的问题,分布式锁可以使用redis实现,在分布式环境下,锁定全局唯一资源,使请求串行化,实际表现为互斥锁,防止重复
    -缓冲队列
    	-将请求全部放入缓冲队列,使用异步任务处理队列中的数据,过滤掉重复的请求,优点:同步处理改为异步处理,高吞吐量,缺点:不能及时返回请求结果,需要后续轮训得到处理结果
        
	
posted @ 2023-07-31 22:23  哈哈哈哼  阅读(32)  评论(0编辑  收藏  举报