一、NoSQL数据库介绍

1. 技术发展

技术的分类

  • 解决功能性的问题:Java、Jsp、RDBMS、Tomcat、HTML、Linux、JDBC、SVN
  • 解决扩展性的问题:Struts、Spring、SpringMVC、Hibernate、Mybatis
  • 解决性能的问题:NoSQL、Java线程、Hadoop、Nginx、MQ、ElasticSearch

1. Web1.0时代

Web1.0的时代,数据访问量很有限,用一夫当关的高性能的单点服务器可以解决大部分问题
image.png

2. Web2.0时代

随着Web2.0的时代的到来,用户访问量大幅度提升,同时产生了大量的用户数据。加上后来的智能移动设备的普及,所有的互联网平台都面临了巨大的性能挑战
image.png

3. 解决CPU及内存压力

image.png

4. 解决IO压力

image.png

2. NoSQL数据库

1. NoSQL数据库概述

NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库
NoSQL 不依赖业务逻辑方式存储,而以简单的key-value模式存储。因此大大的增加了数据库的扩展能力。

  • 不遵循SQL标准
  • 不支持ACID
  • 远超于SQL的性能

2. NoSQL适用场景

  • 对数据高并发的读写
  • 海量数据的读写
  • 对数据高可扩展性的

3. NoSQL不适用场景

  • 需要事务支持
  • 基于sql的结构化查询存储,处理复杂的关系,需要即席查询

用不着sql的和用了sql也不行的情况,请考虑用NoSql

3. 常用的NoSQL数据库

1. Memcache

image.png

  • 很早出现的NoSql数据库
  • 数据都在内存中,一般不持久化
  • 支持简单的key-value模式,支持类型单一
  • 一般是作为缓存数据库辅助持久化的数据库

2. Redis

image.png

  • 几乎覆盖了Memcached的绝大部分功能
  • 数据都在内存中,支持持久化,主要用作备份恢复
  • 除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。
  • 一般是作为缓存数据库辅助持久化的数据库

3. MongoDB

image.png

  • 高性能、开源、模式自由(schema free)的文档型数据库
  • 数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘
  • 虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能
  • 支持二进制数据及大型对象
  • 可以根据数据的特点替代RDBMS ,成为独立的数据库。或者配合RDBMS,存储特定的数据。

3. 行式存储数据库(大数据时代)

1. 行式数据库

image.png

2. 列式数据库

image.png

3. 常用的海量型数据库

1. Hbase

image.png
HBase是Hadoop项目中的数据库。它用于需要对大量的数据进行随机、实时的读写操作的场景中。
HBase的目标就是处理数据量非常庞大的表,可以用普通的计算机处理超过10亿行数据,还可处理有数百万元素的数据表。

2. Cassandra[kəˈsændrə]

image.png
Apache Cassandra是一款免费的开源NoSQL数据库,其设计目的在于管理由大量商用服务器构建起来的庞大集群上的海量数据集(数据量通常达到PB级别)。在众多显著特性当中,Cassandra最为卓越的长处是对写入及读取操作进行规模调整,而且其不强调主集群的设计思路能够以相对直观的方式简化各集群的创建与扩展流程。

4. 图关系型数据库

image.png
主要应用:社会关系,公共交通网络,地图及网络拓谱(n*(n-1)/2)
image.png

5. DB-Engines 数据库排名

http://db-engines.com/en/ranking
image.png

二、Redis概述安装

  • Redis是一个开源的key-value存储系统。
  • 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set —有序集合)和hash(哈希类型)。
  • 这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
  • 在此基础上,Redis支持各种不同方式的排序。
  • 与memcached一样,为了保证效率,数据都是缓存在内存中。
  • 区别的是Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件。
  • 并且在此基础上实现了master-slave(主从)同步。

1. 应用场景

1. 配合关系型数据库做高速缓存

  • 高频次,热门访问的数据,降低数据库IO
  • 分布式架构,做session共享

    image.png

    2. 多样的数据结构存储持久化数据

    image.png

2. Redis安装

Redis官方网站 Redis中文官方网站
http://redis.io http://redis.cn/

image.png
image.png

1. 安装版本

  • 6.2.1 for Linux(redis-6.2.1.tar.gz)
  • 不用考虑在windows环境下对Redis的支持

image.png

2. 安装步骤

1. 准备工作:下载安装最新版的gcc编译器

安装C语言的运行环境

  1. yum install centos-release-scl scl-utils-build
  2. yum install -y devtoolset-8-toolchain
  3. scl enable devtoolset-8 bash

测试 gcc版本

gcc --version

image.png

2. 下载redis-6.2.1.tar.gz放/opt目录

3. 解压命令:tar -zxvf redis-6.2.1.tar.gz

4. 解压完成后进入目录:cd redis-6.2.1

5. 在redis-6.2.1目录下再次执行make命令(只是编译好)

如果没有准备好C语言编译环境,make 会报错—Jemalloc/jemalloc.h:没有那个文件
image.png
解决方案:运行make distclean
image.png
在redis-6.2.1目录下再次执行make命令(只是编译好)
image.png

6. 跳过make test 继续执行: make install

image.png

3. 安装目录:/usr/local/bin

查看默认安装路径
redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump:修复有问题的dump.rdb文件
redis-sentinel:Redis集群使用
redis-server:Redis服务器启动命令
redis-cli:客户端,操作入口

4. 前台启动(不推荐)

前台启动,命令行窗口不能关闭,否则服务器停止
image.png

5. 后台启动

1. 备份 redis.conf

拷贝一份redis.conf到其他目录

cp /opt/redis-3.2.5/redis.conf /myredis

2. 后台启动设置daemonize no改成yes

