说明
参考文章: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命令更换数据库。