作者介绍:简历上没有一个精通的运维工程师。请点击上方的蓝色《运维小路》关注我,下面的思维导图也是预计更新的内容和当前进度(不定时更新)。

数据库是一个系统(应用)最重要的资产之一,所以我们的数据库将从以下几个数据库来进行介绍。
MySQL
PostgreSQL
Redis(本章节)
Etcd
我们前面介绍了单机,主从,哨兵,集群多种Redis部署方式,他们的链接方式也是不一样的,所以我们用一个小节来介绍程序代码应该如何链接不同方式的Redis,后续都时使用Python代码,这里为了简单所以配置都在代码里面。
基础准备
# 安装pip
yum -y install python-pip
# 安装依赖,这个版本才支持低版本的redis
pip install redis==3.5.3
# 如果需要连接集群
pip install redis-py-cluster单机Redis链接
# coding: utf-8
import redis
# 基础连接
redis_client = redis.Redis(
host='localhost',
port=6379,
db=0,
password=None, # 如果有密码
decode_responses=True # 自动解码返回字符串
)
# 测试连接
try:
redis_client.ping()
print("单机Redis连接成功")
except Exception as e:
print("连接失败:", str(e))
# 基本操作示例
redis_client.set('key', 'value')
value = redis_client.get('key')
print(value)
主从Redis链接
如果你不需要读写分立,那么可以和单机Redis链接方式一样,
import redis
master = redis.Redis(host='192.168.31.196', port=6379)
slave = redis.Redis(host='192.168.31.197', port=6379)
print("Redis Master-Slave Test")
print("Master: 192.168.31.196:6379")
print("Slave: 192.168.31.197:6379")
print("-" * 30)
# Write to master
print("1. Write to master...")
master.set('test_key', 'test_value')
print("Write success: key=test_key, value=test_value")
# Read from slave
print("\n2. Read from slave...")
result = slave.get('test_key')
if result:
print("Read success: %s" % result)
else:
print("Read failed")
print("\n3. Test complete")

哨兵
这里的Redis代码直接链接的是Redis哨兵地址,并没有直接链接Redis实例,当主从切换以后,他还是可以获取当前的Master,进行写入操作。
# -*- coding: utf-8 -*-
import redis
from redis.sentinel import Sentinel
import time
# 哨兵配置
sentinel = Sentinel([
('192.168.31.196', 26379),
('192.168.31.197', 26379),
('192.168.31.197', 26379)
])
print("Redis哨兵写入测试")
print("=" * 40)
try:
# 第一次写入
print("第一次写入...")
master = sentinel.master_for('mymaster', decode_responses=True)
master_info = sentinel.discover_master('mymaster')
print("当前主节点: %s:%s" % (master_info[0], master_info[1]))
master.set('test_key', 'value1')
print("写入: test_key=value1")
# 等待30秒
print("\n等待30秒...")
for i in range(30):
time.sleep(1)
if (i+1) % 10 == 0:
print("已等待 %d 秒" % (i+1))
# 第二次写入
print("\n第二次写入...")
master = sentinel.master_for('mymaster', decode_responses=True)
new_master_info = sentinel.discover_master('mymaster')
print("当前主节点: %s:%s" % (new_master_info[0], new_master_info[1]))
# 检查是否切换
if master_info != new_master_info:
print("主节点已切换!")
print("原主节点: %s:%s" % (master_info[0], master_info[1]))
print("新主节点: %s:%s" % (new_master_info[0], new_master_info[1]))
else:
print("主节点未切换")
master.set('test_key', 'value2')
print("写入: test_key=value2")
# 显示最终数据
value = master.get('test_key')
print("最终数据: test_key=%s" % value)
print("\n测试完成!")
except Exception as e:
print("\n错误: %s" % str(e))
print("请检查哨兵配置和连接")
集群
当然这里只写了一个地址,真实环境肯定会写满地址。
# -*- coding: utf-8 -*-
from rediscluster import RedisCluster
import redis
# 连接到集群
rc = RedisCluster(
startup_nodes=[{"host": "127.0.0.1", "port": 7001}],
decode_responses=True,
skip_full_coverage_check=True
)
print("Redis集群槽位分布测试")
print("=" * 50)
# 测试几个键
test_data = {
"user:1": "Alice",
"user:100": "Bob",
"user:1000": "Charlie",
"order:1": "Order1",
"order:100": "Order100",
"item:A": "ItemA",
"item:Z": "ItemZ"
}
print("\n键的槽位分布:")
print("Key\t\t\tSlot\tNode")
print("-" * 40)
for key, value in test_data.items():
rc.set(key, value)
# 获取槽位
r = redis.Redis(host='127.0.0.1', port=7001, decode_responses=True)
slot = r.execute_command('CLUSTER KEYSLOT', key)
# 判断节点
if 0 <= slot <= 5460:
node = "7001"
elif 5461 <= slot <= 10922:
node = "7002"
else:
node = "7003"
print("%-15s\t%5d\t%s" % (key, slot, node))
print("\n" + "=" * 50)
print("槽位范围:")
print("7001: 0 - 5460")
print("7002: 5461 - 10922")
print("7003: 10923 - 16383")

历史内容推荐
MongoDB 角色和权限,管理员,复制集,分片集群,wiredtiger,OpLog,纯内存引擎
PostgreSQL 权限,模式,块复制,逻辑复制,Patroni,物理备份,模式
MySQL crud,user,innodb,索引,主从,物理备份,系统表,视图,MariaDB
Elasticsearch(es) 倒排索引,分词,lucene,ELFK,索引,副本,分片,web管理
Hadoop HDFS dn,nn,jn,分块,副本,配额,快照,回收站,追加模式,Kerberos
RabbitMQ,虚拟主机,交换机,队列,绑定,持久化,镜像队列,网络分区,RocketMQ
Kafka-集群部署,Topic,分区,副本,生产者,消费者(组),持久化,顺序读写,零拷贝,扩容
ZooKeeper-集群部署和选举,读写流程,事务日志,数据和快照,ACL,4字命令,监控和备份
Squid,HAProxy,LVS,Keepalived,内网穿透FRP
Web服务器-Nginx反向代理,负载均衡,安全配置,日志,流量镜像,websocket,跨域
Kubernetes(k8s)-基本概念,部署,工作负载,服务,网络,存储,配置,调度,证书,监控
Docker-docker基本信息,基本命令,dockerfile,原理,仓库,存储网络日志,番外篇
云计算&虚拟化-包括服务器购买,虚拟化介绍,虚拟磁盘,虚拟网络,创建虚拟机,安装虚拟机
dashboard,xml解释,克隆,快照,初始化,esxi介绍