自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(140)
  • 收藏
  • 关注

原创 [web] 跨域问题及CSRF、XSS攻击

问题原因-浏览器同源策略同源:协议相同域名相同端口相同浏览器是从两个方面去做这个同源策略的针对接口的请求针对Dom的查询没有同源策略限制的接口请求我们经常用cookie来记住用户的登录信息,如果你请求了接口进行登录,服务端验证通过后会在响应头加入Set-Cookie字段,然后下次再发请求的时候,浏览器会自动将cookie附加在HTTP请求的头字段Cookie中,服务端就能知道这个用户已经登录过了。由于没有同源策略的限制,它向淘宝发了个请求!然后淘宝就会在响应头加入Set-Cooki

2021-12-25 22:22:29 2356

原创 [gulimall] 秒杀

秒杀流程1. 合法性校验秒杀时间校验:当前时间是否在秒杀时间范围内接口幂等性校验:验证这个人是否已经买过了,去redis里使用setnx命令占位,过期时间=秒杀截止时间-当前时间2. 获取信号量信号量为秒杀的商品数使用信号量的tryacquire方法实现分布式锁3. 秒杀成功发送订单信息到MQ,异步下单直接返回秒杀成功结果,节省用户等待时间4. 限流措施前端限流,一些高并发的网站直接在前端页面开始限流,例如:小米的验证码设计nginx限流,直接负载部分请求到错误的静态页

2021-12-25 16:09:35 892

原创 [gulimall]订单及库存

1. 提交订单查询商品信息,查询收货地址查询库存信息计算价格2. 下订单1. 验证令牌防止重复提交获取当前用户登录的信息通过lua脚本验证令牌和删除令牌2. 验证价格从数据库查询最新的商品价格和订单的金额对比,如果不一致则返回错误信息3… 验证库存并锁库存先判断仓库是否有足够的库存保存库存工作单详情信息(哪个商品需要修改多少库存),用于追溯(解锁库存等)锁定库存,并将工作单信息发送给MQ如果锁定失败,工作单信息都回滚。已经发送出去的消息,即使要解锁库存,由于在数据

2021-12-24 16:37:17 2144

原创 [gulimall] 购物车及threadlocal

1. 购物车功能分析user-key是游客id,不管有没有登录都会有这个cookie信息。所以用户信息:@Datapublic class UserInfoTo { //已登录用户的id private Long userId; //游客id private String userKey; //是否临时用户 private Boolean tempUser = false;}使用redis存储购物车Redis里面,我们的购物车结构是一个双层Map:M

2021-12-23 17:08:09 1040

原创 [gulimall] 异步编排

1 商品详情页逻辑查询商品详情页的逻辑非常复杂,数据的获取都需要远程调用,必然需要花费更多的时间。假如商品详情页的每个查询,需要如下标注的时间才能完成// 1. 获取sku的基本信息 0.5s// 2. 获取sku的图片信息 0.5s// 3. 获取sku的促销信息 TODO 1s// 4. 获取spu的所有销售属性 1s// 5. 获取规格参数组及组下的规格参数 TODO 1.5s// 6. spu详情 TODO 1s.........那么,用户需要6.5s后才能看到商品

2021-12-23 11:07:32 492

原创 [gulimall] cookie写入问题

问题起源场景1: 在微服务场景下,用户登录是通过认证服务来完成的,登录成功会将sessionId存在cookie中,但是当登录成功跳转到首页时并不能获取到session信息,原因就是首页在另外一个服务中,此时cookie出现了跨域问题获取不到。场景2: feign远程调用时,也会丢失cookie,因为feign自己构造了一个新的请求,这个请求里面没有任何请求头。在异步编排时,feign还会丢失上下文信息,因为老请求的信息存在threadlocal里,开启多线程时,就获取不到老请求的信息了cookie写

2021-12-22 22:50:23 479

原创 [gulimall] 用户登录与注册相关

1. 注册基本逻辑1)数据格式校验,以及用户名是否已存在2)核对验证码3)MD5加盐对密码加密4)写入数据库,返回登录页1.1 数据格式校验通过注解可以给前端传递过来的值进行校验,例如@NotEmpty, @Length等。但是这个注解必须配合 @Valid 使用,完成对参数的校验。而校验的结果,也会自动封装到 BindingResult 类型中,通过这个参数可以很方便的对错误的参数进行处理。hasErrors() 可以判断是否有参数校验错误,如果有,可以通过 getFieldsErr

