说明

  参考文章:https://www.cnblogs.com/sanduzxcvbnm/p/11300942.html

  Redis_配置文件:https://www.cnblogs.com/chunxiaozhang/p/12718647.html

  Redis_数据使用:https://www.cnblogs.com/chunxiaozhang/p/12718618.html

  Redis_命令大全:https://www.cnblogs.com/chunxiaozhang/p/12745405.html

一:基础

  1、Redis

Remote Dictionary Server(Redis)是一个开源的、使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库。

  2、redis持久化

redis提供了两种持久化的方式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB,简而言之,就是在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上;
AOF,则是换了一个角度来实现持久化,那就是将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。

redis持久化 – RDB
    RDB方式,是将redis某一时刻的数据持久化到磁盘中,是一种快照式的持久化方法。redis在进行数据持久化的过程中,会先将数据写入到一个临时文件中,待持久化过程都结束了,才会用这个临时
    文件替换上次持久化好的文件。正是这种特性,让我们可以随时来进行备份,因为快照文件总是完整可用的。对于RDB方式,redis会单独创建(fork)一个子进程来进行持久化,而主进程是不会进行
    任何IO操作的,这样就确保了redis极高的性能。
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。

redis持久化 – AOF
    Append Only File,即只允许追加不允许改写的文件。AOF方式是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍,就这么简单。
    配置redis.conf中的appendonly yes就可以打开AOF功能。如果有写操作(如SET等),redis就会被追加到AOF文件的末尾。默认的AOF持久化策略是每秒钟fsync一次(fsync是指把缓存中的写指令记录到磁盘中),
因为在这种情况下,redis仍然可以保持很好的处理性能,即使redis故障,也只会丢失最近1秒钟的数据。
    如果在追加日志时,恰好遇到磁盘空间满、inode满或断电等情况导致日志写入不完整,也没有关系,redis提供了redis-check-aof工具,可以用来进行日志修复。
AOF文件出现了被写坏的情况,redis并不会贸然加载这个有问题的AOF文件,而是报错退出。这时可以通过以下步骤来修复出错的文件:
    备份被写坏的AOF文件
    运行redis-check-aof –fix进行修复
    用diff -u来看下两个文件的差异,确认问题点
    重启redis,加载修复后的AOF文件

redis持久化 – AOF重写
    在重写即将开始之际,redis会创建(fork)一个“重写子进程”,这个子进程会首先读取现有的AOF文件,并将其包含的指令进行分析压缩并写入到一个临时文件中。
    与此同时,主工作进程会将新接收到的写指令一边累积到内存缓冲区中,一边继续写入到原有的AOF文件中,这样做是保证原有的AOF文件的可用性,避免在重写过程中出现意外。
    当“重写子进程”完成重写工作后,它会给父进程发一个信号,父进程收到信号后就会将内存中缓存的写指令追加到新AOF文件中。
    当追加结束后,redis就会用新AOF文件来代替旧AOF文件,之后再有新的写指令,就都会追加到新的AOF文件中了。

  3、redis主从同步

redis是支持主从同步的,而且也支持一主多从以及多级从结构。
主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的SORT就可以由从服务器来承担。
redis的主从同步是异步进行的,这意味着主从同步不会影响主逻辑,也不会降低redis的处理性能。
主从架构中,可以考虑关闭主服务器的数据持久化功能,只让从服务器进行持久化,这样可以提高主服务器的处理性能。
主从架构中,从服务器通常被设置为只读模式,这样可以避免从服务器的数据被误修改。但可以接受CONFIG等指令.
同步原理:
    从服务器会向主服务器发出SYNC指令,当主服务器接到此命令后,就会调用BGSAVE指令来创建一个子进程专门进行数据持久化工作,也就是将主服务器的数据写入RDB文件中。在数据持久化期间,
主服务器将执行的写指令都缓存在内存中。在BGSAVE指令执行完成后,主服务器会将持久化好的RDB文件发送给从服务器,从服务器接到此文件后会将其存储到磁盘上,然后再将其读取到内存中。这个
动作完成后,主服务器会将这段时间缓存的写指令再以redis协议的格式发送给从服务器。即使有多个从服务器同时发来SYNC指令,主服务器也只会执行一次BGSAVE,然后把持久化好的RDB文件发给多个下游

  4、redis的事务处理