修改redis.conf(128行)文件将里面的daemonize no 改成 yes,让服务在后台启动

3. Redis启动

redis-server/myredis/redis.conf
image.png

4. 用客户端访问:redis-cli

image.png

5. 多个端口可以:redis-cli -p6379

6. 测试验证: ping

image.png

7. Redis关闭

单实例关闭:_redis-cli shutdown_
image.png

也可以进入终端后再关闭
image.png
多实例关闭,指定端口关闭:_redis-cli -p 6379 shutdown_

3. Redis介绍相关知识

默认16个数据库,类似数组下标从0开始,初始默认使用0号库
使用命令 _select <dbid>_ 来切换数据库
image.png
统一密码管理,所有库同样密码

  • _dbsize_ 查看当前数据库的key的数量
  • _flushdb_ 清空当前库
  • _flushall_ 通杀全部库

Redis是单线程+多路IO复用技术
多路复用是指使用一个线程来检查多个文件描述符(Socket)的就绪状态,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)

串行 vs 多线程+锁(memcached) vs 单线程+多路IO复用(Redis)(与Memcache三点不同: 支持多数据类型,支持持久化,单线程+多路IO复用)

4. Docker使用Redis

1. 获取镜像

docker pull redis

也可以指定版本号,不加版本号默认获取最新版本,也可以使用 docker search redis 查看镜像来源

docker pull redis:4.0.1
[root@localhost docker]# docker search redis
NAME                             DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
redis                            Redis is an open source key-value store that…   7486                [OK]                
bitnami/redis                    Bitnami Redis Docker Image                      130                                     [OK]
sameersbn/redis                                                                  78                                      [OK]
grokzen/redis-cluster            Redis cluster 3.0, 3.2, 4.0 & 5.0               62                                      
rediscommander/redis-commander   Alpine image for redis-commander - Redis man…   31                                      [OK]
...

2. 查看本地镜像

[root@localhost docker]# docker images | grep redis
redis                              latest              de25a81a5a0b        2 weeks ago         98.2MB
hub.c.163.com/library/redis        latest              d4f259423416        2 years ago         106MB

3. 修改配置文件

1. 创建配置文件目录存放redis.conf,文件从官网下载

2. 创建文件夹,新建配置文件贴入从官网下载的配置文件并修改

mkdir /usr/local/docker/redis
vi /usr/local/docker/redis/redis.conf

3. 修改启动默认配置(从上至下依次)

bind 127.0.0.1 #注释掉这部分,这是限制redis只能本地访问
protected-mode no #默认yes,开启保护模式,限制为本地访问
daemonize no#默认no,改为yes意为以守护进程方式启动,可后台运行,除非kill进程,改为yes会使配置文件方式启动redis失败
databases 16 #数据库个数(可选),我修改了这个只是查看是否生效。。
dir  ./ #输入本地redis数据库存放文件夹(可选)
appendonly yes #redis持久化(可选)

4. docker启动redis

1. 快速启动

docker run -itd --name redis-test -p 6379:6379 redis

参数说明:

  • _-p 6379:6379_:映射容器服务的 6379 端口到宿主机的 6379 端口。外部可以直接通过宿主机ip:6379 访问到 Redis 的服务。

2. 配置文件启动

docker run -p 6379:6379 --name myredis -v /usr/local/docker/redis/redis.conf:/etc/redis/redis.conf -v /usr/local/docker/redis/data:/data -d redis redis-server /etc/redis/redis.conf --appendonly yes

参数解释说明:

  • _-p 6379:6379_ 端口映射:前表示主机部分,:后表示容器部分。
  • _--name myredis_ 指定该容器名称,查看和进行操作都比较方便。
  • _-v_ 挂载目录,重要: 配置文件映射,docker镜像redis 默认无配置文件。
  • _-d redis_ 表示后台启动redis
  • _redis-server /etc/redis/redis.conf_ 以配置文件启动redis,加载容器内的conf文件,最终找到的是挂载的目录/usr/local/docker/redis/redis.conf,重要: docker 镜像reids 默认 无配置文件启动
  • _--appendonly yes_ 开启redis 持久化

5. 查看是否运行成功

[root@localhost docker]# docker ps -a | grep redis
602659d1b445        redis                              "docker-entrypoint.s…"   54 minutes ago      Up 54 minutes                  0.0.0.0:6379->6379/tcp   modest_ramanujan
65bb6e6cab9f        redis                              "docker-entrypoint.s…"   About an hour a

三、Redis的线程模型

image.png

1. 为什么Redis的读写性能这么高呢?

1、Redis基于内存操作:
绝大部分的请求为纯粹的内存操作,而且使用hash结构存储数据,查找和操作的时间复杂度均为O(1)。
2、Redis数据结构简单:
redis对数据的操作还是比较简单的,而且redis的数据结构是专门设计的。
3、单线程-IO多路复用模型:
单线程的设计省去了很多的麻烦:比如上下文切换、资源竞争、CPU切换消耗以及各种锁操作等等问题,而IO多路复用模型的使用更让Redis提升了效率。
image.png

2. IO多路复用模型

  • IO即为网络I/O,多路即为多个TCP连接,复用即为共用一个线程或者进程,模型最大的优势是系统开销小,不必创建也不必维护过多的线程或进程
  • IO多路复用是经典的Reactor设计模式,有时也称为异步阻塞IO(异步指socket为non-blocking,堵塞指select堵塞),为常见的四种IO模型之一,其他三种分别是:同步堵塞IO、同步非堵塞IO、异步非堵塞IO
  • IO多路复用的核心是可以同时处理多个连接请求,为此使用了两个系统调用,分别是:select/poll/epoll

image.png