我的日积月累

2023 12.29 数据库的类型:

1.数据库基本上可分为关系数据库和非关系数据库:

1、关系型数据库Relational Database
关系型数据库的使用最为普遍流行,排名前十的数据库里就有6个是关系型数据库,如Oracle、MySQL、微软的SQL Server、PostgreSQL、IBM的DB2以及装机量最多的数据库SQLite以及大数据库的数据库Hive

2、文档型数据库Document Database
常见的有前端开发和爬虫的最爱MongoDB、Couchbase、Firebase、CouchDB

3、键值数据库Key-value Database
键值数据库常见的有Redis、Memcached,Redis工业场景很多时候当成实时数据库使用。

4、搜索引擎Search Engine
比如大厂必备的Elasticsearch、日志数据库Splunk

5、宽列数据库Wide Column
分布式数据库,常见的有Cassandra、HBase

6、图形数据库Graph
常见的有Neo4j

7、时序数据库Time Series
常见的有InfluxDB

2.实时数据库和关系数据库的区别


来源:https://blog.csdn.net/herman_he/article/details/50215263
实时数据库和关系数据库的区别,
1.数据库和关系数据库
数据库是指按照一定数据结构和模型来组织、存储和管理数据的仓库。采用关系模型建立起来的数据库叫做关系数据库。关系数据库是建立在集合代数基础上,应用数学方法来处理数据库中的数据。现实世界中的各种实体以及实体之间的各种联系均用关系模型来表示。
2.实时数据库和关系数据库
实时数据库是采用实时数据模型建立起来的数据库,用于处理不断更新的快速变化的数据及具有时间限制的事务处理。传统的关系数据库系统旨在处理永久、稳定的数据,强调维护数据的完整性、一致性, 其性能目标是高系统吞吐量和低代价,但对处理的定时限制没有严格要求。而实时数据库系统需要结合实时数据处理技术和数据库技术,并同时满足数据实时性和一致性的要求。实时数据库系统的主要目标是使尽量多的事务在规定的时间要求内完成,而不是公平地分配系统资源,从而使得所有事务能得以执行。概括地讲,实时数据库系统有如下特点:

  1. 时间约束:
    实时数据库是其数据和事务都有明确的时间限制的数据库。在实时系统中,具有时间约束的数据主要是来自于外部的动态数据,以及由这些数据求导出的新的数据。数据库中的数据必须如实反映现场设备的运行情况。
  2. 事务调度:
    实时数据库系统的正确性不仅依赖于事务的逻辑结果,而且依赖于该逻辑结果所产生的时间。事务调度既要考虑事务的执行时间,也要考虑事务的截止期、紧迫程度等因素。
  3. 数据存储:
    实时数据库主要承担系统所有实时数据的存储和管理,为相关的功能提供快速、正确的实时信息。为了达到实时性,实时数据库在系统运行过程中,应常驻内存,以保证读取速度。对于实时性要求不高的数据可存放在外存储空间。因此,在实时数据库设计时,要妥善处理时间与存储空间的矛盾,以保证系统的实时性。
  4. 数据在线压缩:
    在实际的数据存储中,实时数据库还要解决如何高效处理海量数据的问题。如果数据被原封不动地存储势必需要大量内存和磁盘空间以及耗费大量的时间,因此必须对实时数据进行在线压缩存储。

3.实时数据库和时序数据库区别

来源:https://cloud.tencent.com/developer/article/2158371
广义上讲,只要一个数据库具备实时处理过程,即以足够快的速度处理事务来返回结果并及时响应,且处理的工作事务的状态不断变化,那它就是实时数据库。而以监控为目的的实时数据库满足这些条件,它处理的是传感器或设备不断产生的时序数据,可以快速处理、及时响应。其“时序数据”作为重要特征区别于其他各类数据库,于是就有了另外一个名字:时序数据库。
时序数据库在维基百科上的解释:A time series database (TSDB) is a software system that is optimized for handling time series data, arrays of numbers indexed by time (a datetime or a datetime range). 翻译过来就是“时序列数据库用来存储时间序列(time-series)数据并以时间(点或区间)建立索引的软件系统。
典型时序数据库infulxdb :https://www.cnblogs.com/schaepher/p/15085720.html

2023 1.2 :

SQL中的LIMIT 与 OFFSET

  1. 定义
    LIMIT: 限制返回的行数。可以有两个参数,第一个参数为起始行,从 0 开始;
    第二个参数为返回的总行数。
    实例:
