- 博客(22)
- 收藏
- 关注
原创 Redis系列(三)存储原理与数据模型
redis时key-value的结构,其中value包含:字典,双向链表,压缩列表,调表,整数数组,动态字符串。
2022-11-01 00:29:43
346
原创 Mysql(四)缓存策略
由于 mysql 的缓冲层不由用户来控制,也就是不能由用户来控制缓存具体数据;访问磁盘的速度比较慢,尽量获取数据从内存中获取;主要解决读的性能;因为写没必要优化,必须让数据正确的落盘;如果写性能出现问题,那么可以使用横向扩展集群方式来解决;项目中需要存储的数据应该远大于内存的容量,同时需要进行数据统计分析,所以数据存储获取的依据应该是关系型数据库;缓存数据库可以存储用户自定义的热点数据;以下的讨论都是基于热点数据的同步问题;
2022-10-30 23:31:06
417
原创 Mysql(一)sql语句、索引、视图初体验
Mysql是按照数据结构来组织、存储和管理数据的仓库;是一个长期存 储在计算机内的、有组织的、可共享的、统一管理的大量数据 的集合;Mysql做增删改操作必须落盘才返回。redis不持久的话就存在内存中。Mysql是关系型数据库(类似与二维表),Redis非关系型数据库(key-value)。Mysql网络结构是select + 阻塞的io,redis是单reactor模型,并且单线程执行命令。
2022-10-23 19:14:16
261
原创 redis系列(二)redis协议与异步方式
redis是基于reactor模式设计的内存数据库。redis是单线程redis 单线程是指其网络事件处理模型 reactor 是单线程,即指令的执行是在单线程上操作。但是其包括IO读取,网络IO操作都是通过多线程执行的。
2022-10-19 23:23:08
924
原创 从protobuf实例理解原理以及Varint编码
protocol buffers 是一种语言无关、平台无关、可扩展的序列化结构数据的方法,它可用于(数据)通信协议、数据存储等。protobuf特点:ProtoBuf 支持 Java、C++、Python 等多种语言,支持多个平台。并且客户端和服务端还可以使用不同的语言编写。使用protobuf序列化数据传输速度快,比XML数据快数10倍。主要得益于他的编码方式。扩展性、兼容性好。更新数据结构,不影响和破坏原有的旧程序。
2022-10-16 17:58:44
497
原创 redis系列(一)原理及基本命令
Redis 是 Remote Dictionary Service 的简称,被称为远程字典服务;redis客户端和服务端是基于TCP建立网络通信的。Redis 是内存数据库,是目前市面上高性能的key-value数据库;底层的数据结构就是hash,因此查找数据的复杂度为O(1);redis中的字符串是一种动态字符串。在C语言中字符串是以’\0’结尾的字符串数组。但在redis中是自己构建一套简单动态字符串(simpledynamic string 简称SDS)。
2022-10-14 00:24:12
174
原创 哈希表与一致性哈希
(hash)又叫散列表是一种数据结构,可以根据 key 计算 key 在表中的位置;是key 和其所在存储地址的映射关系(如:Hash(key)=address)。哈希表的节点中的 key和value 是存储在一起的;如下所示哈希表有几个因素:hash函数、负载因子。
2022-10-09 23:18:01
162
原创 IO接口中的fread/fwrite/fflush分析
linux底层操作;内核调用, 涉及到进程上下文的切换,即用户态到核心态的转换,这是个比较消耗性能的操作。:c语言标准规定的io流操作,建立在read/write/fsync之上在用户层,又增加了一层缓冲机制,用于减少内核调用次数,但是增加了一次内存拷贝。可以将fread,fwrite是一种批量写入,而read,write是单次写入的形式来理解。对于输入设备,调用fsync/fflush将清空相应的缓冲区,其内数据将被丢弃;
2022-10-09 23:01:14
1025
原创 从Log4cpp日志框架中学习日志该怎么打印
log4cpp是个开源项目,移植自Java的日志处理跟踪项目log4j,并保持了API上的一致。Log4cpp中最重要概念有Category(种类)、Appender(附加器)、Layout(布局)、Priorty(优先级)。:表示日志的级别种类。分为EMERG、FATAL、ALERT、CRIT、ERROR、WARN、NOTICE、INFO、DEBUG。:日志的常用优先级:DEBUG < INFO < WARN < ERROR < FATAL。
2022-10-09 22:28:12
402
原创 池化技术-数据库连接池
常用案例:线程池、内存池、连接池、对象池。对象创建时间长;对象创建需要大量资源;对象创建后可被重复使用减少资源对象的创建次数,提高程序的响应性能,在高并发下情况下提高更加明显。定义:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。数据库连接池的特点:资源复用。
2022-09-15 00:20:10
934
原创 手写Linux/C语言线程线程池实现
本线程池采用C语言实现,C++版本可参考有一个经验公式: 线程数量 =(io等待时间+cpu运算时间)*核心数/cpu运算时间。
2022-09-13 00:58:57
430
原创 基于C++11新特性手写线程池实现
线程池封装在ZERO_ThreadPool类中,以下从几个函数代码去分析线程池的原理。线程池采用C++11实现,包括不限于右值引用move,类型推导decltype、aouto,模板函数,可变参数,lambda表达式等新特性。
2022-09-11 16:43:35
775
1
原创 单例模式的原理/懒汉模式/饿汉模式以及不同版本的单例模式程序
单例模式保证一个类仅有一个实例,并提供一个该实例的全局访问点。从初始化的时间角度上看,单例模式分为两种,懒汉模式与饿汉模式。包含C++代码
2022-08-06 14:42:41
303
原创 匿名函数lambda表达式
C++中匿名函数也叫lambda表达式。字面意思就是没有名字的函数;匿名函数不用在头文件中声明,可以看做是一个临时函数,仅在调用时才会创建函数对象。
2022-07-28 08:00:00
966
5
原创 emplace_back和push_back对比分析
emplace_back是C++11新引进的接口函数。emplace_back是就地构造,不用构造后再次复制到容器中。因此效率更高。
2022-07-27 00:46:44
1165
3
原创 深拷贝与浅拷贝定义以及案例说明
浅拷贝只是拷贝一个指针,并没有新开辟一个地址,拷贝的指针和原来的指针指向同一块地址,如果原来的指针所指向的资源释放了,那么再释放浅拷贝的指针的资源就会出现错误。对于含有堆内存的类,如果使用默认构造函数浅拷贝操作,很容易会导致堆内存的重复删除运行结果可以看到“free()表示对同一块堆上的内存重复调用了free()函数。可以看到其中两个m_ptr的地址是相同的。上述程序可以使用深拷贝来避免这个问题。...
2022-07-26 19:50:21
409
原创 右值引用以及move移动语义和forward 完美转发
文章对比了左值和右值的区别,解释了右值引用的含义和右值引用的用法,以及在移动构造函数中右值引用的使用;文章还解释了move移动语义减少性能消耗的原因,以及forward完美转发的原理以及案例。.........
2022-07-26 15:37:10
561
5
原创 weak_ptr基本用法以及怎么解决循环引用
文章主要记录自己学习智能指针weak_ptr的笔记,详细记录了weak_ptr处理循环引用的步骤,并且写了weak_ptr常用的函数用法以及注意事项。
2022-07-25 19:53:37
7222
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人