Pymongo。
MongoDB 是一个面向文档的数据库系统。使用 C++编写,不支持 SQL,但有自己功能强大 的查询语法。
MongoDB 中包括了一个可以显示数据库中每个操作性能特点的数据库分析器。通过这个分析器 你可以找到比预期慢的查询(或写操作);利用这一信息,比如,可以确定是否需要添加索引。
db._adminCommand(“connPoolStats”);
列表对象的编码可以是 ziplist 或者 linkedlist
ziplist 是一种压缩链表,它的好处是更能节省内存空间,因为它所存储的内容都是在连续的内存
区域当中的。当列表对象元素不大,每个元素也不大的时候,就采用 ziplist 存储。但当数据量过大 时就 ziplist 就不是那么好用了。因为为了保证他存储内容在内存中的连续性,插入的复杂度是 O(N),即每次插入都会重新进行 realloc。如下图所示,对象结构中 ptr 所指向的就是一个 ziplist。整个 ziplist 只需要 malloc 一次,它们在内存中是一块连续的区域。
解决数据库高并发的常见方案:
缓存式的 Web 应用程序架构:
在 Web 层和 DB(数据库)层之间加一层 cache 层,主要目的:减少数据库读取负担,提高数 据读取速度。cache 存取的媒介是内存,可以考虑采用分布式的 cache 层,这样更容易破除内存容量 的限制,同时增加了灵活性。
增加 Redis 缓存数据库:
参考博客:https://www.cnblogs.com/Leo_wl/p/5791327.html
增加数据库索引
页面静态化:
效率最高、消耗最小的就是纯静态化的 html 页面,所以我们尽可能使我们的网站上的页面采 用静态页面来实现,这个最简单的方法其实也是最有效的方法。用户可以直接获取页面,不用像 MVC 结构走那么多流程,比较适用于页面信息大量被前台程序调用,但是更新频率很小的情况。
使用存储过程:
处理一次请求需要多次访问数据库的操作,可以把操作整合到储存过程,这样只要一次数据
库访问就可以了。
MySQL 主从读写分离:
当数据库的写压力增加,cache 层(如 Memcached)只能缓解数据库的读取压力。读写集 中在一个数据库上让数据库不堪重负。使用主从复制技术(master-slave 模式)来达到读写分离,以 提高读写性能和读库的可扩展性。读写分离就是只在主服务器上写,只在从服务器上读,基本原理是 让主数据库处理事务性查询,而从数据库处理 select 查询,数据库复制被用于把事务性查询(增删改) 导致的改变更新同步到集群中的从数据库。
MySQL 读写分离提升系统性能:
1、主从只负责各自的读和写,极大程度缓解 X 锁和 S 锁争用。
2、slave 可以配置 MyISAM 引擎,提升查询性能以及节约系统开销。
3、master 直接写是并发的,slave 通过主库发送来的 binlog 恢复数据是异步的。 4、slave 可以单独设置一些参数来提升其读的性能。
5、增加冗余,提高可用性。
实现主从分离可以使用 MySQL 中间件如:Atlas
分表分库:
在 cache 层的高速缓存,MySQL 的主从复制,读写分离的基础上,这时 MySQL 主库的写 压力开始出现瓶颈,而数据量的持续猛增,由于 MyISAM 使用表锁,在高并发下会出现严重的锁问 题,大量的高并发 MySQL 应用开始使用 InnoDB 引擎代替 MyISAM。采用 Master-Slave 复制模式 的 MySQL 架构,只能对数据库的读进行扩展,而对数据的写操作还是集中在 Master 上。这时需要 对数据库的吞吐能力进一步地扩展,以满足高并发访问与海量数据存储的需求。
对于访问极为频繁且数据量巨大的单表来说,首先要做的是减少单表的记录条数,以便减少 数据查询所需的时间,提高数据库的吞吐,这就是所谓的分表【水平拆分】。在分表之前,首先需要 选择适当的分表策略(尽量避免分出来的多表关联查询),使得数据能够较为均衡地分布到多张表中, 并且不影响正常的查询。
分表能够解决单表数据量过大带来的查询效率下降的问题,但是却无法给数据库的并发处理 能力带来质的提升。面对高并发的读写访问,当数据库 master 服务器无法承载写操作压力时,不管 如何扩展 Slave 服务器都是没有意义的,对数据库进行拆分,从而提高数据库写入能力,即分库【垂直拆分】。
负载均衡集群:
将大量的并发请求分担到多个处理节点。由于单个处理节点的故障不影响整个服务,负载均
衡集群同时也实现了高可用性。
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。
需要结合真实案例去分析,这里给大家推荐一个不错的博客。
https://blog.csdn.net/yfkiss/article/details/38944179
String(字符串),Hash(哈希),List(列表),Set(集合)及 zset(sortedset:有序集合)。、
方案一:可以使用独占锁的方式,类似操作系统的 mutex 机制,不过实现相对复杂,成本较高。
https://blog.csdn.net/black_ox/article/details/48972085
方案二:使用乐观锁的方式进行解决(成本较低,非阻塞,性能较高)
如何用乐观锁方式进行解决?
本质上是假设不会进行冲突,使用 redis 的命令 watch 进行构造条件
a)MySQL Replication 是 MySQL 官方提供的主从同步方案,用于将一个 MySQL 实例的数据,同步到另一个实例中。Replication 为保证 数据安全做了重要的保证,也是现在运用 最广的 MySQL 容灾方案。Replication 用两个或以上的实例搭建了 MySQL 主从复制集群, 提供 单点写入,多点读取的服务,实现了读的 scale out。
b)Sentinel 是 Redis 官方为集群提供的高可用解决方案。在实际 项目中可以使用 sentinel 去做 Redis 自动故障转移,减少人工介入的工作量。另外 sentinel 也给客户端提供了监控 消息的通知,这样客户端就可根据消息类型去判断服务器的状态,去做对应的适配操作。
c)下面是 Sentinel 主要功能列表:
Monitoring:Sentinel 持续检查集群中的 master、slave 状态,判断是否存活。
Notification:在发现某个 Redis 实例死的情况下,Sentinel 能通过 API 通知系统管理员或其 他程序脚本。
Automatic failover:如果一个 master 挂掉后,sentinel 立马启动故障转移,把某个 slave 提 升为 master。其他的 slave 重新配置指向新 master。
Configuration provider:对于客户端来说 sentinel 通知是有效可信赖的。客户端会连接 sentinel 去请求当前 master 的地址,一旦发生故障 sentinel 会提供新地址给客户端。
MongoDB 和 Redis 都是 NoSQL,采用结构型数据存储。二者在使用场景中,存在一定的区别, 这也主要由于二者在内存映射的处理过程,持久化的处理方法不同。MongoDB 建议集群部署,更多 的考虑到集群方案,Redis 更偏重于进程顺序写入,虽然支持集群,也仅限于主-从模式。
Redis
优点:
a) 读写性能优异
b) 支持数据持久化,支持 AOF 和 RDB 两种持久化方式 c)支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
d) 数据结构丰富:数据结构丰富:支持 string、hash、set、sortedset、list 等数据结构。
缺点:
e) Redis 不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要
等待机器重启或者手动切换前端的 IP 才能恢复。
f) 主机宕机,宕机前有部分数据未能及时同步到从机,切换 IP 后还会引入数据不一致的问题,
降低了系统的可用性。
g) Redis 的主从复制采用全量复制,复制过程中主机会 fork 出一个子进程对内存做一份快照, 并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内 存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入 集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一 次全量的数据复制,这对实际的系统运营造成了不小的麻烦。
h) Redis 较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题, 运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。
MongoDB
优点:
a)弱一致性(最终一致),更能保证用户的访问速度
b)文档结构的存储方式,能够更便捷的获取数
c)内置 GridFS,高效存储二进制大对象 (比如照片和视频)
d)支持复制集、主备、互为主备、自动分片等特性
e)动态查询
f)全索引支持,扩展到内部对象和内嵌数组
缺点:
a)不支持事务
b)MongoDB 占用空间过大 c)维护工具不够成熟
Redis支持五种数据类型:string(字符串)、hash(哈希)、list(列表)、set(集合)及 zset(sorted set:有序集合)。
一、 String
1.String 是 Redis 最为常用的一种数据类型,String 的数据结构为 key/value 类型,String 可以 包含任何数据。
2.常用命令: set,get,decr,incr,mget 等。
二、 Hash
1.Hash 类型可以看成是一个 key/value 都是 String 的 Map 容器。 2.常用命令:hget,hset,hgetall 等。
三、 List
1.List 用于存储一个有序的字符串列表,常用的操作是向队列两 端添加元素或者获得列表的某一片 段。
2.常用命令:lpush,rpush,lpop,rpop,lrange 等
四、 Set
1.Set 可以理解为一组无序的字符集合,Set 中相同的元素是不会重复出现的,相同的元素只保留 一个。
2.常用命令:sadd,spop,smembers,sunion 等。
五、 Sorted Set(有序集合) 1.有序集合是在集合的基础上为每一个元素关联一个分数,Redis 通过分数为集合中的成员进行排 序。
2.常用命令:zadd,zrange,zrem,zcard 等。
一、 Redis 事务允许一组命令在单一步骤中执行。事务有两个属性,说明如下:
a) 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的 过程中,不会被其他客户端发送来的命令请求所打断。
b) Redis 事务是原子的。原子意味着要么所有的命令都执行,要么都不执行;
二、 一个事务从开始到执行会经历以下三个阶段:
a)开始事务 b)命令入队 c)执行事务
1.取最新 N 个数据的操作
2.排行榜应用,取 TOP N 操作
3.需要精准设定过期时间的应用
4.计数器应用
5.uniq 操作,获取某段时间所有数据排重值
6.Pub/Sub 构建实时消息系统
7.构建队列系统
8.缓存
1.默认端口:6379
2.默认过期时间:可以说永不过期,一般情况下,当配置中开启 了超出最大内存限制就写磁盘的话, 那么没有设置过期时间的 key 可能会被写到磁盘上。假如没设置,那么 REDIS 将使用 LRU 机制,将 内存中的老数据删除,并写入新数据。
3.Value 最多可以容纳的数据长度是:512M。
Redis 一个实例下有 16 个。