NoSQL数据库简识
引入
随着web时代的到来,PC端和移动端的用户越来越多,之前的单体服务器已经承载不住这么大量的访问请求操作,如今就演化成了下图这种,通过ngnix负载均衡,将请求以分摊到多个不同的服务器上,来缓解服务器的压力。
但是以上这种分布式集群的操作方式,会引入一个session存放的问题:
如果用户第一次登陆操作请求打到了服务器1上,在服务器1中就会存储该用户的session信息;但如果用户第二次登陆,把操作请求打到了服务器2上,而服务器2上没有该用户的session信息,也就没有办法直接登陆。
为了解决上述的问题,有以下几种解决方法:
1、存储到客户端的cookie中:
这种解决方法存在安全风险
2、在不同的服务器中都复制一份session:
这种解决方法会造成session数据冗余,浪费很多空间
3、就是引入NoSQL数据库:
客户端每次进行登陆操作,都会将session信息存入NoSQL数据库中,这样在第二次进行访问时,直接从NoSQL数据库中进行判断有无session信息就可以了
它不需要IO操作,可以把信息直接存储到内存中,访问速度很快
还有一些比如在数据库中,需要被频繁访问的数据,也可以存储到NoSQL数据库中,它可以作为一个缓存数据库,来减少IO的读操作。
NoSQL就是为了减轻CPU、内存和IO压力而产生的数据库,Redis就是典型的NoSQL数据库
概述及应用场景
NoSQL=Not Only SQL,意思是“不仅仅是SQL”,泛指“非关系型数据库”;
它不依赖于业务逻辑方式进行存储,而是以简单的key-value模式存储,大大的增加了数据库扩展的能力。
Redis有以下几个特性:
- 不遵循SQL标准
- 不支持ACID
- 远超于SQL的性能
Redis有以下几个适用场景:
- 对数据高并发的读写
- 海量数据的读写
- 对数据高扩展性的
Redis不适用的场景:
- 需要事务支持
- 基于SQL的结构化查询存储
Redis概述
介绍
- Redis是一个开源的key-value存储系统
- Redis支持存储多种数据类型,包括String(字符串),list(链表),set(集合),zset(有序集合)和hash(哈希类型)
- 这些数据都支持push/pop、add/remove、取交集并集和差集的丰富操作,而且这些操作都是原子性的。
- 在此基础上,Redis支持各种不同方式的排序
- 为了保证效率,数据缓存到内存中
- Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件
- 并且在此基础上实现了master-slave(主从)同步
- 默认适用6379端口
应用场景
配合关系型数据库做高速缓存
- 高频次,热门访问的数据,降低数据库IO
- 分布式架构,做session共享
多样的数据结构存储持久化数据
相关技术
Redis使用的是单线程+多路IO复用技术:
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)
该技术类似于黄牛买票的实例:
用户A、B、C都在北京,分别想买从北京到上海、深圳和广州的票,因为票难抢,所以他们请黄牛来帮买,自己可以去看其他的事情,黄牛就是单线程的等待票,有三个目的地其中一个票的时候,就会买下来。
Linux系统安装Redis
参考文档Linux环境安装redis