事务是指“一个完整的动作,要么全部执行,要么什么也没有做”。MULTI、EXEC、DISCARD、WATCH四个指令构成了redis事务处理的基础。
    MULTI用来组装一个事务;
    EXEC用来执行一个事务;
    DISCARD用来取消一个事务;
    WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行。
举例:
redis> MULTI //标记事务开始
OK
redis> INCR user_id //多条命令按顺序入队
QUEUED
redis> INCR user_id
QUEUED
redis> INCR user_id
QUEUED
redis> PING
QUEUED
redis> EXEC //执行
1) (integer) 1
2) (integer) 2
3) (integer) 3
4) PONG

关事务,经常会遇到的是两类错误:
1.调用EXEC之前的错误
2.调用EXEC之后的错误
    调用EXEC之前的错误:有可能是由于语法有误导致的,也可能时由于内存不足导致的。只要出现某个命令无法成功写入缓冲队列的情况,redis都会进行记录,在客户端调用EXEC时,redis会拒绝执行这一事务。
(这时2.6.5版本之后的策略。在2.6.5之前的版本中,redis会忽略那些入队失败的命令,只执行那些入队成功的命令)
    调用EXEC之后的错误:redis则采取了完全不同的策略,即redis不会理睬这些错误,而是继续向下执行事务中的其他命令。

 二:linux安装

  1、下载redis

官网下载:https://redis.io/download
linux下载:wget http://download.redis.io/releases/redis-5.0.8.tar.gz

  2、linux环境

[root@bogon ~]# gcc -v --检测redis安装的编译工具
[root@bogon ~]# yum install gcc-c++ --安装gcc

/**
    5.0及以上redis版本以下这三个依赖可不用安装
    ruby是创建redis集群依赖工具,5.0版本及以后不再依赖ruby
    gem install redis命令可能因版本问题报错
**/
[root@localhost redis]# yum install ruby
[root@localhost redis]# yum install rubygems
[root@localhost redis]# gem install redis

  3、单节点安装

/**安装**/
[root@localhost redis]# tar -xzvf redis-5.0.8.tar.gz -C ./redis-one/ --解压文件到指定目录
[root@localhost redis-5.0.8]# make --编译文件,输出位置为当前
[root@localhost redis-5.0.8]# make PREFIX=/root/redis/redis-bin install --构建文件,指定构建输出位置,不指定默认在 /usr/local/bin
[root@localhost bin]# ll /root/redis/redis-bin --查看构建出来的文件,与安装目录下src中对应文件效果一样
总用量 32776
-rw-r--r--. 1 root root     108 4月  17 17:07 dump.rdb 
-rwxr-xr-x. 1 root root 4366840 4月  17 16:10 redis-benchmark --Redis性能测试工具
-rwxr-xr-x. 1 root root 8125032 4月  17 16:10 redis-check-aof --AOF文件修复工具
-rwxr-xr-x. 1 root root 8125032 4月  17 16:10 redis-check-rdb --RDB文件检查工具
-rwxr-xr-x. 1 root root 4807832 4月  17 16:10 redis-cli --Redis命令行客户端
lrwxrwxrwx. 1 root root      12 4月  17 16:10 redis-sentinel -> redis-server
-rwxr-xr-x. 1 root root 8125032 4月  17 16:10 redis-server ----Redis服务器

/**启动和关闭**/
[root@localhost bin]# redis-server /redis.confg & --以指定配置文件启动,&表示支持后台运行:退出命令行也不会关闭
[root@localhost bin]# redis-cli --连接默认节点6379,-p 7001以指定端口连接
[root@localhost bin]# redis-cli shutdown --关闭节点

  4、集群安装

此命令以单服务器安装,属伪集群,实际生产集群创建大致相同

1、安装单节点
[root@localhost redis]# tar -xzvf redis-5.0.8.tar.gz -C ./redis-one/ --解压文件到指定目录
[root@localhost redis-5.0.8]# make --编译文件,输出位置为当前
[root@localhost redis-5.0.8]# make PREFIX=/root/redis/redis-bin install --构建文件,指定构建输出位置,不指定默认在 /usr/local/bin