2021-12-22 20:35:29 512

原创 [mysql] 读锁,写锁,行锁,间隙锁

1 读写锁:select … lock in share mode:当前读,加读锁,又叫共享锁select … for update:当前读,加写锁,又叫排他锁innoDB里面,update,delete,insert都会自动给涉及的语句添加写锁读锁(共享锁)读取结果集的最新版本,同时防止其他事务产生更新的数据版本。本读取模式在读取前后对资源处理如下:读取行为发生之前,获取读锁。这意味着如果有其他尚未提交的事务已经修改了结果集,本读取模式会等待这些事务结束,以确保自己稍后可

2021-10-08 19:20:16 2211 1

原创 [java]克隆和序列化

1、克隆先介绍一下两种不同的克隆方法,浅克隆(ShallowClone)和深克隆(DeepClone)。在Java语言中,数据类型分为值类型(基本数据类型)和引用类型,值类型包括int、double、byte、boolean、char等简单数据类型,引用类型包括类、接口、数组等复杂类型。浅克隆和深克隆的主要区别在于是否支持引用类型的成员变量的复制,下面将对两者进行详细介绍。浅克隆一般步骤:被复制的类需要实现Clonenable接口(不实现的话在调用clone方法会抛出CloneNotSuppo

2021-09-27 10:48:30 343 1

原创 [redis] redis其他

3、redis 为什么是单线程?因为 CPU 不是 Redis 的瓶颈。Redis 的瓶颈最有可能是机器内存或者网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了。缺点:服务器其他核闲置。19、Redis 常见性能问题和解决方案:Master 最好不要写内存快照,如果 Master 写内存快照,save 命令调度 rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务如果数据比较重要,某个 Slave 开启 AOF 备份

2021-09-27 09:58:25 89

原创 [redis] map和set

1、基础1.1 hash命令hset key k v:为指定的key设定k v键值对。hget key k:返回指定的key中的k的值hmset key k1 v1 k2 v2 …:设置key中的多个k vhmget key k1 k2 …:获取key中的多个k的值hexists key k:判断指定的key中的filed是否存在,1存在,0不存在hlen key:获取key所包含的field的数量hincrby key field increment:设置key中filed的值增加inc

2021-09-26 11:10:52 721

原创 [redis] list

1、基础lpush/rpush key value1 value2…:在指定的key的list的头部/尾部插入所有的values,如果该key不存在,该命令在插入的之前创建该key和空链表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。lrange key start end:获取链表中从start到end的元素的值,start、end可为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推…lpushx/rpushx key value:仅当参数中指定的key存在时,在指定

2021-09-26 09:59:09 75

原创 [redis] string

Redis 虽然是用 C 语言写的,但是对于Redis的字符串,却不是 C 语言中的字符串(即以空字符’\0’结尾的字符数组),它是自己构建了一种名为 简单动态字符串(simple dynamic string,SDS)的抽象类型,并将 SDS 作为 Redis的默认字符串表示。SDS 定义:struct sdshdr{ //记录buf数组中已使用字节的数量 //等于 SDS 保存字符串的长度 int len; //记录 buf 数组中未使用字节的数量

2021-09-25 21:24:16 80

原创 [java] 集合类

1、数组ArrayList和集合LinkedList的比较数组开辟的是一块连续空间,适合下标访问,查找效率高。 LinkedList 采用双向链表实现的,存储是分散的,适合插入和删除。数组能存放基本数据类型和对象,而集合类存放的都是对象,集合类不能存放基本数据类型。数组和集合存放的对象皆为对象的引用地址。数组容易固定无法动态改变,集合类容量动态改变。数组无法判断其中实际存有多少元素,length只告诉了数组的容量,而集合的size()可以确切知道元素的个数集合以类的形式存在,具有封装、继承、多态

2021-09-24 22:40:24 154

转载 activity生命周期

onCreate(Bundle savedStatus):创建Activity时被回调。该方法只会被调用一次。onStart():启动Activity时被回调。onRestart():重新启动Activity时被回调。onResume():恢复Activity时被回调,onStart()方法后一定会回调onResume().onPause():暂停Activity时被回调。onStop():停止Activity时被回调。onDestroy():销毁Activity时被回调。该方法只会被调用..

2021-09-22 16:37:06 85

原创 [linux] linux常用命令

一、基本命令1.1 关机和重启关机shutdown -h now 立刻关机shutdown -h 5 5分钟后关机poweroff 立刻关机重启shutdown -r now 立刻重启shutdown -r 5 5分钟后重启reboot 立刻重启1.2 帮助命令–help命令shutdown --help:ifconfig --help:查看网卡信息man命令(命令

2021-09-17 11:08:25 192

原创 进程和子进程

进程和子进程父子进程有独立的数据段、堆、栈,共享代码段Linux中每个进程都有4G的虚拟地址空间(独立的3G用户空间和共享的1G内核空间),fork()创建的子进程也不例外。子进程资源的由来:1G内核空间既然是所有进程共享,因此fork()创建的子进程自然也将拥有;3G的用户空间是从父进程进程而来。进程fork和写时复制fork()创建子进程时继承了父进程的数据段、代码段、栈段、堆,注意从父进程继承来的是虚拟地址空间,同时也复制了页表(没有复制物理块)。因此,此时父子进程拥有相同的虚拟地址,

2021-09-07 15:57:27 2538

转载 [分布式] CAP理论和BASE理论

CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中:一致性(Consistency)可用性(Availability)分区容错性(Partition tolerance)最多满足其中的两个特性。也就是下图所描述的。分布式系统要么满足CA,要么CP,要么AP。无法同时满足CAP。I. 什么是 一致性、可用性和分区容错性分区容错性: 指的分布式系统中的某个节点或者网络分区出现了故障的时候,整个系统仍然能对外提供满足一致性和可用性的服务。也就是说部分故障不影响整体使用。

2021-09-06 09:09:21 234

原创 RabbitMQ

分类生产者丢失: 生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能MQ中丢失: 就是 RabbitMQ 自己弄丢了数据消费端丢失: 你消费的时候,刚消费到,还没处理,结果进程挂了,比如重启了,那么就尴尬了,RabbitMQ 认为你都消费了,这数据就丢了。生产者端丢失消息一种方法是用RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ事务channel.txSelect,然后发送消息,如果消息没有成功被RabbitMQ

2021-09-05 21:51:17 242

原创 [MQ] RabbitMQ交换机类型

四种类型Direct: 消息中的路由键(routing key)如果和 Binding 中的 binding key 一致,交换器就将消息发到对应的队列中。它是完全匹配、单播的模式。Fanout: 每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。很像子网广播,每台子网内的主机都获得了一份复制的消息。fanout 类型转发消息是最快的topic: topic 交换器通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切

2021-09-04 20:33:45 258

转载 [os] 用户态和内核态

用户态切换到内核态的3种方式系统调用这是用户态进程主动要求切换到内核态的一种方式,用户态进程通过系统调用申请使用操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现,例如Linux的int 80h中断。异常当CPU在执行运行在用户态下的程序时,发生了某些事先不可知的异常,这时会触发由当前运行进程切换到处理此异常的内核相关程序中,也就转到了内核态,比如缺页异常。外围设备的中断当外围设备完成用户请求的操作后,会向CPU发出相应的中断信号,这时CPU会暂停

2021-09-02 13:31:14 154

原创 [分布式] 分布式锁

1、 redis实现分布式锁1.1 setnx实现setnx key value:当key不存在的时候,将key的值设置为value。若key存在则不做操作怎么做String lockKey="lockKey";//set成功则为true,否则为falseBoolean result=redisTemplate.opsForValue().setIfAbsent(lockKey,"dbf");if(!result){return error;}//核心逻辑。。。redisTemplate.

2021-09-01 16:13:12 111

转载 [redis] redis和mysql之间的数据一致性

作者:孤独烟 出处: http://rjzheng.cnblogs.com/1、先更新数据库,再更新缓存不推荐,面试答这个稳挂2、先删缓存,再更新数据库,下次查询再更新缓存会出现如下问题:请求A想要更新数据库,先删除了缓存请求B过来了,查询缓存没有,于是查询数据库并更新了缓存请求A更新了数据库此时缓存里面存储的还是之前的旧值这个情况发生的概率还是很大的,因为写操作肯定是比读操作耗时的,所以完全有可能在写的过程中完成了读操作解决办法:延时双删:在删除缓存并更新数据库之后,等待一定.

2021-09-01 10:25:33 70

原创 [java] 分布式id生成方案

1、UUID实现方式String uuid = UUID.randomUUID().toString().replaceAll("-","");优点:生成简单,本地生成无网络消耗,具有唯一性缺点:无序的字符串,不具备趋势自增特性没有具体的业务含义长度过长,存储以及查询对MySQL的性能消耗较大。2、数据库自增id实现方式需要一个单独的MySQL表用来生成IDCREATE DATABASE `SEQ_ID`;CREATE TABLE SEQID.SEQUENCE_ID (.

2021-08-29 16:57:31 577

原创 [SpringMVC] SpringMVC执行流程

介绍SpringMVC使用了MVC架构模式的思想,将web层进行职责解耦模型(Model )封装了应用程序的数据和一般他们会组成的POJO。视图(View)是负责呈现模型数据和一般它生成的HTML输出,客户端的浏览器能够解释。控制器(Controller )负责处理用户的请求,并建立适当的模型,并把它传递给视图渲染。SpringMVC执行流程用户发送请求至前端控制器DispatcherServletDispatcherServlet收到请求调用处理器映射器HandlerMa

2021-08-28 13:43:02 101

原创 web基础

Java webweb编程基础1、启动项目时如何实现不在链接里输入项目名就能启动?可在 taomcat 配置虚拟目录。2、1 分钟之内只能处理 1000 个请求,你怎么实现,手撕代码?限流的几种方法:计数器,滑动窗口、漏桶法、令牌桶3、什么时候用 assertassertion (断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制。在实现中,assertion 就是在程序中的一条语句,它对一个 boolean 表达式进行检查,一个正确程序必须保证这个 boolean 表达式的

2021-08-27 14:13:18 101

原创 [mysql] 基础知识

3、数据库两种引擎MYISAM:拥有较高的执行速度,并发性能差,占用空间相对较小,对事务完整性没有要求,以select、insert为主的应用基本上可以使用这引擎Innodb:提供了具有提交、回滚和崩溃回复能力的事务安全,并发能力强InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为

2021-08-26 21:47:59 78

原创 [os] 内存管理

进程地址空间https://www.jianshu.com/p/d63b00630a3c页面置换算法1. 最佳OPT, Optimal replacement algorithm所选择的被换出的页面将是最长时间内不再被访问,通常可以保证获得最低的缺页率。是一种理论上的算法,因为无法知道一个页面多长时间不再被访问。2. 最近最久未使用LRU, Least Recently Used虽然无法知道将来要使用的页面情况,但是可以知道过去使用页面的情况。LRU 将最近最久未使用的页面换出。为了实现

2021-08-25 15:46:24 73

转载 [os] 零拷贝技术

看原文

2021-08-24 13:10:28 85

原创 [web] 四种会话跟踪技术

在程序中,会话跟踪是很重要的事情。理论上,一个用户的所有请求操作都应该属于同一个会话,而另一个用户的所有请求操作则应该属于另一个会话,二者不能混淆。例如,用户A在超市购买的任何商品都应该放在A的购物车内,不论是用户A什么时间购买的,这都是属于同一个会话的,不能放入用户B或用户C的购物车内,这不属于同一个会话。而Web应用程序是使用HTTP协议传输数据的。HTTP协议是无状态的协议。一旦数据交换完毕,客户端与服务器端的连接就会关闭,再次交换数据需要建立新的连接。这就意味着服务器无法从连接上跟踪会话。即用户A

2021-08-24 09:58:26 907

原创 [java] 面向对象

1、面向对象和面向过程面向过程面向过程编程强调的是怎么去做,例如完成某件事情之前,先思考完成这件事情需要哪些步骤,然后逐一去实现,自身完成所有的底层实现。清理教室垃圾这件事情,你可以思考先从第一排扫到第十排,还是从第一列扫到第十列。面向对象面向对象编程忽略了如何去做的概念,强调的是让谁去做,自身忽略这件事的底层实现,底层实现交给某个能够完成这件事的对象去完成。清理教室垃圾这件事情,你并不想自己动手,所以让同桌帮忙进行清理,也就是将怎么去做交给了同桌去思考及实现。2、三大特性封装封装是面向对象编

2021-08-23 13:52:35 102

原创 [java] 内存泄漏和内存溢出

概念内存泄漏memory leak :是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏似乎不会有大的影响,但内存泄漏堆积后的后果就是内存溢出。内存溢出 out of memory :指程序申请内存时,没有足够的内存供申请者使用,或者说,给了你一块存储int类型数据的存储空间,但是你却存储long类型的数据,那么结果就是内存不够用,此时就会报错OOM,即所谓的内存溢出。内存泄漏第一类:程序中已动态分配的内存由于某种原因未释放或无法释放数据库之类的连接要调用close()方

2021-08-23 10:35:27 63

原创 [计算机网络] TCP和UDP

TCP和UDP协议UDP:不可靠,无连接,时延小,适用于小文件TCP:面向连接,时延大,适用于大文件;确保可靠性:三次握手,超时重传,滑动窗口,拥塞控制。TCP协议中包含了专门的传递保证机制,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息;发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。 与TCP不同,UDP协议并不提供数据传送的保证机制。如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。UDP具有TCP所

2021-08-22 20:44:13 1365 5

原创 [OS] 进程互斥

1、进程互斥进程的同步(Synchronization)是解决进程间协作关系( 直接制约关系) 的手段。进程同步指两个以上进程基于某个条件来协调它们的活动。一个进程的执行依赖于另一个协作进程的消息或信号,当一个进程没有得到来自于另一个进程的消息或信号时则需等待,直到消息或信号到达才被唤醒。进程的互斥(mutual exclusion )是解决进程间竞争关系( 间接制约关系) 的手段。 进程互斥指若干个进程要使用同一共享资源时,任何时刻最多允许一个进程去使用,其他要使用该资源的进程必须等待,直到占有资源

2021-08-21 21:20:27 1228

原创 [os] 处理机调度

1、处理机调度的3个层次要做什么调度发生在发生频率对进程状态的影响高级调度(作业调度)按照某种规则,从后备队列中选择合适的作业将其调入内存,并为其创建进程外存->内存 (面向作业)最低无->创建态->就绪态中级调度(内存调度)按照某种规则,从挂起队列中选择合适的进程将其数据调回内存外存->内存 (面向进程)中等挂起态->就绪态(或者是阻塞挂起->阻塞态)低级调度(进程调度)按照某种规则,从就绪队列中选择一个进程为其

2021-08-21 16:44:39 132

原创 [计算机网络] http协议相关

一、http请求报文1是请求方法OPTIONS:返回服务器针对特定资源所支持的 HTTP 请求方法。也可以利用向 Web 服务器发送’*'的请求来测试服务器的功能性。HEAD:向服务器索要与 GET 请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。GET:向特定的资源发出请求。POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的创建和/或已有资

2021-08-19 21:54:29 143 1

原创 [计算机网络] 从输入网址到返回页面中间经历了什么

1. URL 解析首先浏览器判断该URL是否是合法的URL。如果是合法的,就生成http请求报文。2. DNS 解析DNS解析就是将地址栏的域名转化为IP地址DNS 寻址过程在浏览器中输入 www.qq.com 域名,操作系统会先检查自己本地的 hosts 文件是否有这个网址映射关系。如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求到本地DNS服务器 。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。如果本地DNS服务器的缓

2021-08-19 15:51:46 739

原创 [os] 进程

进程,线程和协程进程是操作系统资源分配的基本单位,每启动一个进程都需要向操作系统索要运行资源,默认一个进程只有一个线程,线程是依附在进程里面的线程是cpu调度的基本单位, 通过线程去执行进程中代码, 线程是执行代码的分支多进程开发比单进程多线程开发稳定性要强,但是多进程开发比多线程开发资源开销要大进程死了那么他的线程都要进行销毁先有进程,然后进程可以创建线程,线程是依附在进程里面的, 线程里面可以包含多个协程进程之间不共享全局变量,线程之间共享全局变量,但是要注意资源竞争

2021-08-17 15:55:05 251

原创 [Nginx] Nginx基础知识

Ngnix三大功能:反向代理,负载均衡,动静分离正向代理#mermaid-svg-CLAwYV8cXyLQi1MW .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-CLAwYV8cXyLQi1MW .label text{fill:#333}#mermaid-svg-CLAwYV8cXyLQi1MW .nod

2021-08-10 13:51:19 299

原创 [java] 反射

什么是反射反射是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。获取 Class 对象的几种方法调用某个对象的 getClass()方法Person p=new Person();Class clazz=p.getClass();调用某个类的 class 属性来获取该类对应的 Class 对象Class clazz=Person.cla

2021-07-27 16:33:20 82

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除