/*返回第  5 行*/
```sql
SELECT *
FROM mytable
LIMIT 0, 5;

2. limit 与 offset共同用法
limit y : 读取 y 条数据
limit x, y : 跳过 x 条数据,读取 y 条数据
limit y offset x : 跳过 x 条数据,读取 y 条数据

##2023.1.22
多媒体定时器,不基于事件驱动,精度高,可达1ms
select的方式抖动也较大
sleep和信号量的方式是基于事件驱动的,抖动较大
https://blog.csdn.net/hk_5788/article/details/69597312


## 2023 1.3 :
今日无事来窥探一下前端的部分知识
        基于QT开发的页面执行效率高,资源开销小,但是QT开发炫酷的页面开发代价太大了,和前端比起来,QT实现一个小小的功能需要写的代码太多,需要从底层开始一笔一画绘制出来。所以就有一个方向,界面通过web前端开发,服务端还是通过c++,但是web前端无法直接调用c/c++的接口,目前博主接触过使用cpp_httplib的方式,封装c++/c的接口提供给前端访问,并把请求的数据使用json的格式返回。
     但是今天我们探究的是另一种技术[WebAssembly](https://blog.csdn.net/qq_42956179/article/details/116799946?spm=1001.2014.3001.5502),WebAssembly提供了一直js前端直接访问c++/c接口的一种方式,效率极高。
     [1.环境搭建](https://blog.csdn.net/qq_42956179/article/details/116916403?spm=1001.2014.3001.5502)
     [2.代码调试](https://blog.csdn.net/qq_42956179/article/details/116986325?spm=1001.2014.3001.5502)
     [3.c++调试](https://blog.csdn.net/qq_42956179/article/details/116986325?spm=1001.2014.3001.5502)
     [4.c++类调试](https://blog.csdn.net/qq_42956179/article/details/118031830?spm=1001.2014.3001.5502)
     
## 2024 3.20 :c++智能指针
shared_ptr :
      共享智能指针,它的核心思想是原子引用计数的作用下,调用者不需要手动去释放申请的内存,它是多线程安全的,但是它需要注意的一点是,在多线程同时读写的时候,需要另外加锁保证读写安全,此外共享指针存在循环调用导致最后引用计数无法归零,内存无法释放。
unique_ptr:
      独享智能指针,和共享相反,它只允许调用者独占使用
weak_ptr:
      弱引用智能指针,它的存在意义是为了解决共享智能指针循环调用产生的问题,它不会增加共享智能指针的引用计数
 共享指针的循环调用的问题
```cpp
class b;
class a 
{
public:
	shared_ptr<b> _b;
	~a() {
		cout << "destroy a" << endl;
	}
	void hi()const
	{  
		cout << "hi" << endl;
	}
};
class b 
{
public:
	shared_ptr<a> _a;
	~b()
	{
		cout << "destory b" << endl;
	}
};
int main()
{
	shared_ptr<a>pa = make_shared<a>();
	shared_ptr<b>pb = make_shared<b>();
	pa->_b = pb;
	pb->_a = pa;
	pb->_a->hi();
	return 0;
}

修改后


```cpp
#include <iostream>
#include <memory>

using namespace std;

class b;  // 预先声明类 b

class a {
public:
    shared_ptr<b> _b;
    ~a() {
        cout << "destroy a" << endl;
    }
    void hi() const {
        cout << "hi" << endl;
    }
};

class b {
public:
    weak_ptr<a> _a;  // 使用 weak_ptr 解决循环引用的问题
    ~b() {
        cout << "destroy b" << endl;
    }
};

int main() {
    shared_ptr<a> pa = make_shared<a>();
    shared_ptr<b> pb = make_shared<b>();
    
    pa->_b = pb;
    pb->_a = pa;  // 使用 weak_ptr

    // 检查 weak_ptr 是否有效
    if (shared_ptr<a> paTemp = pb->_a.lock()) {
        paTemp->hi();
    } else {
        cout << "pa is no longer valid" << endl;
    }

    return 0;
}

make_shared 和 shared_ptr 区别:

make_shared 是一个函数模板,用于在动态内存中分配一个对象并返回指向该对象的 shared_ptr。它可以同时进行内存分配和对象构造,可以减少内存分配和析构的开销,同时提高内存访问的效率。
// 使用 make_shared 创建 shared_ptr 对象
shared_ptr ptr = make_shared(42);
shared_ptr 是一个智能指针类,用于管理动态分配的对象的所有权。多个 shared_ptr 可以共享对同一对象的所有权,通过引用计数的方式来管理对象的生命周期,当引用计数减少到 0 时,对象会被自动释放。
// 创建 shared_ptr 对象
shared_ptr ptr(new int(42));
主要区别在于:
使用 make_shared 可以一次性完成内存分配和对象构造,减少了额外的内存分配次数,提高了内存访问效率。
直接使用 shared_ptr 通过 new 进行对象创建时,会额外进行一次动态内存分配和对象构造。
由于 make_shared 会在一次内存分配中同时完成对象构造,因此更适合使用 make_shared 来创建 shared_ptr 对象,以提高性能和代码简洁度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值