接口幂等性,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实现,在分布式环境下,锁定全局唯一资源,使请求串行化,实际表现为互斥锁,防止重复
-缓冲队列
-将请求全部放入缓冲队列,使用异步任务处理队列中的数据,过滤掉重复的请求,优点:同步处理改为异步处理,高吞吐量,缺点:不能及时返回请求结果,需要后续轮训得到处理结果