什么是NoSQL
- Not Only SQL
NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。
-
NoSQL的特点:
1)解耦,没有太大的关联。
2)方便扩展(数据之间没有关系,很好扩展!)
3)大数据量高性能(Redis一秒写8万次,读取11万,NoSQL的缓存记录级,是一种细粒度的缓存,性能会比较高)
4)数据类型是多样型的(不需要事先设计数据库,随取随用)
4、传统RDBMS和NoSQL -
传统的关系型数据库(MySQL、Oracle等)RDBMBS:
1)传统的RDBMS
- 结构化组织
- SQL
- 数据和关系都存在单独的表中操作,数据定义语言
- 严格的一致性
- 基础的事务
- 关系型数据库遵循ACID规则
- …
2)NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库 - 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
- …
- 关系型数据库遵循ACID规则
特性 | 解释 | |
---|---|---|
A (Atomicity) 原子性 | 原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。 | 比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。 |
C (Consistency) 一致性 | 一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。 | 例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。 |
I (Isolation) 独立性 | 所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。 | 比如现在有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。 |
D (Durability) 持久性 | 持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。 |
NoSQL的四大类型
类型 | 部分代表 | 特点 |
---|---|---|
列存储数据库 | Hbase Cassandra Hypertable | 顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。 |
文档存储数据库 | MongoDB CouchDB | 文档存储一般用类似bson和json的格式存储,存储的内容是文档型的。这样也就有机会对某些字段建立索引,实现关系数据库的某些功能。 |
key-value存储数据库 | Tokyo Cabinet / Tyrant Berkeley DB MemcacheDB Redis | 可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能) |
图关系存储数据库 | Neo4J FlockDB | 图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。 |
Redis
-
Redis与NoSQL的关系:
redis是key-value存储的NoSQL,主要用来做缓存。 -
Redis简介:
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value数据库。
Redis 使用 C 编写并且能在绝大Linux系统上运行。
- redis官网:https://redis.io/
- redis中文网:http://www.redis.cn/
安装
Windows安装
- 开启redis服务端:
- 开启客服端
Linux安装
- 推荐使用Linux部署,我们可以在官网上找到下面一段话。
Redis is written in ANSI C and works in most POSIX systems like Linux, *BSD, OS X without external dependencies. Linux and OS X are the two operating systems where Redis is developed and tested the most, and we recommend using Linux for deploying. Redis may work in Solaris-derived systems like SmartOS, but the support is best effort. There is no official support for Windows builds.
Redis 使用 ANSI C 编写并且能在绝大Linux系统上运行,基于BSD协议,对OS X没有外部依赖. 我们支持Linux 和 OS X两种系统的开发和测试,我们推荐使用Linux部署. Redis 可以像SmartOS一样运行在Solaris系统中, 但是我们会最大力度的支持它. 官方不支持Windos版本的Redis,但微软开发和维护着支持win-64 的Redis版本.
- 下载安装包:在官网上下载
- 把安装包放到Windows和虚拟机的共享文件目录下
- 解压
[root@localhost mnt]# cd /mnt/hgfs/
[root@localhost hgfs]# ls
arm-linux-gcc.tgz new 1.sh project.c signal_fun.c
jdk-8u20-linux-x64.rpm new1.sh redis-6.0.9.tar.gz text2.sh
jdk-8u20-linux-x64.tar.gz process.c signal_fun text.sh
[root@localhost hgfs]# mv redis-6.0.9.tar.gz /mnt/opt
[root@localhost hgfs]# cd /mnt/opt
[root@localhost opt]# ls
redis-6.0.9.tar.gz
[root@localhost opt]# tar -zxvf redis-6.0.9.tar.gz
解压成功:
- 进入解压后的redis文件:redis.conf 为redis的配置文件
[root@localhost opt]# ls
redis-6.0.9 redis-6.0.9.tar.gz
[root@localhost opt]# cd redis-6.0.9
[root@localhost redis-6.0.9]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-moduleapi src utils
BUGS deps MANIFESTO runtest runtest-sentinel tests
CONTRIBUTING INSTALL README.md runtest-cluster sentinel.conf TLS.md
- 配置号基本环境:
yum install gcc-c++
- 执行
make
命令:
make命令执行时遇到了问题:
解决方案:因为gcc版本过低,需要更新
[root@localhost redis-6.0.9]# yum -y install centos-release-scl
[root@localhost redis-6.0.9]# yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils
[root@localhost redis-6.0.9]# scl enable devtoolset-9 bash
[root@localhost redis-6.0.9]# gcc -v
重新执行make命令,成功:
再次make命令一下,你发现会快很多:
[root@localhost redis-6.0.9]# make
cd src && make all
make[1]: Entering directory `/mnt/opt/redis-6.0.9/src'
Hint: It's a good idea to run 'make test' ;)
make[1]: Leaving directory `/mnt/opt/redis-6.0.9/src'
-
检查一下安装:
make install
-
redis默认安装的路径:
/usr/local/bin
[root@localhost redis-6.0.9]# cd /usr/local/bin
[root@localhost bin]# ls
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
- 可以把第5点的redis的config文件备份一下:
[root@localhost bin]# mkdir config
[root@localhost bin]# cp /mnt/opt/redis-6.0.9/redis.conf config
[root@localhost bin]# cd /usr/local/bin/config/
[root@localhost config]# ls
redis.conf
- 修改配置文件,redis默认不是后台启动,我们设置为后台启动:
vim redis.conf
把下面no修改成yes即可
- 启动redis服务,并测试连接:
[root@localhost config]# cd ..
[root@localhost bin]# pwd
/usr/local/bin
[root@localhost bin]# redis-server config/redis.conf
[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name gaolang
OK
127.0.0.1:6379> get name
"gaolang"
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379>
(1)redis-server config/redis.conf
指定的配置文件
(2)redis-cli -p 6379
指定端口号连接
(3)keys *
返回所有的key
- 查看redis的进程
[root@localhost bin]# ps -ef|grep redis
root 17629 1 0 Nov16 ? 00:00:00 redis-server 127.0.0.1:6379
root 17709 16519 0 Nov16 pts/0 00:00:00 redis-cli -p 6379
root 18231 18171 0 00:05 pts/1 00:00:00 grep --color=auto redis
- 关闭redis服务:
使用shutdown
命令
127.0.0.1:6379> shutdown
not connected> exit
[root@localhost bin]#