2、扩展节点
/** make install 安装了redis,redis-server ./redis.conf 即可启动不同的节点实例,以指定的配置文件为准 故在伪集群中只需配置不同的redis.conf,通过redis-server启动不同的实例,生产中不同服务器则都需要完整的安装 **/ [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7001 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7002 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7003 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7004 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7005 [root@localhost redis-5.0.8]# cp ./redis.conf /root/redis/redis-cluster/7006
3、修改节点配置文件 /**其他节点依次修改**/ port 7000 //端口7000,7002,7003 bind 本机ip //默认ip为localhost,缺省和默认时支持远程连接,指定时只能本地连接 daemonize yes //redis后台运行 pidfile /var/run/redis_7000.pid //pidfile文件对应7000,7001,7002 cluster-enabled yes //开启集群 把注释#去掉 cluster-config-file nodes_7000.conf //集群的配置 配置文件首次启动自动生成 7000,7001,7002 cluster-node-timeout 15000 //请求超时 默认15秒,可自行设置 appendonly yes //aof日志开启 有需要就开启,它会每次写操作都记录一条日志 5、检查redis运行状态 [root@bogon bin]# ps -ef | grep redis
6、创建集群
/** redis5.0之前版本创建集群,redis-trib.rb在安装目录src下**/ [root@localhost bin]# redis-trib.rb create --replicas 1 192.168.31.245:7000 192.168.31.245:7001 192.168.31.245:7002 192.168.31.210:7003 192.168.31.210:7004 192.168.31.210:7005 /**
  redis5.0之后支持使用redis-cli创建集群 --cluster-replicas 1 表示主从配置比,1表示的是1:1,前三个是主,后三个是从 若配置文件中设置的密码,则还需要加上-a passwod
*
*/ [root@localhost bin]# ./redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1
7、启动和关闭 /** 集群的启停与单节点一样,在集群重启后,redis会自动把相关节点纳入管理,因为有node.conf文件的存在**/ [root@localhost bin]# redis-cli -c -h 127.0.0.1 -p 7001 --连接集群节点方式

  5、集群管理

添加新主节点
/**
    new_host:new_port:新节点地址:端口号
    existing_host:existing_port:已存在的最后一个主节点的IP:端口地址,可根据slots槽点数判断最后一个主节点
    --cluster-master-id node_id:表示的是最后一个主节点的节点id,表示的是新添加的主节点要在这个节点后面
**/
[root@bogon bin]# redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-master-id node_id

添加新从节点
/**
    new_host:new_port:新节点地址:端口号
    existing_host:existing_port:要添加从节点的主节点地址:端口号
    --cluster-master-id node_id:要添加从节点的主节点id
**/
[root@bogon bin]# redis-cli --cluster add-node new_host:new_port existing_host:existing_port --cluster-slave --cluster-master-id node_id

hash槽重新分配
/**
    添加完新节点后,需要对新添加的主节点进行hash槽重新分配,redis共有16384个槽。
    host:port:新添加的主节点IP和端口
    --cluster-from node_id:集群第一个主节点的节点id
    --cluster-to node_id:集群最后一个主节点的节点id,也就是新添加的那个主节点id
    --cluster-slots 500:新主节点分配多少,此处500表示是分配从0-499个slots槽数,若不加上这个会让手动输入
    --cluster-yes:自动应答为yes,若不加上这个会让手动输入yes,表示同意此次分配
**/
[root@bogon bin]# redis-cli --cluster  reshard host:port --cluster-from node_id --cluster-to node_id --cluster-slots <args> --cluster-yes

删除节点
/**
    host:port:要删除节点的IP:端口号
    node_id:删除节点的节点id
**/
[root@bogon bin]# redis-cli --cluster  del-node host:port node_id

 三:Redis原理

  1、Redis的数据库

    Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。
    每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,
不过可以随时使用SELECT命令更换数据库。

  2、Redis单线程原理

 

posted on 2020-04-17 11:25  chunxiaozhang  阅读(184)  评论(0编辑  收藏  举报