Redis数据结构
Redis数据结构
Joiner类
Joiner概述Joiner是Java中的一个工具类,用于连接字符串和集合
在Java开发中,经常会遇到连接字符串或集合的情况。例如,我们需要将多个字符串连接成一个完整的字符串,或者将一个集合中的元素连接一个字符串。
Joiner类位于com.google.common.base包中,使用前需要导入该包
下面是一个使用Joiner连接字符串的示例:
12345678import com.google.common.base.Joiner;public class Test{ public static void main(String[] args){ String result=Joiner.on(",").skipNulls().join("h","e","l","null","l","o"); System.out.println(result); }}// h,e,l ...
StringTable
StringTable基本特性
String:字符串使用一堆“”引起来表示
String声明为final的,不可被继承
String实现了Serializable接口:表示字符串时可支持序列化的。实现了Compareble接口:表示String可以比较大小
String在jdk及以前内部定义了final char[] value用于存储字符串。jdk9时改为byte[]
字符串常量池中是不会存储相同内容的字符串的
String的String Pool是固定大小的Hashtable,默认值大小长度是1009。如果放进String Pool的String非常多,就会造成Hash冲突,从而导致链表会很长,而链表长了后会直接造成的影响就是当调用String.intern时性能会大幅下降
使用-XX:StringTableSize可设置StringTable的长度
在jdk6中StringTable是固定的,就是1009的长度,所以如果常量池中的字符串过多就会导致效率下降很快。StringTableSize设置没有要求
在jdk7中,StringTable的长度默认值是60013,1009是 ...
RibbitMQ
RibbitMQ基本架构下图是RabbitMQ的基本架构
生产者(Producer):生产者是消息的发送方,负责产生发送消息到RabbitMQ。生产者通常将消息发送到交换机(Exchange).
交换机(Exchange):交换机是消息的分发中心,负责将接收到的消息路由到一个或多个队列中。它定义了消息的传递规则,可以根据规则将消息发送到一个或多个队列
直连交换机(Direct Exchange):将消息路由到与消息中的路由键(Routing Key)完全匹配的队列
主题交换机(Topic Exchange):根据通配符匹配路由键,将消息路由到一个或多个队列
扇出交换机(Fanout Exchange):将消息广播到所有交换机绑定的队列,忽略路由键
头部交换机(Header Exchange):根据消息头中的属性进行匹配,将消息路由到与消息匹配的队列
队列(Queue):队列是消息的存储区,用于存储生产者发送的消息。消息最终会被消费者从队列中取出并处理。每个队列都有一个名称,并且可以绑定到一个或多个交换机
消费者(Consumer):消费者是消息的接收方,负责从队列中获取消息并进 ...
Java数据类型
Java数据类型Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型。
byte
byte 数据类型是8位、有符号的,以二进制补码表示的整数
最小值是 -128(-2^7);
最大值是 127(2^7-1);
默认值是 0;
byte 类型用在大型数组中节约空间,主要代替整数,因为 byte 变量占用的空间只有 int 类型的四分之一;
例子:byte a = 100,byte b = -50。
short
short 数据类型是 16 位、有符号的以二进制补码表示的整数
最小值是 -32768(-2^15);
最大值是 32767(2^15 - 1);
short 数据类型也可以像 byte 那样节省空间。一个short变量是int型变量所占空间的二分之一;
默认值是 0;
例子:short s = 1000,short r = -20000。
int
int 数据类型是32位、有符号的以二进制补码表示的整数;
最小值是 -2,147,483,648(-2^31);
最大值是 2,147,483,647(2^31 - 1);
一般地 ...
Java集合框架
Java集合框架QueueQueue接口是Java集合框架中定义的一个接口,它代表了一个先进先出(FIFO)的队列。Queue接口继承自Collection接口,它定义了一组方法来操作队列中的元素。下面是Queue接口的一些主要方法和特性的详细解释:
添加元素
boolean add(E element): 将指定的元素添加到队列的末尾,如果成功则返回true,如果队列已满则抛出异常。
boolean offer(E element): 将指定的元素添加到队列的末尾,如果成功则返回true,如果队列已满则返回false。
移除元素
E remove(): 移除并返回队列头部的元素,如果队列为空则抛出异常。
E poll(): 移除并返回队列头部的元素,如果队列为空则返回null。
获取头部元素
E element(): 获取队列头部的元素,但不移除它,如果队列为空则抛出异常。
E peek():获取队列头部的元素,但不移除它,如果队列为空则返回null。
Queue接口还有一些其他方法,如clear()用于清空队列中的所有元素,contains(Object o)用于判断队 ...
TCP三次握手
TCP三次握手TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。三次握手的过程如下图:
一开始,客户端和服务端都处于 CLOSE 状态。先是服务端主动监听某个端口,处于 LISTEN 状态
客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。
服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。
客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号 ...
TCP基础
TCPTCP 是面向连接的、可靠的、基于字节流的传输层通信协议。
头部格式控制位
ACK:该位为 1 时,「确认应答」的字段变为有效,TCP 规定除了最初建立连接时的 SYN 包之外该位必须设置为 1 。
RST:该位为 1 时,表示 TCP 连接中出现异常必须强制断开连接。
SYN:该位为 1 时,表示希望建立连接,并在其「序列号」的字段进行序列号初始值的设定。
FIN:该位为 1 时,表示今后不会再有数据发送,希望断开连接。当通信结束希望断开连接时,通信双方的主机之间就可以相互交换 FIN 位为 1 的 TCP 段。
为什么需要 TCP 协议? TCP 工作在哪一层?
IP 层是「不可靠」的,它不保证网络包的交付、不保证网络包的按序交付、也不保证网络包中的数据的完整性
如果需要保障网络数据包的可靠性,那么就需要由上层(传输层)的 TCP 协议来负责。
因为 TCP 是一个工作在传输层的可靠数据传输的服务,它能确保接收端接收的网络包是无损坏、无间隔、非冗余和按序的。
UDP 和 TCP 有什么区别呢?分别的应用场景是?UDP 不提供复杂的控制机制,利用 IP 提供面向「无连接」的 ...
Redis持久化
持久化How Redis writes data to disk
RDB–Redis DataBaseRDB 持久性以指定的时间间隔执行数据集的时间点快照。
实现类似照片记录效果的方式,就是把某一时刻的数据和状态以文件的形式写到磁盘上,也就是快照。这样一来即使故障宕机,快照文件也不会丢失,数据的可靠性也就得到了保证。**这个快照文件就称为RDB文件(dump.rdb)**,其中,RDB就是Redis DataBase的缩写。
自动触发手动触发Save在主程序中执行会阻塞当前Redis服务器,直到持久化工作完成执行save命令期间,Redis不能处理其他任务
BGSAVE(默认)
Redis会在后台异步进行快照操作,不阻塞快照同时还可以影响客户端请求,该触发方式会fork一个子进程由子进程复制持久化过程
Redis会使用当前内存中的所有数据做快照,这个操作是子进程在后台完成的,这就是允许主进程同时可以修改数据
lastsave可以获取最后一次成功执行快照的时间
优点
适合大规模的数据恢复
按照业务定时备份
对数据完整性和一致性要求不高
RDB文件在内存中的加载速度要比AOF快得多
缺 ...
存储引擎
存储引擎数据存储数据页在磁盘怎么存在MySQL中,实际负责存储和查询的模块称为存储引擎。不同的存储引擎,对数据的存储和读取方式是不同的。MySQL支持多种存储引擎,甚至可以为每张表单独设置不同的存储引擎
数据都是保存在磁盘中的,但是其处理是需要首先加载到内存的。从磁盘读取是非常耗时的IO操作,为了减少对磁盘的读取次数,InnoDB采用页而不是行的粒度来保存数据,也就是数据被分为若干页,然后以页为单位保存在磁盘中。InnoDB的页大小,一般是16KB
设置系统默认的存储引擎查看默认的默认存储引擎
123show variable like '%storage_engine%';#或SELECT @@default_storage_engine;
修改默认的存储引擎
如果在创建表的语句中没有显式指定表的存储引擎的话,那就会默认使用 InnoDB 作为表的存储引擎。如果我们想改变表的默认存储引擎的话,可以这样写启动服务器的命令行:
1SET DEFAULT_STORAGE_ENGINE=MyISAM;
或者修改my.cnf文件:
1234default-storage ...








