- 博客(56)
- 收藏
- 关注
原创 select、poll、epoll
select()是Unix/Linux系统中用于I/O多路复用的系统调用,它允许程序监视多个文件描述符,等待一个或多个文件描述符变为"就绪"状态(即可读、可写或有异常)。
2025-05-10 22:48:23
557
原创 C++多线程与锁机制
int y;// 必须是可平凡复制的类型(trivially copyable)// 原子操作示例// 原子读取// 原子写入// CAS操作对模板类型T可平凡复制(Trivially Copyable):保证对象可以用memcpy方式安全复制无用户定义的拷贝控制(析构函数、拷贝/移动构造/赋值)标准布局(Standard Layout)在编译时验证这些条件,若不满足会立即报错(比运行时错误更安全)。一个类型T是平凡可复制(Trivially Copyable)
2025-04-29 18:55:43
1059
原创 C++ 原子操作的内存序(memory ordering)
内存序作用适用场景relaxed仅保证原子性,无顺序约束计数器、无竞争统计consume仅保证依赖该原子变量的操作有序指针发布(较少使用)acquire保证后续操作不会重排到它之前(读同步)锁获取、数据同步release保证之前操作不会重排到它之后(写同步)锁释放、数据发布acq_rel同时具备acquire和release(用于 RMW 操作)自旋锁、无锁数据结构seq_cst全局顺序一致(最强约束,性能最低)需要严格顺序的算法。
2025-04-29 18:11:18
387
原创 C++ 简单线程池实现
public:// 构造函数,指定线程数量// 析构函数private:// 工作线程集合// 任务队列// 任务队列互斥锁// 条件变量bool stop;// 停止标志。
2025-04-29 17:54:30
359
原创 布隆过滤器
正是基于布隆过滤器的快速检测特性,我们可以在把数据写入数据库时,使用布隆过滤器做个标记。当缓存缺失后,应用查询数据库时,可以通过查询布降过滤器快速判断数据是否存在。了,大量请求只会查询Redis和布隆过滤器,而不会积压到数据库,也就不会影响数据库的正常运行。使用多个hash函数对key进行hash运算得到一个整数索引值,对位数组长度进行取模运算得到一个位置,每个hash函数都会得到一个不同的位置,将这几个位置都置1就完成了add操作。只要有其中一位是零就表示这个key不存在,但如果都是1,
2024-09-11 20:50:25
323
原创 基于canal的Redis缓存双写
canal地址:alibaba/canal: 阿里巴巴 MySQL binlog 增量订阅&消费组件 (github.com)
2024-09-07 22:16:03
659
原创 Redis——BigKey
当redis key的数量过多时,使用keys*会耗费大量时间和性能,因此在生产上需要禁用一些危险命令。在 redis.conf 文件 SECURITY 板块中设置 rename-command例如禁用keys,flushdb,flushall。
2024-09-05 19:08:40
668
原创 SpringBoot集成Redis——RedisTemplate
Redis中的key和value均是以二进制的形式存储的,因此客户端输入的key和value都会经过序列化之后才发往Redis服务端。而RedisTemplate所使用序列化方式和命令行客户端采用序列化方式不相同,进而导致序列化之后的二进制数据不同,所以才会导致上述的现象。当集群中的一个主机意外宕机,集群能自动感知并自动完成主备切换,但SpringBoot客户端没有动态感知到集群的最新信息。因此我们可以仿照StringRedisTemplate自定义redis配置,将序列化方式设为合适类型。
2024-09-03 14:44:42
955
原创 Redis集群(cluster)
由于数据量过大,单个master复制集难以承担,因此需要对多个复制集进行集群,形成水平扩展,每个复制集只负责存储整个数据集的一部分,这就是Redis集群,其作用是提供在多个Redis节点间共享数据的程序集。
2024-09-02 22:46:05
1237
原创 Redis复制(replica)
主从复制,主数据库以写为主,从数据库以读为主。当主数据库数据发生变化时,自动将新的数据异步同步到其它的从数据库。
2024-08-27 16:14:38
406
1
原创 Redis管道(Pipeline)
如果同时需要执行大量的命令,那么就要等待上一条命令应答后再执行,这中间不仅仅多了RTT(Round Time Trip),而且还频繁调用系统IO,发送网络请求,同时需要redis调用多次read()和write()系统方法,系统方法会将数据从用户态转移到内核态,这样就会对进程上下文产生比较大的影响,性能不好。客户端向服务端发送命令分四步(发送命令→命令排队→命令执行→返回结果),并监听Socket返回,通常以阻塞模式等待服务端响应。以及请求/响应协议的TCP服务。服务端处理命令,并将结果返回给客户端。
2024-08-24 19:38:32
462
原创 Redis事务
当客户端丢失连接的时候,所有东西都会被取消监视(也就是说在一个客户端中被监控的key,在另一个客户端中不生效)如图,在exec之前,被watch的tk1在另一个客户端中发生改变,此时exec后事务中的命令全部不执行。一个事务中的命令会被放入一个队列中,执行EXEC后一次性、排他地顺序执行事务块内的命令。一条命令可能无法加入队列,即在EXEC前产生错误,此时事务块内的命令全部失败(类似于编译时错误)。在EXEC后产生错误,产生错误的命令执行失败,但其它命令可以正常执行(类似于运行时错误)。
2024-08-24 18:58:34
362
原创 Redis持久化RDB/AOF
同时,为了便于AOF备份和拷贝,将所有的AOF文件和manifest文件放入一个单独的文件目录中,目录名由appenddirname配置决定(文件路径为前文rdb配置的 dir + appenddirname)。AOF(Append Only File):以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启后就根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作。
2024-08-23 23:33:21
1111
原创 Redis十大数据类型
Streams 会自动使用内部队列(也称为 PENDING List)留存消费组里每个消费者读取的消息保底措施,直到消费者使用 XACK 命令通知 Streams“消息已经处理完成”。由0和1状态表现的二进制位的bit数组,使用type key得到的结果为“string”,可以看为string类型的子类。消费确认增加了消息的可靠性,一般在业务处理完成之后,需要执行 XACK 命令确认消息已经被消费完成。:让组内多个消费者共同分担读取消息,实现消息读取负载在多个消费者间是均衡分布的。
2024-08-21 21:15:10
1292
原创 使用LIKE进行模糊查询
查询第二个字符是‘_’,第三个字符是‘e’的信息:使用转义字符。ESCAPE指定一个字符代替‘\’查询以字符‘e’开头的字符。查询第三个字符是‘e’的信息。查询包含字符‘e’的信息。代表一个不确定的字符。
2024-04-07 16:27:26
364
1
原创 MySQL基础
紧跟列名,也可以在列名和别名之间加入关键字 ‘AS’ (alias),别名使用双引号,以便在别名中包含空格或特殊的字符并区分大小写。1、DML(Data Manipulation Language):数据操纵语句,用于添加、删除、修改、查询数据库记录,并检查数据完整性。2、DDL(Data Definition Language):数据定义语句,用于库和表的创建、修改、删除。3、DCL(Data Control Language):数据控制语句,用于定义用户的访问权限和安全级别。表employees截图。
2024-04-06 21:05:19
748
原创 Stream API
Stream 是数据渠道,用于操作数据源(集合、数组等)所生成的元素序列。Stream 和 Collection 集合的区别:Collection 是一种静态的内存数据结构, 讲的是数据,而 Stream 是有关计算的,讲的是计算。前者是主要面向内存, 存储在内存中,后者主要是面向 CPU,通过 CPU 实现计算。
2024-04-04 20:31:07
650
原创 反射Reflection
Reflection(反射)是被视为动态语言的关键,反射机制允许程序在运行期间借助于 Reflection API 取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。加载完类之后,在堆内存的方法区中就产生了一个 Class 类型的对象(一个类只有一个 Class 对象),这个对象就包含了完整的类的结构信息。我们可以通过这个对象看到类的结构。这个对象就像一面镜子,透过这个镜子看到类的结构, 所以,我们形象的称之为:反射。// 反射// 创建实例// 调用属性。
2024-04-03 20:12:23
871
原创 Class类
在 Java 的日常应用程序开发中,类的加载几乎是由上述 3 种类加载器相互配合执行 的。在必要时,我们还可以自定义类加载器,来定制类的加载方式体现 Java 语言强大生命力和巨大魅力的关键因素之一便是,Java 开发者可以自定义类加载器来实现类库的动态加载,加载源可以是本地的 JAR 包,也可以是网络上的远程资源。同时,自定义加载器能够实现应用隔离,例如 Tomcat,Spring 等中间件和组件框架都在内部实现了自定义的加载器,并通过自定义加载器隔离不同的组件模块。
2024-04-03 18:30:32
1079
原创 TCP/UDP协议
之后客户端进入 TIMEWAIT (时间等待)状态,服务器收到 ACK 应答报文段后,服务器就进入 CLOSE(关闭)状态,到此服务器的连接已经完成关闭。客户端处于 TIMEWAIT 状态时,此时的 TCP 还未释放掉,需要等待 2MSL 后,客户端才进入 CLOSE 状态。由于这种面向连接的特性,TCP 协议可以保证传输数据的安全,所以应用十分广 泛,例如下载文件、浏览网页等。TCP 协议中,在发送数据的准备阶段,客户端与服务器之间的三次交互,以保证连接的可靠。释放已建立的连接,效率低。
2024-03-31 20:20:03
881
原创 对象序列化机制
对象序列化机制允许把内存中的 Java 对象转换成平台无关的二进制流,从而允许把这种二进制流持久地保存在磁盘上,或通过网络将这种二进制流传输到另一个网络节点。当其它程序获取了这种二进制流,就可以恢复成原来的 Java 对象。序列化的好处,在于可将任何实现了 Serializable 接口的对象转化为字节数据,使其在保存和传输时可被还原。如果需要让某个对象支持序列化机制,则必须让对象所属的类及其属性是可序列化的,为了让某个类是可序列化的,该类必须实现。类保存基本类型数据或对象的机制。
2024-03-30 20:17:05
1018
原创 File和IO流
处理流:不直接连接到数据源或目的地,而是“连接”在已存在的流(节点流或处理流)之 上,通过对数据的处理为程序提供更为强大的读写功能。I/O 流中的 I/O 是 Input/Output 的缩写, I/O 技术是非常实用的技术,用于处理设 备之间的数据传输。如读/写文件,网络通讯等。Java 程序中,对于数据的输入/输出操作以“流(stream)” 的方式进行,可以看做是 一种数据的流动。– 字节流 :以字节为单位,读写数据的流。
2024-03-28 20:09:23
479
原创 HashMap的添加操作底层详解
首先会调用 key1 所在类的 hashCode()方法,计算 key1 的哈希值 1, 此哈希值 1 再经过某种运算(hash()),得到哈希值 2。位置 2、位置 3:(key1,value1) 与现有的元素以链表的方式存储在 table 数组索引 i 的位置,新添加的元素指向旧添加的元素。(2.1) 如果哈希值不同,则(key1,value1)直接添加成功 ------位置 2。(1)如果数组索引为 i 上的数据为空,则(key1,value1)直接添加成功 ------位置 1。
2024-03-26 21:05:17
1139
原创 泛型和通配符
当我们在类或接口中定义某个成员时,该成员的相关类型是不确定的,而这个类型需要在使用这个类或接口时才可以确定,那么我们可以使用泛型类、泛型接口。① 我们在声明完自定义泛型类以后,可以在类的内部(比如:属性、方法、构造器中)使用类的泛型。② 我们在创建自定义泛型类的对象时,可以指明泛型参数类型。一旦指明,内部凡是使用类的泛型参数的位置,都具体化为指定的类的泛型类型。
2024-03-24 20:22:12
1070
1
原创 Collections工具类
排序操作:reverse(List):反转List 中元素的顺序 shuffle(List):对 List 集合元素进行随机排序 sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序 sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序 swap(List,int, int):将指定 List 集合中的 i 处元素和 j 处元素进行交换查找:Object max(Collection):根据元素的自
2024-03-21 21:38:02
333
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人