1. 关于Nosql的介绍
- 不支持sql查询语言
- 相互之间没有复杂的关系结构,只是简单的K—V形式
- 没有统一的查询语句,每一个NOsql数据库都有自己独立的api和查询语言
- 种类十分繁多
Nosql的种类
MongoDB 文档型数据库,适合做文档管理系统(CMS)
Redis 内存数据库,数据结构服务器
Hbase 基于hadoop的分布式数据库,适合海量数据
Cassandra,hadoop中原生的数据库
2.Redis概念
Redis的官网很难进去,这里用的是Redis的一个中文网站,下面是关于redis的介绍http://www.redis.cn/
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
Redis的相关学习网站
入门教程:http://www.runoob.com/redis/redis-tutorial.html
命令搜索:http://redisdoc.com/
2.1 Redis的特性
- 数据持久性 Redis可以将内存的数据存入磁盘当中,进行永久性的操作,下次重启时,能够从磁盘中重新加载数据进行使用
- Redis不仅仅支持简单的K-V形式,还支持set,list,zset,hash等数据结构的存储
- Redis支持数据的备份,即主从架构模式的数据备份
2.2 Redis的优点
- 速度快:Redis的读取速度可以达到110000次/s,写入速度可以达到81000次/s
- 丰富的数据类型:Redis不仅仅支持简单的数据类,还支持set,list,zset,hash等数据结构的存储
- 原子操作:Redis不仅仅支持简单的原子操作,而且能够支持多个操作结合的原子操作
- 丰富的特性
- 持久化机制:Redis提供两种机制进行数据持久化操作
- RDB 方式:定期将内存数据 dump 到磁盘
- AOF(append only file)持久化机制:用记日志的方式记录每一条数据更新操作,一旦 出现灾难事件,可以通过日志重放来恢复整个数据库
2.3 RDB的持久化机制
RDB持久化是指在指定时间间隔内将内存中的数据写入磁盘 -Redis中默认的持久化方式,这种方法是将内存中的数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb
2.3.1 RDB的持久过过程
-
redis调用fork,复制一份当前的进程作为子进程
-
redis的主进程继续处理客户端请求,子进程则将内存内容写入临时文件,子进程将内存数据写入临时文件
-
子进程将快照写入临时文件后,用临时文件替换原来的快照文件,然后子进程退出
client 也可以使用save或者bgsave命令通知redis做一次快照持久化。save操作是在主线程中保存快照的,由于redis是用一个主线程来处理所有 client的请求,这种方式会阻塞所有client请求。所以不推荐使用
每次持久化都会将所有的数据写入磁盘,而不是对对数据进行同步,如果数据量大的话,必然会有大量的io操作,严重影响性能
2.3.2 RDB的优点
优点
- 一旦采取这种操作方式,那么在整个Redis数据库都只会有一个文件,十分方便做备份
- 我们可以很简单讲RDB文件移动到其他的存储介质上
- RDB在恢复数据时比AOF快很多
- RDB可以最大化Redis的性能
缺点
- 如果你需要尽量避免在服务器故障时丢失数据,那么 RDB 不适合你
- 每次保存 RDB 的时候,Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。 在数据集比较庞大时, fork() 可能会非常耗时,造成服务器在某某毫秒内停止处理客户端; 如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能会长达整整一秒。
2.4 AOF的持久化机制
AOF 比快照方式有更好的持久化性,是由于在使用 AOF 持久化方式时,Redis 会将每一个收到的写命令都通过 write 函数追加到文件中(默认是 appendonly.aof)。当 Redis 重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
当然由于 os 会在内核中缓存 write 做的修改,所以可能不是立即写到磁盘上。这样 AOF 方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉 redis 我们想要通过 fsync 函数强制 os 写入到磁盘的时机。有三种方式如下(默认是:每秒 fsync 一次) :
appendonly yes #启用 aof 持久化方式
# appendfsync always #每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全
的持久化,不推荐使用
appendfsync everysec #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no #完全依赖 os,性能最好,持久化没保证
3.Redis 主从复制
1、master 可以有多个 slave
2、除了多个 slave 连到相同的 master 外,slave 也可以连接其他 slave 形成图状结构
3、 主从复制不会阻塞 master。 也就是说当一个或多个 slave 与 master进行初次同步数据时, master 可以继续处理 client 发来的请求。相反 slave 在初次同步数据时则会阻塞不能处理 client 的请求。
4、主从复制可以用来提高系统的可伸缩性,我们可以用多个 slave 专门用于 client 的读请求, 比如 sort
3.1主从复制的过程
- 从服务器连接主服务器,发送SYNC命令
- 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所有写命令
- 主服务器BGSAVE执行完后,向所有从服务器发送快照文件,并在发送期间继续记录被执行的写命令
- 从服务器收到快照文件后丢弃所有旧数据,载入收到的快照
- 主服务器快照发送完毕后开始向从服务器发送缓冲区中的写命令
- 从服务器完成对快照的载入,开始接收命令请求,并执行来自主服务器缓冲区的写命令
3.2配置 slave 服务器
slaveof hadoop02 6379 #指定 master 的 ip 和端口
注意:主节点不用加! ! !
4. Redis.conf配置文件参数说明
redis.conf 配置项说明如下:
1、Redis 默认不是以守护进程的方式运行,可以通过该配置项修改,使用 yes 启用守护进
程
daemonize no2、 当 Redis 以守护进程方式运行时, Redis 默认会把 pid 写入/var/run/redis.pid 文件, 可以
通过 pidfile 指定
pidfile /var/run/redis.pid3、指定 Redis 监听端口,默认端口为 6379,作者在自己的一篇博文中解释了为什么选用
6379 作为默认端口,因为 6379 在手机按键上 MERZ 对应的号码,而 MERZ 取自意大利歌
女 Alessia Merz 的名字
port 63794、绑定的主机地址
bind 127.0.0.15、当客户端闲置多长时间后关闭连接,如果指定为 0,表示关闭该功能
timeout 3006、指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默
认为 verbose
loglevel verbose7、日志记录方式,默认为标准输出,如果配置 Redis 为守护进程方式运行,而这里又配
置为日志记录方式为标准输出,则日志将会发送给/dev/null
logfile stdout8、设置数据库的数量,默认数据库为 0,可以使用 SELECT <dbid>命令在连接上指定数据
库 id
databases 169、指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配
合
save <seconds> <changes>
Redis 默认配置文件中提供了三个条件:
save 900 1
save 300 10
save 60 10000
分别表示 900 秒(15 分钟)内有 1 个更改,300 秒(5 分钟)内有 10 个更改以及 60 秒
内有 10000 个更改。10、指定存储至本地数据库时是否压缩数据,默认为 yes,Redis 采用 LZF 压缩,如果为了
节省 CPU 时间,可以关闭该选项,但会导致数据库文件变的巨大
rdbcompression yes11、指定本地数据库文件名,默认值为 dump.rdb
dbfilename dump.rdb12、指定本地数据库存放目录
dir ./13、设置当本机为 slave 服务时,设置 master 服务的 IP 地址及端口,在 Redis 启动时,它
会自动从 master 进行数据同步
slaveof <masterip> <masterport>14、当 master 服务设置了密码保护时,slav 服务连接 master 的密码
masterauth <master-password>15、设置 Redis 连接密码,如果配置了连接密码,客户端在连接 Redis 时需要通过 AUTH
<password>命令提供密码,默认关闭
requirepass foobared16、设置同一时间最大客户端连接数,默认无限制,Redis 可以同时打开的客户端连接数
为 Redis 进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当
客户端连接数到达限制时,Redis 会关闭新的连接并向客户端返回 max number of clients
reached 错误信息
maxclients 12817、指定 Redis 最大内存限制,Redis 在启动时会把数据加载到内存中,达到最大内存后,
Redis 会先尝试清除已到期或即将到期的 Key, 当此方法处理 后, 仍然到达最大内存设置,
将无法再进行写入操作,但仍然可以进行读取操作。Redis 新的 vm 机制,会把 Key 存放
内存,Value 会存放在 swap 区
maxmemory <bytes>18、指定是否在每次更新操作后进行日志记录,Redis 在默认情况下是异步的把数据写入
磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis 本身同步数
据文件是按上面 save 条件来同步的,所以有的数据会在一段时间内只存在于内存中。默
认为 no
appendonly no19、指定更新日志文件名,默认为 appendonly.aof
appendfilename appendonly.aof20、指定更新日志条件,共有 3 个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用 fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
appendfsync everysec21、指定是否启用虚拟内存机制,默认值为 no,简单的介绍一下,VM 机制将数据分页
存放,由 Redis 将访问量较少的页即冷数据 swap 到磁盘上,访问多的页面由磁盘自动换
出到内存中(在后面的文章我会仔细分析 Redis 的 VM 机制)
vm-enabled no22、虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个 Redis 实例共享
vm-swap-file /tmp/redis.swap23、将所有大于 vm-max-memory 的数据存入虚拟内存,无论 vm-max-memory 设置多小,所
有索引数据都是内存存储的(Redis 的索引数据 就是 keys),也就是说,当 vm-max-memory 设
置为 0 的时候,其实是所有 value 都存在于磁盘。默认值为 0
vm-max-memory 024、 Redis swap 文件分成了很多的 page, 一个对象可以保存在多个 page 上面, 但一个 page
上不能被多个对象共享,vm-page-size 是要根据存储的 数据大小来设定的,作者建议如
果存储很多小对象,page 大小最好设置为 32 或者 64bytes;如果存储很大大对象,则可
以使用更大的 page,如果不 确定,就使用默认值
vm-page-size 3225、设置 swap 文件中的 page 数量,由于页表(一种表示页面空闲或使用的 bitmap)是
在放在内存中的, ,在磁盘上每 8 个 pages 将消耗 1byte 的内存。
vm-pages 13421772826、 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap
文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为 4
vm-max-threads 427、设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
glueoutputbuf yes28、指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算
法
hash-max-zipmap-entries 64
hash-max-zipmap-value 51229、指定是否激活重置哈希,默认为开启(后面在介绍 Redis 的哈希算法时具体介绍)
activerehashing yes30、指定包含其它的配置文件,可以在同一主机上多个 Redis 实例之间使用同一份配置文
件,而同时各个实例又拥有自己的特定配置文件
include /path/to/local.conf