=======================================
本文参考,oldguo标杆班课堂笔记,仅供参考,参考者网址:https://www.jianshu.com/u/44068ed972c7
=========================================
*如果您对数据库感兴趣,可以添加 DBA解决方案QQ群:855439640*
# 0. NoSQL 产品(key-value)
```
RDBMS :MySQL,Oracle ,MSSQL,PG
NoSQL :Redis,MongoDB,列存储存储相关
NewSQL----->分布式数据库架构
缓存产品介绍:
memcached (大公司会做二次开发)
redis
Tair
```
# 1. Redis功能介绍
```
数据类型丰富 (笔试、面试) *****
支持持久化 (笔试、面试) *****
多种内存分配及回收策略
支持事务 (面试) ****
消息队列、消息订阅
支持高可用 ****
支持分布式分片集群 (面试) *****
缓存穿透\雪崩(笔试、面试) *****
Redis API **
```
# 2、企业缓存产品介绍
```
Memcached:
优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash
多核结构、多线程读写性能高。
缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高
Redis: 优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
缺点:多线程读写较Memcached慢
新浪、京东、直播类平台、网页游戏
memcache 与redis在读写性能的对比
memcached 适合,多用户访问,每个用户少量的rw
redis 适合,少用户访问,每个用户大量rw
Tair:
优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几乎所有淘宝业务的缓存。
缺点:单机情况下,读写性能较其他两种产品较慢
```
# 3、Redis使用场景介绍
```
Memcached:多核的缓存服务,更加适合于多用户并发访问次数较少的应用场景
Redis:单核的缓存服务,单节点情况下,更加适合于少量用户,多次访问的应用场景。
Redis一般是单机多实例架构,配合redis集群出现。
```
# 4、Redis安装部署:
```
下载:
wget http://download.redis.io/releases/redis-3.2.12.tar.gz
解压:
上传至 /data
tar xzf redis-3.2.12.tar.gz
mv redis-3.2.12 redis
安装:
yum -y install gcc automake autoconf libtool make
cd redis
make
环境变量:
vim /etc/profile
export PATH=/data/redis/src:$PATH
source /etc/profile
启动:
redis-server &
连接测试:
redis-cli
127.0.0.1:6379> set num 10
OK
127.0.0.1:6379> get num
10
```
# 5、Redis基本管理操作
## 5.1基础配置文件介绍
```
mkdir /data/6379
cat > /data/6379/redis.conf< daemonize yes port 6379 logfile /data/6379/redis.log dir /data/6379 dbfilename dump.rdb EOF redis-cli shutdown redis-server /data/6379/redis.conf netstat -lnp|grep 63 +++++++++++配置文件说明++++++++++++++ redis.conf 是否后台运行: daemonize yes 默认端口: port 6379 日志文件位置 logfile /var/log/redis.log 持久化文件存储位置 dir /data/6379 RDB持久化数据文件: dbfilename dump.rdb ++++++++++++++++++++++++++++++++++++++ redis-cli 127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> get name "zhangsan" ``` ## 5.2 redis安全配置 ``` redis默认开启了保护模式,只允许本地回环地址登录并访问数据库。 禁止protected-mode protected-mode yes/no (保护模式,是否只允许本地访问) (1)Bind :指定IP进行监听 vim /data/6379/redis.conf bind 10.0.0.51 127.0.0.1 (2)增加requirepass {password} vim /data/6379/redis.conf requirepass 123456 ----------验证----- 方法一: [root@db03 ~]# redis-cli -a 123456 127.0.0.1:6379> set name zhangsan OK 127.0.0.1:6379> exit 方法二: [root@db03 ~]# redis-cli 127.0.0.1:6379> auth 123456 OK 127.0.0.1:6379> set a b [root@db01 src]# redis-cli -a 123 -h 10.0.0.51 -p 6379 10.0.0.51:6379> set b 2 OK ``` ## 5.3 在线查看和修改配置 ``` CONFIG GET * CONFIG GET requirepass CONFIG GET r* CONFIG SET requirepass 123 ``` ## 5.4 redis持久化(内存数据保存到磁盘) ``` RDB、AOF RDB 持久化 可以在指定的时间间隔内生成数据集的 时间点快照(point-in-time snapshot)。 优点:速度快,适合于用做备份,主从复制也是基于RDB持久化功能实现的。 缺点:会有数据丢失 rdb持久化核心配置参数: vim /data/6379/redis.conf dir /data/6379 dbfilename dump.rdb save 900 1 save 300 10 save 60 10000 配置分别表示: 900秒(15分钟)内有1个更改 300秒(5分钟)内有10个更改 60秒内有10000个更改 AOF 持久化(append-only log file) 记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 优点:可以最大程度保证数据不丢 缺点:日志记录量级比较大 AOF持久化配置 appendonly yes appendfsync always appendfsync everysec appendfsync no 是否打开aof日志功能 每1个命令,都立即同步到aof 每秒写1次 写入工作交给操作系统,由操作系统判断缓冲区大小,统一写入到aof. vim /data/6379/redis.conf appendonly yes appendfsync everysec 面试: redis 持久化方式有哪些?有什么区别? rdb:基于快照的持久化,速度更快,一般用作备份,主从复制也是依赖于rdb持久化功能 aof:以追加的方式记录redis操作日志的文件。可以最大程度的保证redis数据安全,类似于mysql的binlog ``` # 6、Redis数据类型(笔试): ``` ## 6.1 介绍 String : 字符类型 Hash: 字典类型 List: 列表 Set: 集合 Sorted set: 有序集合 ``` ![image.png](https://upload-images.jianshu.io/upload_images/16956686-1f727d6d23a61c5b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 6.2 KEY的通用操作 ``` KEYS * keys a keys a* 查看已存在所有键的名字 **** TYPE 返回键所存储值的类型 **** EXPIRE\ PEXPIRE 以秒\毫秒设定生存时间 *** TTL\ PTTL 以秒\毫秒为单位返回生存时间 *** PERSIST 取消生存时间设置 *** DEL 删除一个key EXISTS 检查是否存在 RENAME 变更KEY名 ---例子: 127.0.0.1:6379> set name zhangsan 127.0.0.1:6379> EXPIRE name 60 (integer) 1 127.0.0.1:6379> ttl name (integer) 57 127.0.0.1:6379> set a b ex 60 OK 127.0.0.1:6379> ttl a 127.0.0.1:6379> PERSIST a (integer) 1 127.0.0.1:6379> ttl a (integer) -1 ``` ## 6.3 Strings ``` 应用场景 session 共享 常规计数:微博数,粉丝数,订阅、礼物 key:value (1) set name zhangsan (2) MSET id 101 name zhangsan age 20 gender m 等价于以下操作: SET id 101 set name zhangsan set age 20 set gender m (3)计数器 每点一次关注,都执行以下命令一次 127.0.0.1:6379> incr num 显示粉丝数量: 127.0.0.1:6379> get num 暗箱操作: 127.0.0.1:6379> INCRBY num 10000 (integer) 10006 127.0.0.1:6379> get num "10006" 127.0.0.1:6379> DECRBY num 10000 (integer) 6 127.0.0.1:6379> get num "6" ``` ## 6.4 hash类型(字典类型) ``` 应用场景: 存储部分变更的数据,如用户信息等。 最接近mysql表结构的一种类型 主要是可以做数据库缓存。 存数据: hmset stu id 101 name zhangsan age 20 gender m hmset stu1 id 102 name zhangsan1 age 21 gender f 取数据: HMGET stu id name age gender HMGET stu1 id name age gender select concat("hmset city_",id," id ",id," name ",name) from world.city limit 10 into outfile '/data/backup/hmset.txt' ``` ## 6.5 LIST(列表) ``` 应用场景 消息队列系统 比如sina微博 在Redis中我们的最新微博ID使用了常驻缓存,这是一直更新的。 但是做了限制不能超过5000个ID,因此获取ID的函数会一直询问Redis。 只有在start/count参数超出了这个范围的时候,才需要去访问数据库。 系统不会像传统方式那样“刷新”缓存,Redis实例中的信息永远是一致的。 SQL数据库(或是硬盘上的其他类型数据库)只是在用户需要获取“很远”的数据时才会被触发, 而主页或第一个评论页是不会麻烦到硬盘上的数据库了。 微信朋友圈: 127.0.0.1:6379> LPUSH wechat "today is nice day !" 127.0.0.1:6379> LPUSH wechat "today is bad day !" 127.0.0.1:6379> LPUSH wechat "today is good day !" 127.0.0.1:6379> LPUSH wechat "today is rainy day !" 127.0.0.1:6379> LPUSH wechat "today is friday !" [5,4,3,2,1] 0 1 2 3 4 [e,d,c,b,a] 0 1 2 3 4 127.0.0.1:6379> lrange wechat 0 0 1) "today is friday !" 127.0.0.1:6379> lrange wechat 0 1 1) "today is friday !" 2) "today is rainy day !" 127.0.0.1:6379> lrange wechat 0 2 1) "today is friday !" 2) "today is rainy day !" 3) "today is good day !" 127.0.0.1:6379> lrange wechat 0 3 127.0.0.1:6379> lrange wechat -2 -1 1) "today is bad day !" 2) "today is nice day !" ``` ## 6.6 SET 集合类型(join union) ``` 应用场景: 案例:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。 Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能, 对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。 127.0.0.1:6379> sadd lxl pg1 jnl baoqiang gsy alexsb (integer) 5 127.0.0.1:6379> sadd jnl baoqiang ms bbh yf wxg (integer) 5 .... 127.0.0.1:6379> SUNION lxl jnl 1) "baoqiang" 2) "yf" 3) "bbh" 4) "ms" 5) "wxg" 127.0.0.1:6379> SUNION lxl jnl 1) "gsy" 2) "yf" 3) "alexsb" 4) "bbh" 5) "jnl" 6) "pg1" 7) "baoqiang" 8) "ms" 9) "wxg" 127.0.0.1:6379> ...... 127.0.0.1:6379> SINTER lxl jnl 1) "baoqiang" ........ 127.0.0.1:6379> SDIFF jnl lxl 1) "wxg" 2) "yf" 3) "bbh" 4) "ms" 127.0.0.1:6379> 127.0.0.1:6379> SDIFF lxl jnl 1) "jnl" 2) "pg1" 3) "gsy" 4) "alexsb" ..... ``` ## 6.7 SortedSet(有序集合) ``` 应用场景: 排行榜应用,取TOP N操作 这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序, 这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。 127.0.0.1:6379> zadd topN 0 smlt 0 fskl 0 fshkl 0 lzlsfs 0 wdhbx 0 wxg (integer) 6 127.0.0.1:6379> ZINCRBY topN 100000 smlt "100000" 127.0.0.1:6379> ZINCRBY topN 10000 fskl "10000" 127.0.0.1:6379> ZINCRBY topN 1000000 fshkl "1000000" 127.0.0.1:6379> ZINCRBY topN 100 lzlsfs "100" 127.0.0.1:6379> ZINCRBY topN 10 wdhbx "10" 127.0.0.1:6379> ZINCRBY topN 100000000 wxg "100000000" 127.0.0.1:6379> ZREVRANGE topN 0 2 1) "wxg" 2) "fshkl" 3) "smlt" 127.0.0.1:6379> ZREVRANGE topN 0 2 withscores 1) "wxg" 2) "100000000" 3) "fshkl" 4) "1000000" 5) "smlt" 6) "100000" 127.0.0.1:6379> ``` # 7、Redis事务 ``` redis的事务是基于队列实现的。 mysql的事务是基于事务日志和锁机制实现的。 redis是乐观锁机制。 开启事务功能时(multi) multi command1 command2 command3 command4 exec discard 4条语句作为一个组,并没有真正执行,而是被放入同一队列中。 如果,这是执行discard,会直接丢弃队列中所有的命令,而不是做回滚。 exec 当执行exec时,对列中所有操作,要么全成功要么全失败 127.0.0.1:6379> set a b OK 127.0.0.1:6379> MULTI OK 127.0.0.1:6379> set a b QUEUED 127.0.0.1:6379> set c d QUEUED 127.0.0.1:6379> exec 1) OK 2) OK ``` # 8、redis(Master-Replicaset) ***** ## 8.1 原理: ``` 1. 副本库通过slaveof 10.0.0.51 6379命令,连接主库,并发送SYNC给主库 2. 主库收到SYNC,会立即触发BGSAVE,后台保存RDB,发送给副本库 3. 副本库接收后会应用RDB快照 4. 主库会陆续将中间产生的新的操作,保存并发送给副本库 5. 到此,我们主复制集就正常工作了 6. 再此以后,主库只要发生新的操作,都会以命令传播的形式自动发送给副本库. 7. 所有复制相关信息,从info信息中都可以查到.即使重启任何节点,他的主从关系依然都在. 8. 如果发生主从关系断开时,从库数据没有任何损坏,在下次重连之后,从库发送PSYNC给主库 9. 主库只会将从库缺失部分的数据同步给从库应用,达到快速恢复主从的目的 ``` ## 8.2 主从数据一致性保证 ``` min-slaves-to-write 1 min-slaves-max-lag 3 ``` ## 8.3 主库是否要开启持久化? ``` 如果不开有可能,主库重启操作,造成所有主从数据丢失! ``` # 9. 主从复制实现 ``` 1、环境: 准备两个或两个以上redis实例 mkdir /data/638{0..2} 配置文件示例: cat >> /data/6380/redis.conf < port 6380 daemonize yes pidfile /data/6380/redis.pid loglevel notice logfile "/data/6380/redis.log" dbfilename dump.rdb dir /data/6380 requirepass 123 masterauth 123 EOF cat >> /data/6381/redis.conf < port 6381 daemonize yes pidfile /data/6381/redis.pid loglevel notice logfile "/data/6381/redis.log" dbfilename dump.rdb dir /data/6381 requirepass 123 masterauth 123 EOF cat >> /data/6382/redis.conf < port 6382 daemonize yes pidfile /data/6382/redis.pid loglevel notice logfile "/data/6382/redis.log" dbfilename dump.rdb dir /data/6382 requirepass 123 masterauth 123 EOF 启动: redis-server /data/6380/redis.conf redis-server /data/6381/redis.conf redis-server /data/6382/redis.conf 主节点:6380 从节点:6381、6382 2、开启主从: 6381/6382命令行: redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380 redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380 3、查询主从状态 redis-cli -p 6380 -a 123 info replication redis-cli -p 6381 -a 123 info replication redis-cli -p 6382 -a 123 info replication ``` # 10 redis-sentinel(哨兵) ``` 1、监控 2、自动选主,切换(6381 slaveof no one) 3、2号从库(6382)指向新主库(6381) 4、应用透明 5、自动处理故障节点 sentinel搭建过程 mkdir /data/26380 cd /data/26380 vim sentinel.conf port 26380 dir "/data/26380" sentinel monitor mymaster 127.0.0.1 6380 1 sentinel down-after-milliseconds mymaster 5000 sentinel auth-pass mymaster 123 启动: [root@db01 26380]# redis-sentinel /data/26380/sentinel.conf &>/tmp/sentinel.log & ============================== 如果有问题: 1、重新准备1主2从环境 2、kill掉sentinel进程 3、删除sentinel目录下的所有文件 4、重新搭建sentinel ====================================== 停主库测试: [root@db01 ~]# redis-cli -p 6380 shutdown [root@db01 ~]# redis-cli -p 6381 info replication 启动源主库(6380),看状态。 Sentinel管理命令: redis-cli -p 26380 PING :返回 PONG 。 SENTINEL masters :列出所有被监视的主服务器 SENTINEL slaves SENTINEL get-master-addr-by-name SENTINEL reset SENTINEL failover ``` # 11. redis cluster ![image.png](https://upload-images.jianshu.io/upload_images/16956686-f16bbe65c8764050.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ## 11.1 介绍 ### 高性能 ``` 1、在多分片节点中,将16384个槽位,均匀分布到多个分片节点中 2、存数据时,将key做crc16(key),然后和16384进行取模,得出槽位值(0-16383之间) 3、根据计算得出的槽位值,找到相对应的分片节点的主节点,存储到相应槽位上 4、如果客户端当时连接的节点不是将来要存储的分片节点,分片集群会将客户端连接切换至真正存储节点进行数据存储 ``` ### 高可用: ``` 在搭建集群时,会为每一个分片的主节点,对应一个从节点,实现slaveof的功能,同时当主节点down,实现类似于sentinel的自动failover的功能。 1、redis会有多组分片构成(3组) 2、redis cluster 使用固定个数的slot存储数据(一共16384slot) 3、每组分片分得1/3 slot个数(0-5500 5501-11000 11001-16383) 4、基于CRC16(key) % 16384 ====》值 (槽位号)。 ``` ## 11.2 规划、搭建过程: ``` 6个redis实例,一般会放到3台硬件服务器 注:在企业规划中,一个分片的两个分到不同的物理机,防止硬件主机宕机造成的整个分片数据丢失。 端口号:7000-7005 ``` ### 安装集群插件 ``` EPEL源安装ruby支持 yum install ruby rubygems -y 使用国内源 gem sources -l gem sources -a http://mirrors.aliyun.com/rubygems/ gem sources --remove https://rubygems.org/ gem sources -l gem install redis -v 3.3.3 ``` ### 集群节点准备 ``` mkdir /data/700{0..5} cat > /data/7000/redis.conf < port 7000 daemonize yes pidfile /data/7000/redis.pid loglevel notice logfile "/data/7000/redis.log" dbfilename dump.rdb dir /data/7000 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat >> /data/7001/redis.conf < port 7001 daemonize yes pidfile /data/7001/redis.pid loglevel notice logfile "/data/7001/redis.log" dbfilename dump.rdb dir /data/7001 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat >> /data/7002/redis.conf < port 7002 daemonize yes pidfile /data/7002/redis.pid loglevel notice logfile "/data/7002/redis.log" dbfilename dump.rdb dir /data/7002 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat >> /data/7003/redis.conf < port 7003 daemonize yes pidfile /data/7003/redis.pid loglevel notice logfile "/data/7003/redis.log" dbfilename dump.rdb dir /data/7003 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat >> /data/7004/redis.conf < port 7004 daemonize yes pidfile /data/7004/redis.pid loglevel notice logfile "/data/7004/redis.log" dbfilename dump.rdb dir /data/7004 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat >> /data/7005/redis.conf < port 7005 daemonize yes pidfile /data/7005/redis.pid loglevel notice logfile "/data/7005/redis.log" dbfilename dump.rdb dir /data/7005 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF ``` ### 启动节点: ``` redis-server /data/7000/redis.conf redis-server /data/7001/redis.conf redis-server /data/7002/redis.conf redis-server /data/7003/redis.conf redis-server /data/7004/redis.conf redis-server /data/7005/redis.conf [root@db01 ~]# ps -ef |grep redis root 8854 1 0 03:56 ? 00:00:00 redis-server *:7000 [cluster] root 8858 1 0 03:56 ? 00:00:00 redis-server *:7001 [cluster] root 8860 1 0 03:56 ? 00:00:00 redis-server *:7002 [cluster] root 8864 1 0 03:56 ? 00:00:00 redis-server *:7003 [cluster] root 8866 1 0 03:56 ? 00:00:00 redis-server *:7004 [cluster] root 8874 1 0 03:56 ? 00:00:00 redis-server *:7005 [cluster] ``` ### 将节点加入集群管理 ``` 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 ``` ### 集群状态查看 ``` 集群主节点状态 redis-cli -p 7000 cluster nodes | grep master 集群从节点状态 redis-cli -p 7000 cluster nodes | grep slave ``` ## 11.3 集群节点管理 ### 增加新的节点 ``` mkdir /data/7006 mkdir /data/7007 cat > /data/7006/redis.conf < port 7006 daemonize yes pidfile /data/7006/redis.pid loglevel notice logfile "/data/7006/redis.log" dbfilename dump.rdb dir /data/7006 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF cat > /data/7007/redis.conf < port 7007 daemonize yes pidfile /data/7007/redis.pid loglevel notice logfile "/data/7007/redis.log" dbfilename dump.rdb dir /data/7007 protected-mode no cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes EOF redis-server /data/7006/redis.conf redis-server /data/7007/redis.conf ``` ### 添加主节点: ``` redis-trib.rb add-node 127.0.0.1:7006 127.0.0.1:7000 ``` ### 转移slot(重新分片) ``` redis-trib.rb reshard 127.0.0.1:7000 ``` ### 添加一个从节点 ``` redis-trib.rb add-node --slave --master-id 8ff9ef5b78e6da62bd7b362e1fe190cba19ef5ae 127.0.0.1:7007 127.0.0.1:7000 ``` ## 11.4 删除节点 ### 将需要删除节点slot移动走 ``` redis-trib.rb reshard 127.0.0.1:7000 49257f251824dd815bc7f31e1118b670365e861a 127.0.0.1:7006 0-1364 5461-6826 10923-12287 1365 1366 1365 ``` ### 删除一个节点 ``` 删除master节点之前首先要使用reshard移除master的全部slot,然后再删除当前节点 redis-trib.rb del-node 127.0.0.1:7006 8ff9ef5b78e6da62bd7b362e1fe190cba19ef5ae --------------------- 设置redis最大内存 config set maxmemory 102400000 --------------------- ``` # 12. redis的多API支持 ``` python为例 yum install -y python36 python3 -V yum install -y python36-pip pip3 install redis pip3 install redis-py-cluster ++++++++++++源码方式+++++++++++++++ https://redis.io/clients 下载redis-py-master.zip 安装驱动: unzip redis-py-master.zip cd redis-py-master python3 setup.py install redis cluster的连接并操作(python2.7.2以上版本才支持redis cluster,我们选择的是3.6) https://github.com/Grokzen/redis-py-cluster 安装redis-cluser的客户端程序 cd redis-py-cluster-unstable python3 setup.py install +++++++++++++++++++++++++++++++++ ``` ## 对redis的单实例进行连接操作 ``` [root@db01 ~]# redis-server /data/6379/redis.conf python3 >>>import redis >>>r = redis.StrictRedis(host='10.0.0.51', port=6379, db=0,password='123456') >>>r.set('oldboy', 'oldguo') >>>r.get('oldboy') ``` ## 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,password="123") #读节点 >>> slave = sentinel.slave_for('mymaster', socket_timeout=0.1,password="123") ###读写分离测试 key >>> master.set('oldboy', '123') >>> slave.get('oldboy') ``` ## python连接rediscluster集群测试 ``` 使用 python3 >>> from rediscluster import StrictRedisCluster >>> startup_nodes = [{"host":"127.0.0.1", "port": "7000"},{"host":"127.0.0.1", "port": "7001"},{"host":"127.0.0.1", "port": "7002"}] ### 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 >>> print(rc.get("foo")) 'bar' ```