什么是NoSQL
(一)、传统的关系型数据库
代表:mysql,Oracle,sqlserver
首先了解一下 什么是关系型数据库?
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
优点:
- 易于维护:都是使用表结构,格式一致;
- 使用方便:SQL语言通用,可用于复杂查询;
- 复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
- 读写性能比较差,尤其是海量数据的高效率读写;
- 固定的表结构,灵活度稍欠;
- 高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
(二)非关系型数据库
代表:redis,hbase,MongoDB
什么非关系型数据库呢?
非关系型数据库严格上不是一加粗样式种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等
优点:
- 格式灵活:存储数据的格式可以是key,value形式、文档形式、图片形式等等
- 使用灵活,应用场景广泛,而关系型数据库则只支持基础类型
- 速度快:nosql可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘; 高扩展性
- 成本低:nosql数据库部署简单,基本都是开源软件
缺点:
- 不提供sql支持,学习和使用成本较高;
- 无事务处理;
- 数据结构相对复杂,复杂查询方面稍欠。
(三)大数据时代的3V和3高
大数据时代的3V:主要是描述问题的
- 海量Volume
- 多样Variety
- 实时Velocity
大数据时代的3高:主要是对程序的要求
- 高并发
- 高可扩(随时水平拆分)
- 高性能
(四)非关系型数据库的分类和比较:
- 文档型
- key-value型
- 列式数据库
- 图形数据库
(五)MongoDB
基于分布式文件存储的数据库,C++编写,主要用来存储大量的文档
MongoDB是一个介于关系型数据库和非关系型数据库的中间产品!MongoDB是非关系型数据库中功能最丰富的,最像关系型数据库的
Redis概述
1、Redis
远程字典服务,C语言编写,开源,持久化,key-value数据库,最热门的NoSQL数据库,读的速度:11次/秒;写的速度:8万/秒
2、Redis能干嘛?
内存存储,持久化,内存是断电即失,持久化很重要
效率高,发布订阅系统,地图信息分析,支持集群、事务
3、Redis的存储数据结构
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上,是最佳方案。