- 原子性:一组操作要么都执行成功,要么都执行失败,不会出现部分成功,部分失败的情况,而且这一组操作之间不能插入别人的操作。
- 在使用Redis时,如果遇到非原子性操作,比如:购买商品的业务中,会先给用户生成一个确认订单(也就是待完善信息的订单,还需要用户填写比如地址、电话等信息提交后才会生成整个订单),此确认订单在生成时被分配了一个唯一id,并存入Redis,当用户填完个人信息后生成订单时需要判断“重复生成订单”,判断前端传过来的订单id在Redis中是否存在,若存在则删除后正常进行,不存在则说明重复提交订单了,不在生成订单,业务结束。在这个过程中,判断是否存在和删除此订单id是两个操作,是非原子性的,可能判断存在后,还没来得及删除,又来了个重复请求,然后也判断id存在,等于两个请求都判断订单id在Redis中存在,从而重复生成订单导致错误。这时就需要将“判断是否存在”和“删除此订单id”编写在一个Lua脚本里,Lua脚本被Redis当做一个命令来执行,由于Redis是单线程先来后到执行的,所以Lua脚本里的两个操作之间不会被加入第三个操作,从而保证了原子性。(也可以用分布式锁,Redisson提供的分布式锁底层源码里也是用的Lua脚本)
- Redis使用Lua脚本的原因是:Lua脚本可将多条Redis命令一块发给Redis来执行,由于Redis单线程执行命令的原因,Lua里的命令会被一起执行完后才会处理其他的请求,保证了“原子性”,同时也体现了自定义命令、批处理的特点
- 实际项目中一般Nginx配合SpringCloud Gateway使用,Nginx用来对后端服务器进行反向代理,前端请求发送至Nginx,由Nginx转发请求到后端的网关服务,以此解决跨域。后端网关通过url里/api/后的服务名进行负载均衡到某个服务的某个具体实例上。
- 前端发送请求到Nginx时会在请求头传一个Host,Nginx在指定端口号监听到请求后通过此Host的值取和server块的server_name进行匹配,匹配到就处理,所以server_name不是随便起的。
- 。。。
项目心得体会
于 2024-02-05 21:24:10 首次发布