zoukankan      html  css  js  c++  java
  • redis学习笔记

    Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集

    合)、zset(sorted set --有序集合)和hash(哈希类型)与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是

    redis会周期性的把更新的数据写入磁盘或者把修改操作写入追

    加的记录文件,并且在此基础上实现了master-slave(主从)同步

    Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器

    redis和memcached对处理并发请求都不存在性能瓶颈,性能瓶颈可能在网卡上

    官方的bench-mark数据:结果:读的速度是110000次/s,写的速度是81000次/s 

    安装:yum -y install epel-release    yum -y install redis-3.0.7-2.el6.remi.x86_64.rpm  

    配置文件: /etc/redis.conf    vim /etc/redis.conf

    如果是基于本地通信,修改开启 unixsocket /tmp/redis.sock文件和它的权限unixsocketperm 700可以提高性能

    几个参数介绍:

    databases:指定支持多少个数据库,在默认的集群中(分布式场景中)只使用0号库,不支持使用多个库

    tcp-keepalive 0    关闭tcp持久连接功能 

    save 900 1    900秒中有一次数据的修改,将修改的数据同步到磁盘的数据文件(持久化RDB)
    save 300 10
    save 60 10000   

    可以注释掉此功能

    requirepass  设置客户端连接后进行任何其他指定前需要使用的密码   登陆后使用AUTH  password 完成认证 

    登陆命令   redis-cli -h HOSTIP -p PORT    例如:redis-cli -h 127.0.0.1或redis-cli

    启动服务:service redis start      

    redis的命令获取帮助help

    redis的持久化:

      RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)

      AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集

    RDB 的优点:  父进程在保存 RDB 文件时唯一要做的就是 fork 出一个子进程,然后这个子进程就会处理接下来的所有保存工作,父

    进程无须执行任何磁盘 I/O 操作。RDB 在恢复大数据集时的速度比 AOF 的恢复速度要快,可以根据备份策略,将数据还原到不同的

    时间点

    RDB 的缺点:  Redis 都要 fork() 出一个子进程,并由子进程来进行实际的持久化工作。 在数据集比较庞大时, fork() 可能会非

    常耗时,造成服务器在某某毫秒内停止处理客户端; 如果数据集非常巨大,并且 CPU 时间非常紧张的话,那么这种停止时间甚至可能

    会长达整整一秒。 虽然 AOF 重写也需要进行 fork() ,但无论 AOF 重写的执行间隔有多长,数据的耐久性都不会有任何损失,一旦发

    生故障停机可能会丢失好几分钟的数据

    AOF 的优点:   AOF 的默认策略为每秒钟 fsync 一次,在这种配置下,Redis 仍然可以保持良好的性能,并且就算发生故障停机,

    也最多只会丢失一秒钟的数据,AOF 文件是一个只进行追加操作的日志文件(append only log), 因此对 AOF 文件的写入不需要进

    行 seek , 即使日志因为某些原因而包含了未写入完整的命令(比如写入时磁盘已满,写入中途停机,等等), redis-check-aof 工

    具也可以轻易地修复这种问题,Redis 可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写: 重写后的新 AOF 文件包

    含了恢复当前数据集所需的最小命令集合。 整个重写操作是绝对安全的,因为 Redis 在创建新 AOF 文件的过程中,会继续将命令追加

    到现有的 AOF 文件里面,即使重写过程中发生停机,现有的 AOF 文件也不会丢失。 而一旦新 AOF 文件创建完毕,Redis 就会从旧

    AOF 文件切换到新 AOF 文件,并开始对新 AOF 文件进行追加操作。AOF 文件有序地保存了对数据库执行的所有写入操作, 这些写

    入操作以 Redis 协议的格式保存, 因此 AOF 文件的内容非常容易被人读懂, 对文件进行分析(parse)也很轻松。 导出(export)

    AOF 文件也非常简单: 举个例子, 如果你不小心执行了 FLUSHALL 命令, 但只要 AOF 文件未被重写, 那么只要停止服务器, 移

    除 AOF 文件末尾的 FLUSHALL 命令, 并重启 Redis , 就可以将数据集恢复到 FLUSHALL 执行之前的状态。

    AOF 的缺点:对于相同的数据集来说,AOF 文件的体积通常要大于 RDB 文件的体积。根据所使用的 fsync 策略,AOF 的速度可能会

    慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下

    也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。AOF 在过去曾经发生过这样的 bug

    : 因为个别命令的原因,导致 AOF 文件在重新载入时,无法将数据集恢复成保存时的原样。 (举个例子,阻塞命令 BRPOPLPUSH

    就曾经引起过这样的 bug 。) 测试套件里为这种情况添加了测试: 它们会自动生成随机的、复杂的数据集, 并通过重新载入这些数

    据来确保一切正常。 虽然这种 bug 在 AOF 文件中并不常见, 但是对比来说, RDB 几乎是不可能出现这种 bug 的

    RDB 和 AOF ,我应该用哪一个?  

      如果数据没有安全性的要求。建议关闭持久化的功能,如果要求非常高建议都开启,折中的办法是开启AOF

    以上redis的持久化参考链接:http://my.oschina.net/davehe/blog/174662

      注意:持久本身不能取代备份;还应该制定备份策略,对redis数据库定期进行备份

    RDB与AOF同时启用

      (1) BGSAVE和BGREWRITEAOF不会同时执行

        (2) 在Redis服务器启动用于恢复数据时,会优先使用AOF

    在配置文件中将appendonly no的参数改为yes,就可以将AOF的持久化功能开启,appendfilename 指定AOF文件名

    no-appendfsync-on-rewrite  在重写AOF文件时,是否对新写的操作暂存在内存中,默认为no

    auto-aof-rewrite-percentage 100   当前AOF文件大小是上次重写AOF文件大小的两倍时自动对当前AOF文件重写

    auto-aof-rewrite-min-size     设定当前AOF文件的大小至少要到指定大小才能进行重写

    复制:

      1). 同一个Master可以同步多个Slaves

      2). Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力

      3). Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求

      4). Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据

    复制的工作原理: 在Slave启动并连接到Master之后,它将主动发送一个SYNC命令。此后Master将启动后台存盘进程,同时收集所

    有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Slave,以完成一次完全同步。而Slave

    服务器在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master继续将所有已经收集到的修改命令,和新的修改命令依次

    传送给Slaves,Slave将在本地执行这些数据修改命令,从而达到最终的数据同步 如果Master和Slave之间的链接出现断连现象,

    Slave可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。

      

    将从库的配置文件设置一条参数就可以了:slaveof 192.168.238.224 6379   指定主库的ip地址,监听的端口

    登陆后使用info replication命令查看主从同步是否成功

    从库配置参数:slave-serve-stale-data  如果从库连接不到主库了,当有读请求时是否发送自己的数据,默认为yes

           slave-read-only    从库是否为只读,默认为yes

    注意:如果master使用requirepass开启了认证功能,从服务器要使用masterauth <PASSWORD>来连入服务请求使用此密码进行

    认证

    sentinel:用于监控和管理多个redis服务实现HA,通知,自动故障转移,要求sentinel要为基数个数,至少三个对master是否在线做

    出投票式的正确判定,同时也避免了sentinel单点失效

    启动sentinel的程序  redis-sentinel /etc/redis-sentinel.conf

    /etc/redis-sentinel.conf   为sentinel的专用配置文件

    启动sentinel的程序会实现以下过程

      (1) 服务器自身初始化,运行redis-server中专用于sentinel功能的代码

      (2) 初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表

      (3) 创建连向master的连接

    配置文件中必须配置的参数:

      sentinel monitor <master-name> <ip> <redis-port> <quorum>

      例如:sentinel monitor mymaster 127.0.0.1 6379 1     quorum是指定有几台sentinel

      sentinel down-after-milliseconds <master-name> <milliseconds>

      例如:sentinel down-after-milliseconds mymaster 30000      30秒连接不到主库,则判定主库为down

      sentinel parallel-syncs mymaster 1

      当从库提升为主库时,多少从库可以同时过来同步

      sentinel failover-timeout mymaster 180000  

      故障转移超时时间

      主观下线:一个sentinel实例判断出某节点下线

      客观下线:多个sentinel节点协商后判断出某节点下线

      

      专用命令:

        SENTINEL masters

        SENTINEL slaves <master name>

        SENTINEL get-master-addr-by-name <master name>

        

    补充:当主库宕机后,sentinel会把新的主库ip地址通知客户端(需要redis的专用客户端程序),原来的主库回来时会变成新主库的从

    库,sentinel以非守护进程工作

  • 相关阅读:
    Ubantu 安装Redis
    传说中的WCF(5):数据协定(a)
    传说中的WCF(4):发送和接收SOAP头
    传说中的WCF(3):多个协定
    传说中的WCF(2):服务协定的那些事儿
    传说中的WCF(1):这东西难学吗?
    Linq教程
    Installutil.exe的位置和路径
    uni-app中对输入框的判断与提示(密码格式为6-12位,必须有大小写字母和数字组成)
    uni-app系列回顾总结----项目国际化
  • 原文地址:https://www.cnblogs.com/linuxboke/p/5466987.html
Copyright © 2011-2022 走看看