socket网络编程-阻塞式
模拟服务器
import java.net.ServerSocket;import java.net.Socket;public class Server { public static void main(String[] args) { System.out.println("服务端启动"); try { ServerSocket serverSocket = new ServerSocket(9001); while (true) { Socket socket = serverSocket.accept(); new Thread(new ServerListen(socket)).start(); new Thread(new ServerSend(socket)).start(); } } ca ...
Linux常用命令
Linux 常用命令
文件及目录管理
ls - 列出目录的内容。
cd - 更改当前工作目录。
pwd - 打印当前工作目录。
mkdir - 创建一个新目录。
rmdir - 删除一个空目录。
rm - 删除文件或目录。
mv - 移动或重命名文件和目录。
cp - 复制文件和目录。
touch - 创建新文件或更新现有文件的时间戳。
find - 根据各种标准搜索文件和目录。
文件查看和操作
cat- 连接并显示一个或多个文件的内容。
less- 一次一页地查看文件的内容。
head- 显示文件的前几行。
tail- 显示文件的最后几行。
grep- 在文件或输入中搜索模式。
sed- 用于编辑文件的流编辑器。
awk- 模式扫描和处理语言。
sort- 对文本文件的行进行排序。
uniq- 报告或省略重复的行。
diff- 逐行比较文件。
系统信息和管理
uname - 打印系统信息。
uptime - 显示系统已运行的时间。
free - 显示可用和已用内存量。
top - ...
RabbitMQ,RocketMQ,Kafka的一些基础知识点
RabbitMQ,RocketMQ,Kafka的一些基础要点
队列模型和主题模型
早期的消息中间件是通过 队列 这一模型来实现的,可能是历史原因,我们都习惯把消息中间件成为消息队列。
但是,如今例如 RocketMQ、Kafka 这些优秀的消息中间件不仅仅是通过一个 队列 来实现消息存储的。
就像我们理解队列一样,消息中间件的队列模型就真的只是一个队列。
这种模型下,“广播”功能就不便实现了。也就是说如果我们此时我们需要将一个消息发送给多个消费者(比如此时我需要将信息发送给短信系统和邮件系统),这个时候单个队列即不能满足需求了。当然你可以让 Producer 生产消息放入多个队列中,然后每个队列去对应每一个消费者。问题是可以解决,创建多个队列并且复制多份消息是会很影响资源和性能的。而且,这样子就会导致生产者需要知道具体消费者个数然后去复制对应数量的消息队列,这就违背我们消息中间件的 解耦 这一原则。
主题模型(发布/订阅模型)就是为了解决这一问题而设计的。 //TODO⭐ 去了解观察者模式
在主题模型中,消息的生产者称为 发布者(Publisher) ,消息的消费者称为 订阅者(S ...
跨域问题及其解决方案
跨域请求实现方案
跨域(Cross-Origin)指的是从一个源(Origin)向另一个不同源发起的 HTTP 请求。根据浏览器的同源策略(Same-Origin Policy),一个源只能访问同源的资源,跨域访问资源时会受到限制。理解跨域需要了解几个概念:
同源策略
同源策略是一种浏览器安全机制,用于防止一个源的恶意脚本访问另一个源的敏感数据。一个源由以下三部分组成:
协议(Scheme):如 http、https。
域名(Host):如 example.com。
端口(Port):如 80、443。
两个 URL 必须同时满足协议、域名和端口相同,才被认为是同源。
什么是跨域
跨域指的是协议、域名或端口任意一个不同的情况下,从一个网页向另一个不同源的服务器发起的 HTTP 请求。例如:
从 http://example.com 向 https://example.com 发请求(协议不同)。
从 http://example.com 向 http://api.example.com 发请求(域名不同)。
从 http://example.com:80 向 ...
MySQL主键自增不连续的情况
场景1:自增初始值和自增步长不为1
在 MySQL 里面,如果字段 id 被定义为 AUTO_INCREMENT,在插入一行数据的时候,自增值的行为如下:
如果插入数据时 id 字段指定为 0、null 或未指定值,那么就把这个表当前的 AUTO_INCREMENT 值填到自增字段;
如果插入数据时 id 字段指定了具体的值,就直接使用语句里指定的值。
根据要插入的值和当前自增值的大小关系,自增值的变更结果也会有所不同。假设某次要插入的值是 insert_num,当前的自增值是 autoIncrement_num:
如果 insert_num < autoIncrement_num,那么这个表的自增值不变
如果 insert_num >= autoIncrement_num,就需要把当前自增值修改为新的自增值
也就是说,如果插入的 id 是 100,当前的自增值是 90,insert_num >= autoIncrement_num,那么自增值就会被修改为新的自增值即 101
一定是这样吗?NO
了解过分布式 id 的小伙伴一定知道,为了避免两 ...
Redis知识点
Redis数据结构和类型
Redis有5种数据类型:字符串、链表、哈希、集合、有序集合
与8种数据结构分别对应:
String
List
Hash
Set
ZSet
SDS(简单动态字符串)
LinkedList、ZipList、QuickList
Dict、ZipList
Dict、IntSet
ZipList、SkipList
String
应用场景:
需要存储常规数据的场景:Session、Token、图片地址、序列化后的对象
需要计数的场景:用户单位时间请求数、页面单位时间访问量
分布式锁:SETNX KEY VALUE
List
应用场景:
信息流展示:最新文章、最新动态相关命令:LPUSH、LRANGE
消息队列,不建议用Redis实现消息队列
Hash
Redis的Hash是一个 String 类型的 field-value 映射表,特别适合存储对象。
应用场景:
对象存储:用户信息、商品信息、文章信息、购物车信息
存对象用String还是Hash?
String 存的是序列化后的对象,存的是整个对象。Hash 是 ...
halo安装部署
安装Docker
使用终端命令安装Docker
更新yum
yum update
卸载旧版本:
列出安装过的 Docker 包:
yum list installed | grep docker
旧版名称是 Docker,最新社区版 docker-engine, 目前已改名为docker-ce
yum -y remove docker docker-common docker-selinux docker-engine
设置yum源:
本文以 yum 安装为例子进行安装安装 yum-utils,使用 yum-config-manager 工具设置 yum 源,后面两个是 devicemapper 驱动依赖
yum install -y yum-utils device-mapper-persistent-data lvm2
使用阿里源访问
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
安装Docker
yum install docker-ce
...
JUC知识点
在JAVA中,当我们启动main函数时,实际上会启动一个JVM进程,main函数所在的线程就是这个进程的主线程。
并发编程的三个重要特性:原子性、可见性、有序性
原子性:使用sychronized、各种lock保证原子性
可见性:当一个线程对共享变量修改后,另外的线程都是可以立即看到修改后的最新值。使用sychronized、volatile、lock实现可见性。
有序性:指令重排序可以保证串行语义一致,但是没有义务保证多线程间的语义也一致,所以在多线程下,指令重排序可能会导致一些问题,我们可以使用volatile关键字来禁止指令重排序。
多线程
进程和线程的区别
并发和并行
创建线程的方式
public class test { public static void main(String[] args) { //匿名内部类,在Thread()中传入实现了Rannable接口的实例 new Thread(()->{ System.out.println(&quo ...