一、与Python交互
- 引入模块
from redis import *
这个模块中提供了StrictRedis对象,用于连接redis服务器,并按照不同类型提供了不同方法,进行交互操作
- 使用redis服务
from redis import *
if __name__ == '__main__':
# 创建redis服务的连接对象
# 默认StrictRedis(host="127.0.0.1", port=6379)
r = StrictRedis()
# 调用String类型数据的增删改查的方法
r.set("py", "666")
r.set("py", "555")
r.delete("py")
r_dara = r.get("py")
print(type(r_dara))
if r_dara:
print(r_dara.decode())
系统 | 说明 |
---|---|
Windows |
下载地址: https://github.com/MicrosoftArchive/redis/releases 使用说明: |
二、主从配置
一个master可以拥有多个slave
一个slave又可以拥有多个slave
如此下去,形成了强大的多级服务器集群架构
提示:
- 读写分离
- 主机主要是写入数据
- 从机只能读数据,不能完成数据的写入操作
eg:
将ip为192.168.1.10的机器作为主服务器,将ip为192.168.1.11的机器作为从服务器
主机——192.168.1.10的机器
vim /etc/redis.conf
bind 192.168.1.10
从机——192.168.1.11的机器
bind 192.168.1.11
slaveof 192.168.1.10 6379
Q1: 云服务器CentOS7修改redis的配置中的IP地址为外网地址后,用systemctl重启后失败
不能改为外网地址,因为公网(外网)是映射得到的,bind地址必须是内网地址或127.0.0.1,但主机配置redis时必须用内网地址
【参阅】
Q2:主机是云服务器,从机是虚拟机中的服务器,从机中
slaveof
后的地址是云服务器的外网地址而不是用内网地址,端口号就是主机的redis服务的端口号
三、搭建集群
集群至少三主三从
必须有3个及以上的主节点时,才可以创建集群,否则会失败
优点:
抗风险、主从替换保证数据的完整性搭建方式:
为了演示,选择在两台机器上通过六个配置文件启动6个redis服务
注意:
- 仅仅看效果,最好就选一台机器运行6个redis服务就行了,我一个云服务器一个虚拟机就失败,后面只用一台云服务器或虚拟机就成功了
- 云服务器单个运行6个redis服务时,配置文件ip用内网地址,redis-trib命令的ip用外网地址
开启机器对应端口
eg:
单个机器配置6个的话(配置文件IP是7000-7005),就开启7000/7005和17000/17005共12个端口
- 集群服务的配置文件的信息示例
注意根据自己的电脑IP修改IP地址
eg:
- IP地址为192.168.12.107的主机
三个文件的配置区别在port、pidfile、cluster-config-file三项
主机1
port 7000
bind 192.168.12.107
daemonize yes
pidfile 7000.pid
cluster-enabled yes
cluster-config-file 7000_node.conf
cluster-node-timeout 15000
appendonly yes
主机2
port 7001
bind 192.168.12.107
daemonize yes
pidfile 7001.pid
cluster-enabled yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes
主机3
port 7002
bind 192.168.12.107
daemonize yes
pidfile 7002.pid
cluster-enabled yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes
- IP地址为192.168.12.108的从机
三个文件的配置区别在port、pidfile、cluster-config-file三项
从机1
port 7003
bind 192.168.12.108
daemonize yes
pidfile 7003.pid
cluster-enabled yes
cluster-config-file 7003_node.conf
cluster-node-timeout 15000
appendonly yes
从机2
port 7004
bind 192.168.12.108
daemonize yes
pidfile 7004.pid
cluster-enabled yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes
从机3
port 7005
bind 192.168.12.108
daemonize yes
pidfile 7005.pid
cluster-enabled yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes
3.1 搭建过程
- 创建服务的目录
mkdir redis
cd redis
- 编写配置文件
IP地址为192.168.12.107的主机
vim 7000.conf
vim 7001.conf
vim 7002.conf
IP地址为192.168.12.108的从机
vim 7003.conf
vim 7004.conf
vim 7005.conf
- 启动服务
启动不了,就关闭网络再试试
格式:redis-server 配置文件
进程查看:ps aux| grep redis
IP地址为192.168.12.107的主机
redis-server 7000.conf
redis-server 7001.conf
redis-server 7002.conf
IP地址为192.168.12.107的从机
redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf
- 安装redis-trib
Redis 集群命令行工具
yum install redis-trib -y
- 创建集群
注意开启对应端口
redis-trib create --replicas 1 192.168.12.107:7000 192.168.12.107:7001 192.168.12.107:7002 192.168.12.108:7003 192.168.12.108:7004 192.168.12.108:7005
Q3:不知道为什么云服务器执行redis-trib create时,就会无法访问我的虚拟机;而虚拟机执行,就可以进入下一步了?
Q4:到了这一步,我一个云服务器和一个虚拟机的做法就进行不下去了?无线等待
换了方式:直接在云服务器中运行6个redis服务,而不采用一个虚拟机一个云服务器的做法,这次成功了
提示:
- slot哈希槽,用来存储数据的,16384个哈希槽就意味着可以存储16384条数据
参阅:
3.2 验证集群
当存活的主节点数低于总节点数的一半时,整个集群无法提供服务
进入集群的redis-cli命令格式:redis-cli -h IP地址 -c -p 端口号
参数:-c表示连接到集群
-
CRC16算法
默认16384个哈希槽(hash slot)
管理在哪个服务器上写数据,有去中心化等特点
3.4 集群性能指标
Redis是个单线程模型
对于1G带宽来说,延迟时间一般是200μs
通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息
info命令输出的数据可分为9个类别
数据类别 | 说明 |
---|---|
Server |
info server |
Clients |
info clients |
Memory |
info memory used_memory 内存使用率 |
Persistence |
info persistence |
Stats |
info stats |
Replication |
info replication |
CPU |
info cpu |
Cluster |
info cluster |
Keyspace |
info keyspace |
3.3.1 内存使用率
3.3.2 命令处理数
命令处理总数确实是处于上升或下降状态,有2个原因引起的:
➢ 命令队列里的命令数量过多,后面命令一直在等待中
➢几个慢命令阻塞Redis
解决办法:
➢ 使用多参数命令
➢ 管道命令
➢ 避免操作大集合的慢命令
3.3.3 响应时间
查看响应时间:redis-cli --latency -h 127.0.0.1 -p 6379
参阅:
3.4 集群与Python交互
- 安装redis-py-cluster
pip3 install redis-py-cluster
注意加入自己主机的外网IP
第一种解码方式:
.decode()
from rediscluster import RedisCluster
if __name__ == '__main__':
# 创建集群的连接对象
startup_nodes = [
{'host': 'IP', 'port': '7000'},
{'host': 'IP', 'port': '7001'},
{'host': 'IP', 'port': '7002'}]
rc = RedisCluster(host="IP", startup_nodes=startup_nodes)
rc.set("py666", 666)
rc_data = rc.get("py666").decode()
print(rc_data)
第二种解码方式:
decode_responses=True
from rediscluster import RedisCluster
if __name__ == '__main__':
# 创建集群的连接对象
startup_nodes = [
{'host': 'IP', 'port': '7000'},
{'host': 'IP', 'port': '7001'},
{'host': 'IP', 'port': '7002'}]
rc = RedisCluster(host="IP", startup_nodes=startup_nodes, decode_responses=True)
rc.set("py666", 666)
rc_data = rc.get("py666")
print(rc_data)
更新中......