NoSQL 概述
一、为什么要用NoSQL?
1. 单机MySQL的时代
app -> DAL -> MySQL
整个网络的瓶颈是什么?
- 数据量如果太大,一个机器放不了
- 数据的索引( B+tree ),MySQL 300百万条数据,一个机器的内存也放不下
Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以Redis 提供了持久化功能
在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot 快照,它恢复时是将快照文件直接读到内存里
Redis 会单独创建(Fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程都结束了,在用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那么RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。我们默认的就是RDB,一般情况下不需要修改这个配置。
有时候在生产环境会将这个文件备份。
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)
1 | 1. move name 1 # 移除数据库1 中的 key(name) |
实现:整数值、embstr编码的简单动态字符串、简单动态字符串
1 | 1. set key1 v1 # 设置值 |
C语言当前定义的基本数据类型有 int、char、float 等整数类型、浮点类型、枚举、void、指针、数组、结构等等。然后只要碰到一串 01010110010 之类的数据,编译器都可以正确的把它解析出来。但是在C++中出现继承、派生这些概念后,编译器无法解释。为了和旧的C数据相兼容,因此C++提出了POD数据结构概念。
POD 是 Plain Old Data 的缩写,是 C++ 定义的一类数据结构概念,比如 int、float 等都是 POD 类型的。Plain 代表它是一个普通类型,Old 代表它是旧的,与几十年前的 C 语言兼容,那么就意味着可以使用 memcpy() 这种最原始的函数进行操作。两个系统进行交换数据,如果没有办法对数据进行语义检查和解释,那就只能以非常底层的数据形式进行交互,而拥有 POD 特征的类或者结构体通过二进制拷贝后依然能保持数据结构不变。也就是说,能用 C 的 memcpy() 等函数进行操作的类、结构体就是 POD 类型的数据。
基本上谈到这个概念,一般都是说某某 class、struct、union 是不是 POD 类型的。
是不是 POD 类型的,可以用 is_pod::value 来判断。那什么样的类、结构体是拥有 POD 特性的呢?要求有两个:一个是它必须很平凡、很普通;另一个是布局有序。
满足下面的2个条件即可说是平凡特征的数据类型:
enable_shared_from_this 是一个模板类
1 | template< class T > class enable_shared_from_this; |
std::enable_shared_from_this
能让一个对象(假设名为 t,且被一个 std::shared_ptr 对象 pt 管理)安全地生成其他额外的 std::shared_ptr 实例,他们与 pt 共享对象 t 的所有权
若一个类 T 继承 std::enable_shared_from_this<T>
,则会为该类提供成员函数:shared_from_this。当 T 类型对象 t 被一个名为 pt 的 std::shared_ptr<T>
类对象管理时,调用 T::shared_from_this
成员函数,将会返回一个新的 std::shared_ptr<T>
对象,他与 pt 共享 t 的所有权。