什么是NoSQL

(一)、传统的关系型数据库

代表:mysql,Oracle,sqlserver

首先了解一下 什么是关系型数据库?

关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。

优点

  1. 易于维护:都是使用表结构,格式一致;
  2. 使用方便:SQL语言通用,可用于复杂查询;
  3. 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。

缺点

  • 读写性能比较差,尤其是海量数据的高效率读写;
  • 固定的表结构,灵活度稍欠;
  • 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。

(二)非关系型数据库

代表:redis,hbase,MongoDB

什么非关系型数据库呢?

非关系型数据库严格上不是一加粗样式种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等

优点

  • 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等
  • 使用灵活,应用场景广泛,而关系型数据库则只支持基础类型
  • 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘; 高扩展性
  • 成本低:nosql数据库部署简单,基本都是开源软件

缺点:

  • 不提供sql支持,学习和使用成本较高;
  • 无事务处理;
  • 数据结构相对复杂,复杂查询方面稍欠。

(三)大数据时代的3V和3高

大数据时代的3V:主要是描述问题的

  1. 海量Volume
  2. 多样Variety
  3. 实时Velocity

大数据时代的3高:主要是对程序的要求

  1. 高并发
  2. 高可扩(随时水平拆分)
  3. 高性能

(四)非关系型数据库的分类和比较:

  • 文档型
  • key-value型
  • 列式数据库
  • 图形数据库

(五)MongoDB

基于分布式文件存储的数据库,C++编写,主要用来存储大量的文档
MongoDB是一个介于关系型数据库和非关系型数据库的中间产品!MongoDB是非关系型数据库中功能最丰富的,最像关系型数据库的


Redis概述

1、Redis

远程字典服务,C语言编写,开源,持久化,key-value数据库,最热门的NoSQL数据库,读的速度:11次/秒;写的速度:8万/秒

2、Redis能干嘛?

内存存储,持久化,内存是断电即失,持久化很重要
效率高,发布订阅系统,地图信息分析,支持集群、事务

3、Redis的存储数据结构

nosql数据库的技术特色和技术特点有哪些 简述nosql数据库的优缺点_关系型数据库


4、Redis官方介绍

Redis是一种开放源代码(BSD许可),在内存数据结构存储中,用作数据库、缓存和消息代理。它支持数据结构,例如字符串、哈希、列表、集合、带范围查询的排序集、位图、超日志、具有半径查询的地理空间索引和流。Redis具有内置复制、Lua脚本、LRU逐出、事务和不同级别的磁盘持久性,并通过Redis Sentinel和Redis群集自动分区提供高可用性


Redis基础命令

1、redis有16个默认数据库,默认连接第一个数据库

2、启动redis服务

[root@localhost yconfig]# redis-server redis.conf  #启动redis服务 (启动Redis要在redis配置文件所在的位置) 
[root@localhost bin]# pwd  #查看当前所在位置
/usr/local/bin
[root@localhost bin]# redis-cli -p 6379   #启动redis客户端
127.0.0.1:6379>

3、退出redis

127.0.0.1:6379> shutdown   #退出redis服务
not connected> exit        #退出redis
[root@localhost ~]# ps -ef|grep redis    #查看redis进程是否存在
root      19349  18706  0 16:02 pts/2    00:00:00 grep --color=auto redis
[root@localhost ~]#

4、切换数据库

127.0.0.1:6379> select 3   #切换数据库
OK

5、查看当前数据库大小

127.0.0.1:6379[3]> DBSIZE    #查看数据库大小
(integer) 0

6、设置一个key值

127.0.0.1:6379[3]> set name yuanhaodong    #设置一个name
OK

7、查看数据库中所有的key

127.0.0.1:6379[3]> keys *     #查看当前库中所有的key
1) "name"

8、清空当前数据库

127.0.0.1:6379[3]> flushdb   #清空当前数据库
OK
127.0.0.1:6379[3]> DBSIZE   #再次查看数据库大小
(integer) 0

9、清除所有数据库

127.0.0.1:6379> flushall
OK

10、判断某个列值是否存在

127.0.0.1:6379> exists name  #判断某个列值是否存在
(integer) 1

11、设置列值剩余时间

127.0.0.1:6379> expire name 10   #设置列值过期时间
(integer) 1

12、查看key的剩余时间

127.0.0.1:6379> ttl name    #查看key的剩余时间
(integer) 1

13、移除当前的key

127.0.0.1:6379> move name 1   #移除当前的key 
(integer) 0

14、查看key的类型

127.0.0.1:6379> type name   #查看key的类型
string

15、检测redis登录密码

127.0.0.1:6379> config get requirepass
1) "requirepass"
2) ""     #密码为空
127.0.0.1:6379>

16、设置密码

127.0.0.1:6379> config set requirepass 123456   #设置密码
OK
127.0.0.1:6379> auth 123456    #验证密码
OK
127.0.0.1:6379> config get requirepass   #获取密码
1) "requirepass"
2) "123456"
127.0.0.1:6379>

16、Redis是单线程的

redis是单线程的,redis是基于内存操作,CPU不是redis的性能瓶颈,redis的瓶颈是根据机器的内存和网络带宽,可以使用单线程来实现

redis官方提供了数据为每秒100000+的QPS,完全不比key-value的Memecache差

17、为什么redis是单线程的速度还那么快?

redis的数据全部存放在内存中,单线程操作效率高,多线程存在CPU上下文切换的问题,每次切换都会耗时,对于内存来说,没有上下文切换就是高效率的,多次读写在一个CPU上,是最佳方案。