<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[zzd的博客]]></title><description><![CDATA[笔记、总结与感悟]]></description><link>https://blog.youkuaiyun.com/sinat_30955745</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; sinat_30955745]]></copyright><item><title><![CDATA[蚂蚁一面（4月15日）]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115896958</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115896958</guid><author>sinat_30955745</author><pubDate>Tue, 20 Apr 2021 12:27:20 +0800</pubDate><description><![CDATA[这个是电话面试，全程问项目（就是一个烂秒杀。。。）

1、一分钟自我介绍

2、这个项目你是承担什么角色呢？

   我答：自己做的小项目。。。

3、简单介绍一下，你怎么解决秒杀场景的高并发问题，说说你的思路？

4、展示商品详情，怎么提升qps？

   我主要答的使用redis来缓存商品数据。然后面试官说对于商品详情页面，进行页面静态化更好。

5、页面静态化后，一些动态数据的应该怎么获取呢？因为一个页面总有不断变化的数据，就比如评论之类的数据？（其实这题是承接上面的讨论）

  ...]]></description><category></category></item><item><title><![CDATA[HTTPS相关总结（内有SSL四次握手连接的详细过程）]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115626223</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115626223</guid><author>sinat_30955745</author><pubDate>Mon, 12 Apr 2021 16:04:33 +0800</pubDate><description><![CDATA[https的两个作用：1、加密HTTP传输的数据，确保安全性。2、确保访问网站的真实性(CA证书)。

HTTPS = HTTP+ 加密 + 认证 + 完整性保护

HTTPS 并非是应用层的一种新协议。 只是 HTTP 通信接口部分用SSL（Secure Socket Layer） 和 TLS（Transport Layer Security） 协议代替而已；

通常， HTTP 直接和 TCP 通信。 当使用 SSL时， 则演变成先和 SSL通信， 再由 SSL和 TCP 通信了。 简言之， 所谓HTT]]></description><category></category></item><item><title><![CDATA[面试中项目的相关问题]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115541447</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115541447</guid><author>sinat_30955745</author><pubDate>Fri, 09 Apr 2021 11:28:14 +0800</pubDate><description><![CDATA[1、用mq实现分布式事务，为何要先发送消息，才执行本地事务，而不能本地事务执行完才发送消息呢？

  答：我面试的时候答不出来。。后面面试官说，那是因为如果执行完本地事务后，机器就挂了，这样的话，消息就发不出去了，从而导致后续要异步执行的操作丢失。

      这就是为何用rocketmq实现分布式事务的时候，要先发送一个半消息后，再执行本地事务。

2、订单id真的要加上时间吗？为何要给订单id赋予含义？如果要用时间来归档，直接加一个时间字段不就行了吗？

  答：这题我答不出来...]]></description><category></category></item><item><title><![CDATA[Spring的transactional注解自调用失效的原理]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115540259</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115540259</guid><author>sinat_30955745</author><pubDate>Fri, 09 Apr 2021 10:35:56 +0800</pubDate><description><![CDATA[我先说一下我自己的理解：失效的关键是Spring的AOP会生成两个对象（这是Java原本的代理方式），所以有两个this，一个是代理类的this，一个是原本类的this，调用原本类的方法的时候，用了原本类的this。而如果只有一个代理增强类的话，就只有一个this了，那么利用多态性就可以避免事务失效了。

转载自：https://blog.youkuaiyun.com/seelye/article/details/40144817

好了，现在总结一下现象：

 1、ServiceA类为Web层的Action...]]></description><category></category></item><item><title><![CDATA[项目数据库表设计]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115514960</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115514960</guid><author>sinat_30955745</author><pubDate>Thu, 08 Apr 2021 12:14:27 +0800</pubDate><description><![CDATA[全部表（8个表）



item表



item_stock表（因为stock库存字段要频繁的查询和修改，所以单独拿出来建一个表）



item_stock表的索引



order_info表



order_info表的部分数据



promo_info表（存储秒杀活动的数据）



sequence_info表（本来是用来生成订单唯一id的，现在已经弃用，改用redis生成订单唯一id）



stock_log表（库存流水数据表，主要用于分布式事务判断本地事务（下单操作）执...]]></description><category></category></item><item><title><![CDATA[分布式事务相关]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115472696</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115472696</guid><author>sinat_30955745</author><pubDate>Tue, 06 Apr 2021 22:13:45 +0800</pubDate><description><![CDATA[本文是转载的：https://www.cnblogs.com/mayundalao/p/11798502.html

简述

分布式事务指事务的操作位于不同的节点上，需要保证事务的 AICD 特性。

例如在下单场景下，库存和订单如果不在同一个节点上，就涉及分布式事务。

解决方案

在分布式系统中，要实现分布式事务，无外乎那几种解决方案。

一、两阶段提交（2PC）

两阶段提交（Two-phase Commit，2PC），通过引入协调者（Coordinator）来协调参与者的行为，并最终决定这些参与者是]]></description><category></category></item><item><title><![CDATA[WAL: Write-Ahead Logging]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115470620</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115470620</guid><author>sinat_30955745</author><pubDate>Tue, 06 Apr 2021 20:53:40 +0800</pubDate><description><![CDATA[WAL: Write-Ahead Logging
先写日志，再写磁盘。具体说，当有一条记录需要更新的时候，InnoDB引擎就会先把记录写到redo log里面，并更新内存，这个时候更新计算完成了。同时InnoDB引擎会在在系统比较空闲的时候，将这个操作记录更新到磁盘里。
WAL机制主要得益于两个方面
redo log 和 binlog 都是顺序写，磁盘的顺序写比随机写速度要快；
组提交机制，可以大幅度降低磁盘的 IOPS 消耗。

MySQL中有以下日志文件，分别是：

　　1：重做日志（redo log）]]></description><category></category></item><item><title><![CDATA[过滤器、拦截器和AOP]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115427957</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115427957</guid><author>sinat_30955745</author><pubDate>Sun, 04 Apr 2021 13:45:41 +0800</pubDate><description><![CDATA[过滤器是Java Web层面提供的机制，拦截器是springmvc提供的机制，AOP其实与前面这两个东西关系不大。。。

过滤器
过滤器拦截的是URL

Spring中自定义过滤器（Filter）一般只有一个方法，返回值是void，当请求到达web容器时，会探测当前请求地址是否配置有过滤器，有则调用该过滤器的方法（可能会有多个过滤器），然后才调用真实的业务逻辑，至此过滤器任务完成。过滤器并没有定义业务逻辑执行前、后等，仅仅是请求到达就执行。

特别注意：过滤器方法的入参有request，response，F]]></description><category></category></item><item><title><![CDATA[spring的三级缓存]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115383942</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115383942</guid><author>sinat_30955745</author><pubDate>Thu, 01 Apr 2021 20:42:51 +0800</pubDate><description><![CDATA[既然singleFactory.getObject()返回的是代理对象，那么注入的也应该是代理对象，我们可以看到注入的确实是经过CGLIB代理的AService对象。所以如果没有AOP的话确实可以两级缓存就可以解决循环依赖的问题，如果加上AOP，两级缓存是无法解决的，不可能每次执行singleFactory.getObject()方法都给我产生一个新的代理对象，所以还要借助另外一个缓存来保存产生的代理对象。
...]]></description><category></category></item><item><title><![CDATA[SpringBoot自动装配大概过程]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115290105</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115290105</guid><author>sinat_30955745</author><pubDate>Sun, 28 Mar 2021 23:04:57 +0800</pubDate><description><![CDATA[大概可以把@SpringBootApplication看作是@Configuration、@EnableAutoConfiguration、@ComponentScan注解的集合。根据 SpringBoot 官网，这三个注解的作用分别是：
@EnableAutoConfiguration：启用 SpringBoot 的自动配置机制
@Configuration：允许在上下文中注册额外的 bean 或导入其他配置类
@ComponentScan： 扫描被@Component(@Service,@Con...]]></description><category></category></item><item><title><![CDATA[数据库分库分表]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/115083940</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/115083940</guid><author>sinat_30955745</author><pubDate>Mon, 22 Mar 2021 16:36:09 +0800</pubDate><description><![CDATA[转自阿里技术公众号，地址：https://mp.weixin.qq.com/s/X6FI9Ci7ZXGDNDCkh2VnNA

先说一下我的个人感受，就是我感觉可以与redis进行类比。主从复制-读写分离可以类比于redis的主从复制-哨兵模式，然后分库分表可以类比于redis的集群模式。总得来说，我感觉对于大规模数据的优化，主从复制-读写分离算是初级的优化，然后如果数据规模进一步庞大和QPS变得更加巨大的话，就要使用分库分表了。

1 什么是分库分表？

其实就是字面意思，很好理解：


	分库：从单个.]]></description><category></category></item><item><title><![CDATA[近期学习记录]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/114638169</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/114638169</guid><author>sinat_30955745</author><pubDate>Wed, 10 Mar 2021 16:10:19 +0800</pubDate><description><![CDATA[对前面的线程不安全示例中的 cnt 变量使用 volatile 修饰，不能解决线程不安全问题，因为 volatile 并不能保证操作的原子性。

方法区是一个 JVM 规范，永久代与元空间都是其一种实现方式。在 JDK 1.8 之后，原来永久代的数据被分到了堆和元空间中。元空间存储类的元信息，静态变量和常量池等放入堆中。

覆盖索引（就是联合索引的键值包含了select子句要求查询的键值）对于InnoDB表尤其有用，因为InnoDB使用聚集索引组织数据，如果二级索引中包含查询所需的数据，就不再需要在聚集索引]]></description><category></category></item><item><title><![CDATA[秒杀项目开发优化过程记录]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/111876224</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/111876224</guid><author>sinat_30955745</author><pubDate>Mon, 28 Dec 2020 22:55:05 +0800</pubDate><description><![CDATA[单台虚拟机(mysql和Java程序运行在同一个服务器上)

对于springboot 2.1.16，Tomcat的默认配置如下：


	
server.tomcat.accept-count：等待队列长度，默认100

	
	
	
server.tomcat.max-connections：最大连接数，默认8192
	
	
	
server.tomcat.max-threads：最大工作线程数，默认200
	
	
	
server.tomcat.min-spare-threads：最小工作线程数，默认10]]></description><category></category></item><item><title><![CDATA[Redis的Sentinel（哨兵）模式]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/109955090</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/109955090</guid><author>sinat_30955745</author><pubDate>Sun, 22 Nov 2020 16:29:08 +0800</pubDate><description><![CDATA[首先，我先说下我对于sentinel模式的理解：我觉得就是Redis的主从复制的高可用解决方案，什么意思呢？就是当主服务器挂了，不再用人手工操作的方式切换主从服务器，sentinel服务器会自动的检测出挂了的主服务器，并且自动完成主从服务器的切换。

同样的，因为书中讲到了大量的实现细节，我觉得不用记录得这么详细，所以这里只写一些重点内容。想要详细了解实现细节的话还是去看书的第16章吧。

Sentinel（哨兵）是Redis的高可用性解决方案：由一个或多个sentinel实例（其实就是一个处于sentin]]></description><category></category></item><item><title><![CDATA[Redis的主从复制功能]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/109926554</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/109926554</guid><author>sinat_30955745</author><pubDate>Sun, 22 Nov 2020 15:07:27 +0800</pubDate><description><![CDATA[（这部分我不会写得太详细，因为涉及到大量的实现细节，如果想仔细了解的话，就去看书的第15章吧！！！）

在Redis中，用户可以通过执行SLAVEOF命令或者设置slaveof选项，让一个服务器去复制（replicate）另一个服务器，我们称呼被复制的服务器为主服务器（master），而对主服务器进行复制的服务器则被称为从服务器（slave）。

进行复制中的主从服务器双方的数据库将保存相同的数据，概念上将这种现象称作“数据库状态一致”，或者简称“一致”。

Redis2.8以前的复制功能不能高效地处理断线]]></description><category></category></item><item><title><![CDATA[Redis的事件]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/109564026</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/109564026</guid><author>sinat_30955745</author><pubDate>Sun, 08 Nov 2020 22:03:11 +0800</pubDate><description><![CDATA[Redis服务器是一个事件驱动程序，服务器需要处理以下两类事件：

文件事件（file event）：Redis服务器通过套接字与客户端（或者其他Redis服务器）进行连接，而文件事件就是服务器对套接字操作的抽象。服务器与客户端（或者其他服务器）的通信会产生相应的文件事件，而服务器则通过监听并处理这些事件来完成一系列网络通信操作。
	时间事件（time event）：Redis服务器中的一些操作（比如serverCron函数）需要在给定的时间点执行，而时间事件就是服务器对这类定时操作的抽象。
文件事件

.]]></description><category></category></item><item><title><![CDATA[Redis设置键的生存时间或过期时间]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/109427535</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/109427535</guid><author>sinat_30955745</author><pubDate>Sun, 01 Nov 2020 16:40:57 +0800</pubDate><description><![CDATA[通过EXPIRE命令或者PEXPIRE命令，客户端可以以秒或者毫秒精度为数据库中的某个键设置生存时间（Time To Live,TTL），在经过指定的秒数或者毫秒数之后，服务器就会自动删除生存时间为0的键。

与EXPIRE命令和PEXPIRE命令类似，客户端可以通过EXPIREAT（多了个AT）命令或PEXPIREAT命令，以秒或者毫秒精度给数据库中的某个键设置过期时间。

过期时间是一个UNIX时间戳，当键的过期时间来临时，服务器就会自动从数据库中删除这个键。

虽然有多种不同单位和不同形式的设置命令.]]></description><category></category></item><item><title><![CDATA[Redis的数据库概念]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/109408591</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/109408591</guid><author>sinat_30955745</author><pubDate>Sat, 31 Oct 2020 22:23:25 +0800</pubDate><description><![CDATA[在初始化服务器时，程序会根据服务器状态的dbnum属性来决定应该创建多少个数据库。dbnum属性的值由服务器配置的database选项决定，默认情况下，该选项的值为16，所以Redis服务器默认会创建16个数据库。

每个Redis客户端都有自己的目标数据库，每当客户端执行数据库写命令或者数据库读命令的时候，目标数据库就会成为这些命令的操作对象。

默认情况下，Redis客户端的目标数据库为0号数据库，但客户端可以通过执行SELECT命令来切换目标数据库。为了避免对数据库进行误操作，在执行Redis命令，特]]></description><category></category></item><item><title><![CDATA[Redis的对象系统]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/109402618</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/109402618</guid><author>sinat_30955745</author><pubDate>Sat, 31 Oct 2020 16:29:56 +0800</pubDate><description><![CDATA[下面的内容来自《Redis设计与实现》这本书。

Redis内部自己实现的主要数据结构有简单动态字符串（SDS）、双端链表、字典、跳跃表、整数集合和压缩列表。

Redis并没有直接使用这些数据结构来实现键值对数据库，而是基于这些数据结构创建了一个对象系统，这个系统包含字符串对象、列表对象、哈希对象、集合对象和有序集合对象这五种类型的对象，每种对象都用到了至少一种上面所述的数据结构。

通过这五种不同类型的对象，Redis可以在执行命令之前，根据对象的类型来判断一个对象是否可以执行给定的命令。使用对象的另一]]></description><category></category></item><item><title><![CDATA[InnoDB存储引擎的锁相关内容]]></title><link>https://blog.youkuaiyun.com/sinat_30955745/article/details/109039198</link><guid>https://blog.youkuaiyun.com/sinat_30955745/article/details/109039198</guid><author>sinat_30955745</author><pubDate>Mon, 12 Oct 2020 23:29:56 +0800</pubDate><description><![CDATA[锁的类型

InnoDB存储引擎实现了如下两种标准的行级锁：

共享锁（S Lock），允许事务读一行数据。
	排他锁（X Lock），允许事务删除或更新一行数据。
如果一个事务T1已经获取行r的共享锁，那么另外的事务T2可以立即获得行r的共享锁，因为读取并没有改变行r的数据，这种情况称为锁兼容（Lock Compatible）。但是若有其他的事务T3想获得行r的排他锁，则必须等待事务T1、T2释放行r上面的共享锁，这种情况称为锁不兼容。

另外InnoDB还支持意向锁（Intention Lock）...]]></description><category></category></item></channel></rss>