从零开始学架构 03-nosql&redis缓存【笔记】

nosql

不仅仅是sql,是关系型数据库的补充,一般配合关系型数据库使用

关系数据库存在如下缺点
  • 关系数据库存储的是行记录,无法存储数据结构
  • 关系数据库的结构(schema)扩展很不方便
  • 关系数据库大数据场景下IO较高
  • 关系数据库的全文搜索功能比较弱
常见数据库

k-v存储,redis
文档数据库,mongodb
列式数据库,hbase
全文搜索引擎,elasticsearch

redis

redis不支持原则性,不支持回滚操作,也不存在多事物的问题,因为redis是单进程单线程的工作模式

  • redis持久化的方式:rdb、aof
  • redis单进程单线程、memcached单进程多线程
    采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络IO的时间消耗)
  • 单线程处理的缺点:无法发挥多核CPU性能,不过可以通过在单机开多个redis实例来完善
    什么是多路I/O复用(Epoll)?
    • 网络IO都是通过Socket实现
    • 默认情况下,网络IO是阻塞模式
    • 为了提升服务器线程处理效率,有以下三种思路
    1. 非阻塞【忙轮询】:采用死循环方式轮询每一个流,如果有IO事件就处理,这样可以使得一个线程可以处理多个流,但是效率不高,容易导致CPU空转
    2. Select代理(无差别轮询):可以观察多个流的IO事件,如果所有流都没有IO事件,则将线程进入阻塞状态,如果有一个或多个发生了IO事件,则唤醒线程去处理。但是还是得遍历所有的流,才能找出哪些流需要处理,如果流个数为N,则时间复杂度为O(N)
    3. Epoll代理:Select代理有一个缺点,线程在被唤醒后轮询所有的Stream,还是存在无效操作。Epoll会哪个流发生了怎样的I/O事件通知处理线程,因此对这些流的操作都是有意义的,复杂度降低到了O(1)
总结

nosql的用途,每类均对应了一种相关的解决方案
对于单线程是如何实现并发的,通过多路I/O复用(Epoll)解决。

你可能感兴趣的:(从零开始学架构【书】)