详细介绍
一、编译安装redis步骤
-
下载redis源码
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
-
解压缩
tar -zxf redis-4.0.10.tar.gz
-
切换redis源码目录
cd redis-4.0.10.tar.gz
-
编译源文件
make
-
编译好后,src/目录下有编译好的redis指令
-
make install 安装到指定目录,默认在/usr/local/bin
redis可执行文件./redis-benchmark //用于进行redis性能测试的工具 ./redis-check-dump //用于修复出问题的dump.rdb文件 ./redis-cli //redis的客户端 ./redis-server //redis的服务端 ./redis-check-aof //用于修复出问题的AOF文件 ./redis-sentinel //用于集群管理
启动redis服务端
启动redis非常简单,直接./redis-server就可以启动服务端了,还可以用下面的方法指定要加载的配置文件:
redis-server redis.conf
默认情况下,redis-server会以非daemon的方式来运行,且默认服务端口为6379。
使用redis客户端
#执行客户端命令即可进入
./redis-cli
#测试是否连接上redis
127.0.0.1:6379 > ping
返回pong代表连接上了
//用set来设置key、value
127.0.0.1:6379 > set name "chaoge"
OK
//get获取name的值
127.0.0.1:6379 > get name
"chaoge"
二、发布订阅
-
发布订阅的命令
PUBLISH channel msg 将信息 message 发送到指定的频道 channel SUBSCRIBE channel [channel ...] 订阅频道,可以同时订阅多个频道 UNSUBSCRIBE [channel ...] 取消订阅指定的频道, 如果不指定频道,则会取消订阅所有频道 PSUBSCRIBE pattern [pattern ...] 订阅一个或多个符合给定模式的频道,每个模式以 * 作为匹配符,比如 it* 匹配所 有以 it 开头的频道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有 以 news. 开头的频道( news.it 、 news.global.today 等等),诸如此类 PUNSUBSCRIBE [pattern [pattern ...]] 退订指定的规则, 如果没有参数则会退订所有规则 PUBSUB subcommand [argument [argument ...]] 查看订阅与发布系统状态 注意:使用发布订阅模式实现的消息队列,当有客户端订阅channel后只能收到后续发布到该频道的消息,之前发送的不会缓存,必须Provider和Consumer同时在线。
-
订阅一个或者多个符合模式的频道
窗口1,启动两个
redis-cli
窗口,均订阅wang*
频道(channel)127.0.0.1:6379> PSUBSCRIBE wang* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "wang*" 3) (integer) 1 1) "pmessage" 2) "wang*" 3) "wangbaoqiang" 4) "jintian zhennanshou "
窗口2,启动redis-cli窗口,均订阅wang*频道
127.0.0.1:6379> PSUBSCRIBE wang* Reading messages... (press Ctrl-C to quit) 1) "psubscribe" 2) "wang*" 3) (integer) 1 1) "pmessage" 2) "wang*" 3) "wangbaoqiang" 4) "jintian zhennanshou "
窗口3,发布者消息
[root@web02 ~]# redis-cli 127.0.0.1:6379> PUBLISH wangbaoqiang "jintian zhennanshou " (integer) 2
三、持久化
-
RDB持久化:(将数据转化成二进制)
1.配置文件设置 [redis-rdb.conf] port 6379 daemonize yes logfile /data/6379/redis.log # 日志存储路径 dir /data/6379 # 指明redis的数据文件放在哪 dbfilename redis-rdb.rdb # (持久化的数据)会放在/data/6379下 save 900 1 # rdb机制每900秒有1个修改记录 save 300 10 # rdb机制每300秒有10个修改记录 save 60 10000 # rdb机制每60秒有10000个修改记录 2.实现过程 set name liyouxiu set age 18 save // 会在/data/6379 /下生成redis-rdb.rdb的文件
-
AOF持久化:(记录服务器所有变更操作命令,追加到日志文件中)
1.配置文件设置 appendonly yes appendfsync always # 总是修改类的操作 appendfsync everysec # 每秒做一次持久化 appendfsync no # 依赖系统自带的缓存大小机制 [redis-aof.conf] port 6379 daemonize yes logfile /data/6379/redis.log # 日志存储路径 dir /data/6379 # 指明redis的数据文件放在哪 appendonly yes appendfsync everysec # 每秒做一次持久化
-
redis不重启,切换RDB备份到AOF备份
1.redis-server redis-rdb.conf // 这是在rdb持久化模式下 2.切换rdb到aof redis-cli CONFIG set appendonly yes # 用命令激活aof持久化(临时生效,注意写入到临时文件) CONFIG SET save "" # 关闭rdb持久化 3.将aof持久化写入到配置文件
四、主从同步(主库是可读可写,从库只能读)
-
配置文件格式
[redis-6379.conf] port 6379 daemonize yes pidfile /data/6379/redis.pid loglevel notice logfile "/data/6379/redis.log" dbfilename dump.rdb dir /data/6379 protected-mode no
-
使用
1.准备三个redis配置文件(只是端口不同) 2.在redis-6380.conf,redis-6381.conf中添加: slaveof 127.0.0.1 6379 # 指明主库的身份ip echo "slaveof 127.0.0.1 6379" >> redis-6381.conf 3.启动三个数据库实例
-
redis主从复制,故障手动切换
1.若杀死6379主库 2.redis-cli -p 6380 3.slaveof no one // 不属于任何人的从库,自己以自己为主库 4.redis-cli -p 6381 5.SLAVEOF 127.0.0.1 6380 // 认端口号为6380的库为主人
五、redis 哨兵(保护redis主从集群,正常运转,当主库挂掉之后,自动从主库中挑选新的主库,进行同步)
-
准备三个redis数据库实例,(三个配置文件,通过端口区分)
-
准备三个redis哨兵的配置文件
touch redis-sentinel-26379.conf touch redis-sentinel-26380.conf touch redis-sentinel-26381.conf [redis-sentinel-26379.conf] port 26379 daemonize yes // 后台运行 dir /var/redis/data/ logfile "26379.log" sentinel monitor mymaster 127.0.0.1 6379 2 // 2代表2个哨兵同意就确定主机已挂 sentinel down-after-milliseconds mymaster 30000 // 若30秒后主库还未回复我,就换其他从机为主机 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000 其他两个配置: sed "s/26379/26380/g" redis-sentinel-26379.conf > redis-sentinel-26380.conf sed "s/26379/26381/g" redis-sentinel-26379.conf > redis-sentinel-26381.conf
-
起动三个哨兵
redis-sentinel redis-sentinel-26379.conf redis-sentinel redis-sentinel-26380.conf redis-sentinel redis-sentinel-26381.conf
-
检查哨兵通信状态
redis-cli -p 26379 info sentinel
-
若杀死6379 进程的redis
哨兵将6381默认为了主机 若再重启6379,它会默认成从机
redis高可用故障实验
-
大致思路
杀掉主节点的redis进程6379端口,观察从节点是否会进行新的master选举,进行切换
重新恢复旧的“master”节点,查看此时的redis身份 -
首先查看三个redis的进程状态
ps -ef|grep redis
检查三个节点的复制身份状态
第一个
[root@master tmp]# redis-cli -p 6381 info replication
Replication
role:slave master_host:127.0.0.1 master_port:6380
第二个
[root@master tmp]# redis-cli -p 6380 info replication
Replication
role:master connected_slaves:2 slave0:ip=127.0.0.1,port=6381,state=online,offset=54386,lag=0 slave1:ip=127.0.0.1,port=6379,state=online,offset=54253,lag=0
第三个
[root@master tmp]# redis-cli -p 6379 info replication
Replication
role:slave master_host:127.0.0.1 master_port:6380
-
此时,干掉
master
!!!然后等待其他两个节点是否能自动被哨兵sentienl,切换为master节点ps -ef|grep 6380 #干掉master进程
-
此时查看两个
slave
的状态精髓就是查看一个参数
master_link_down_since_seconds:13
稍等片刻之后,发现
slave
节点成为master
节点!![root@master tmp]# redis-cli -p 6379 info replication
Replication
role:master connected_slaves:1 slave0:ip=127.0.0.1,port=6381,state=online,offset=41814,lag=1
六、 redis-cluster(分布式存储)
redis实例集群主要思想是将redis数据的key进行散列,通过hash函数特定的key会映射到指定的redis节点上
-
数据分布原理图
redis-cluster集群架构- 多个服务端,负责读写,彼此通信,redis指定了16384个槽。
- 多匹马儿,负责运输数据,马儿分配16384个槽位,管理数据。
ruby的脚本自动就把分配槽位这事做了
分布式数据库首要解决把整个数据集按照分区规则映射到多个节点的问题,即把数据集划分到多个节点上,每个节点负责整个数据的一个子集。
常见的分区规则有哈希分区和顺序分区。Redis Cluster采用哈希分区规则,因此接下来会讨论哈希分区规则。 -
常见分区规则:
-
节点取余分区
例如按照节点取余的方式,分三个节点 1~100的数据对3取余,可以分为三类 余数为0 余数为1 余数为2 那么同样的分4个节点就是hash(key)%4 节点取余的优点是简单,客户端分片直接是哈希+取余
-
一致性哈希分区
-
虚拟槽分区(redis-cluster采用的方式)
Redis Cluster采用虚拟槽分区 虚拟槽分区巧妙地使用了哈希空间,使用分散度良好的哈希函数把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。 Redis Cluster槽的范围是0 ~ 16383。 槽是集群内数据管理和迁移的基本单位。采用大范围的槽的主要目的是为了方便数据的拆分和集群的扩展, 每个节点负责一定数量的槽。
-
-
使用步骤
步骤一、通过配置,
redis.conf
开启redis-cluster
port 7000 daemonize yes dir "/opt/redis/data" logfile "7000.log" dbfilename "dump-7000.rdb" cluster-enabled yes #开启集群模式 cluster-config-file nodes-7000.conf #集群内部的配置文件 cluster-require-full-coverage no #redis cluster需要16384个slot都正常的时候才能对外提供服务,换句话说,只要任何一个slot异常那么整个cluster不对外提供服务。 因此生产环境一般为no
redis支持多实例的功能,我们在单机演示集群搭建,需要6个实例,三个是主节点,三个是从节点,数量为6个节点才能保证高可用的集群。
每个节点仅仅是端口运行的不同!
[root@yugo /opt/redis/config 17:12:30]#ls redis-7000.conf redis-7002.conf redis-7004.conf redis-7001.conf redis-7003.conf redis-7005.conf
#确保每个配置文件中的端口修改!!
步骤二、运行redis实例
创建6个节点的redis实例
1855 2018-10-24 15:46:01 redis-server redis-7000.conf 1856 2018-10-24 15:46:13 redis-server redis-7001.conf 1857 2018-10-24 15:46:16 redis-server redis-7002.conf 1858 2018-10-24 15:46:18 redis-server redis-7003.conf 1859 2018-10-24 15:46:20 redis-server redis-7004.conf 1860 2018-10-24 15:46:23 redis-server redis-7005.conf
起6个服务
redis-server redis-7000.conf redis-server redis-7001.conf redis-server redis-7002.conf redis-server redis-7003.conf redis-server redis-7004.conf redis-server redis-7005.conf
步骤三、开启
redis-cluster
下载、编译、安装
Ruby
安装rubygem redis
安装redis-trib.rb
命令第一步、安装ruby #下载ruby源码包 wget https://cache.ruby-lang.org/pub/ruby/2.3/ruby-2.3.1.tar.gz #解压缩ruby源码包 tar -zxvf ruby-2.3.1.tar.gz #编译且安装 ./configure --prefix=/opt/ruby/ make && make install 第二步、配置ruby环境变量 vim /etc/profile 写入如下配置 PATH=$PATH:/opt/ruby/bin 第三步、安装ruby操作redis包 wget http://rubygems.org/downloads/redis-3.3.0.gem gem install -l redis-3.3.0.gem 第四步、安装redis-trib.rb命令 [root@yugo /opt/redis/src 18:38:13]#cp /opt/redis/src/redis-trib.rb /usr/local/bin/
步骤四、一键开启redis-cluster集群
#每个主节点,有一个从节点,代表--replicas 1 redis-trib.rb create --replicas 1 127.0.0.1:7000 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 #集群自动分配主从关系 7000、7001、7002为 7003、7004、7005 主动关系
步骤五、查看集群状态
redis-cli -p 7000 cluster info redis-cli -p 7000 cluster nodes #等同于查看nodes-7000.conf文件节点信息 集群主节点状态 redis-cli -p 7000 cluster nodes | grep master 集群从节点状态 redis-cli -p 7000 cluster nodes | grep slave
步骤六、写入redis-cluster集群数据
安装完毕后,检查集群状态
[root@yugo /opt/redis/src 18:42:14]#redis-cli -p 7000 cluster info cluster_state:ok cluster_slots_assigned:16384 cluster_slots_ok:16384 cluster_slots_pfail:0 cluster_slots_fail:0 cluster_known_nodes:6 cluster_size:3 cluster_current_epoch:6 cluster_my_epoch:1 cluster_stats_messages_ping_sent:10468 cluster_stats_messages_pong_sent:10558 cluster_stats_messages_sent:21026 cluster_stats_messages_ping_received:10553 cluster_stats_messages_pong_received:10468 cluster_stats_messages_meet_received:5 cluster_stats_messages_received:21026
步骤七、测试写入集群数据,登录集群必须使用redis-cli -c -p 7000必须加上-c参数
127.0.0.1:7000> set name chao -> Redirected to slot [5798] located at 127.0.0.1:7001 OK 127.0.0.1:7001> exit [root@yugo /opt/redis/src 18:46:07]#redis-cli -c -p 7000 127.0.0.1:7000> ping PONG 127.0.0.1:7000> keys * (empty list or set) 127.0.0.1:7000> get name -> Redirected to slot [5798] located at 127.0.0.1:7001 "chao"
-
redis-python api
1、对redis的单实例进行连接操作
python3
import redis r = redis.StrictRedis(host='localhost', port=6379, db=0,password='root') r.set('lufei', 'guojialei') >True r.get('lufei') >'bar'
2、sentinel集群连接并操作
[root@db01 ~]# redis-server /data/6380/redis.conf [root@db01 ~]# redis-server /data/6381/redis.conf [root@db01 ~]# redis-server /data/6382/redis.conf [root@db01 ~]# redis-sentinel /data/26380/sentinel.conf &
导入
redis sentinel
包from redis.sentinel import Sentinel # 指定sentinel的地址和端口号 sentinel = Sentinel([('localhost', 26380)], socket_timeout=0.1) # 测试,获取以下主库和从库的信息 sentinel.discover_master('mymaster') sentinel.discover_slaves('mymaster') # 配置读写分离 # 写节点 master = sentinel.master_for('mymaster', socket_timeout=0.1) # 读节点 slave = sentinel.slave_for('mymaster', socket_timeout=0.1) # 读写分离测试 key master.set('oldboy', '123') slave.get('oldboy') >'123'
redis cluster的连接并操作(python2.7.2以上版本才支持redis cluster,我们选择的是3.5)
https://github.com/Grokzen/redis-py-cluster3、python连接rediscluster集群测试
使用python3
from rediscluster import StrictRedisCluster startup_nodes = [{"host": "127.0.0.1", "port": "7000"}] # Note: decode_responses must be set to True when used with python3 rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True) rc.set("foo", "bar") >True >'bar'
可能需要的命令:
-
tail -f appendonly.aof
// 实时监控 appendonly.aof内容变化 -
sed "s/6379/6380/g" redis-6379.conf > redis-6380.conf
// (替换内容还未写入到文件)s:替换, g:gloab全局 (将redis-6379.conf文件中6379替换为6380写入redis-6380.conf 文件中)
sed -i "s/6379/6380/g" redis-6379.conf > redis-6380.conf
// 将替换内容写入到文件 -
pkill redis-server
// 杀掉所有与redis-server相关的进程
redis-cli -p 6379 info // 查看数据库详细信息
redis-cli -p 6379 info replication // 检查数据库主从信息