首页 > 数据库 >redis,python操作哨兵,python操作集群,缓存优化,缓存击穿,穿透,雪崩

redis,python操作哨兵,python操作集群,缓存优化,缓存击穿,穿透,雪崩

时间:2023-04-26 16:00:45浏览次数:37  
标签:src 缓存 python redis cluster conf 7000

python操作哨兵

高可用架构后》不能直接连接某一个主库》主库可能会挂掉,后来他就不是主库了

之前的连接redis操作就不能用了

import redis
conn=redis.Redis(host='',port=6379)
conn.set()
conn.close()

新的连接哨兵的操作

连接哨兵服务器(主机名也可以用做域名)

配置文件

# redis-server配置文件
port 6379
daemonize yes
bind 0.0.0.0
logfile "redis_sentinel.log"

port 6380
daemonize yes
bind 0.0.0.0
logfile "redis_sentinel.log"
replicaof 10.0.0.200 6379
replica-read-only yes


port 6381
daemonize yes
bind 0.0.0.0
logfile "redis_sentinel.log"
replicaof 10.0.0.200 6379
replica-read-only yes

# 哨兵配置文件

port 26379
daemonize yes
dir "/root/redis-6.2.9/data"
bind 0.0.0.0
logfile "redis_sentinel.log"
sentinel monitor mymaster 10.0.0.200 6379 2


port 26380
daemonize yes
dir "/root/redis-6.2.9/data1"
bind 0.0.0.0
logfile "redis_sentinel.log"
sentinel monitor mymaster 10.0.0.200 6379 2


port 26381
daemonize yes
dir "/root/redis-6.2.9/data2"
bind 0.0.0.0
logfile "redis_sentinel.log"
sentinel monitor mymaster 10.0.0.200 6379 2



#开启redis主从
./src/redis-server ./conf/redis_6379.conf 
./src/redis-server ./conf/redis_6380.conf 
./src/redis-server ./conf/redis_6381.conf 

# 开启哨兵
./src/redis-sentinel ./conf/redis_26379.conf 
./src/redis-sentinel ./conf/redis_26381.conf 
./src/redis-sentinel ./conf/redis_26380.conf 

python操作哨兵

import redis
from redis import Sentinel

sentine = Sentinel([
    ('10.0.0.200', 26379),
    ('10.0.0.200', 26380),
    ('10.0.0.200', 26381)
], socket_timeout=5)

print(sentine)
master = sentine.discover_master('mymaster')
print(master)

"""
('10.0.0.200', 6379)
[('10.0.0.200', 6381), ('10.0.0.200', 6380)]
"""

读写分离

获取主服务器进行写入

# 获取主库
master = sentine.master_for('mymaster')
# 获取一个从库
slave = sentine.slave_for('mymaster')
master.set('name','lqz')
print(slave.get('name'))

注意:要写机器的ip地址,不要写127.0.0.1,想在公网用,python要是再内网中使用,要写内网的ip

python操作集群

redis集群搭建

节点(某一台机器),meet(节点跟节点之间通过meet通信),指派操(16384个槽分给几个节点),复制(主从复制),高可用(主节点挂掉,从节点顶上)

第一步准备6台机器,写6个配置文件

port 7000
daemonize yes
bind 0.0.0.0
dir "/root/redis/data/"
logfile "7000.log"
protected-mode no

cluster-enabled yes
cluster-node-timeout 15000
cluster-config-file nodes-7000.conf
cluster-require-full-coverage yes

第二步:快速复制6个配置问题,并修改配置文件

快速生成其他配置

sed 's/7000/7001/g' redis_7000.conf > redis_7001.conf
sed 's/7000/7002/g' redis_7000.conf > redis_7002.conf
sed 's/7000/7003/g' redis_7000.conf > redis_7003.conf
sed 's/7000/7004/g' redis_7000.conf > redis_7004.conf
sed 's/7000/7005/g' redis_7000.conf > redis_7005.conf

第三步:启动6个redis服务

./src/redis-server ./conf/redis_7000.conf
./src/redis-server ./conf/redis_7001.conf
./src/redis-server ./conf/redis_7002.conf
./src/redis-server ./conf/redis_7003.conf
./src/redis-server ./conf/redis_7004.conf
./src/redis-server ./conf/redis_7005.conf


# 查看运行状态
ps -ef|grep redis

第四步:

./src/redis-cli --cluster create --cluster-replicas 1 10.0.0.200:7000 10.0.0.200:7001 10.0.0.200:7002 10.0.0.200:7003 10.0.0.200:7004 10.0.0.200:7005

第五步:

redis-cli -p 7000 cluster info
redis-cli -p 7000 cluster nodes
redis-cli -p 7000 cluster slots # 查看槽的信息

第六步:测试,存数据

./src/redis-cli -p 7000 -c

image-20230425232907076

一旦搭建了集群,python操作也变了

集群扩容,缩容

1.2 集群扩容

#1 准备两台机器
sed 's/7000/7006/g' redis-7000.conf > redis-7006.conf
sed 's/7000/7007/g' redis-7000.conf > redis-7007.conf
#2 启动两台机器
./src/redis-server ./redis-7006.conf
./src/redis-server ./redis-7007.conf

# 3 两台机器加入到集群中去
./src/redis-cli --cluster add-node 127.0.0.1:7006 127.0.0.1:7000
./src/redis-cli --cluster add-node 127.0.0.1:7007 127.0.0.1:7000
        
# 4 让7007复制7006
./src/redis-cli -p 7007 cluster replicate baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a
        
# 5 迁移槽
./src/redis-cli --cluster reshard 127.0.0.1:7000 
    -迁移4096个槽
    -7006的机器接收槽
    -all

1.3 集群缩容

# 第一步:下线迁槽(把7006的1366个槽迁移到7000上)
redis-cli --cluster reshard --cluster-from baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a --cluster-to 050bfd3608514d4db5d2ce5411ef5989bbe50867 --cluster-slots 1365 127.0.0.1:7000
yes

redis-cli --cluster reshard --cluster-from baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a --cluster-to 9cb2a9b8c2e7b63347a9787896803c0954e65b40 --cluster-slots 1366 127.0.0.1:7001
yes

redis-cli --cluster reshard --cluster-from baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a --cluster-to d3aea3d0b4cf90f58252cf3bcd89530943f52d36 --cluster-slots 1366 127.0.0.1:7002
yes


#第二步:下线节点 忘记节点,关闭节点
./src/redis-cli --cluster del-node 127.0.0.1:7000 9c2abbfaa4d1fb94b74df04ce2b481512e6edbf3 # 先下从,再下主,因为先下主会触发故障转移
./src/redis-cli --cluster del-node 127.0.0.1:7000 baf261f2e6cb2b0359d25420b3ddc3d1b8d3bb5a

# 第三步:关掉其中一个主,另一个从立马变成主顶上, 重启停止的主,发现变成了从

安装模块rediscluster

pip3 install redis-py-cluster

操作代码

from rediscluster import RedisCluster
startup_nodes = [{"host":"10.0.0.200", "port": "7000"},{"host":"10.0.0.200", "port": "7001"},{"host":"10.0.0.200", "port": "7002"}]
# rc = RedisCluster(startup_nodes=startup_nodes,decode_responses=True)
rc = RedisCluster(startup_nodes=startup_nodes)
# rc.set("xxx", "bar")
print(rc.get("xxx"))

缓存优化

redis缓存更新策略

redis本身,内存存储,会出现内存不够用,放数据放不进去,有些策略,删除一部分数据,在放新的

LRU/LFU/FIFO算法剔除:例如maxmemory-policy(到了最大内存,对应的应对策略)

LRU -Least Recently Used,没有被使用时间最长的

LFU -Least Frequenty Used,一定时间段内使用次数最少的

FIFO -First In FIrst OUt 先进先出(队列)

缓存击穿,雪崩,穿透

缓存穿透

缓存穿透式指缓存和数据库中都没有的数据,而用户不断发起请求,这时的用户很可能是攻击者,攻击者会导致数据库压力过大

解决方案:

1.接口层增加校验

2.从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存时间可以设置短点。

3.布隆过滤器实现

缓存击穿

缓存击穿是指缓存中没有但数据有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读取缓存没读取到数据,又同时去数据库取数据,引起数据库压力瞬间增大,造成过大压力

解决方案:

设置热点数据永远不过期

缓存雪崩

缓存雪崩是指缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机,和缓存击穿不同的是缓存击穿指并发查询同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。

解决方案:

1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。

2.如果缓存数据库是分布式部署,将热点数据均匀分布再不同的缓存数据库中

3.设置热点数据永远不过期

标签:src,缓存,python,redis,cluster,conf,7000
From: https://www.cnblogs.com/clever-cat/p/17356327.html

相关文章

  • Python中的del、pop、remove、clear
    del是Python中的一个关键字,用于删除变量、列表元素、字典键值对等1.删除变量:可以使用del关键字来删除变量,例如:a=10dela2.删除列表元素:可以使用del关键字来删除列表中的元素,例如:list=[1,2,3,4,5]dellist[2]3.删除键值对dict={'name':'Tom',,'age':18}deldict['nam......
  • 全网最详细的Python安装教程
    https://zhuanlan.zhihu.com/p/569019068 1.首先打开下载配置环境  https://www.python.org/downloads/windows/ 2.64位操作系统:找到windowsx86-64executableinstaller并点击,耐心等待下载完成!3.安装python4.2-1下载完后双击点开python-3.7.4.exe 下面两个都 ......
  • 【go】go语言变量类型 常量 函数基础 函数高级 setuptools将python项目打包 前后端联
    目录昨日回顾使用setuptools将python项目打包前后端联调今日内容1go语言变量类型2常量3函数基础4函数高级补充昨日回顾使用setuptools将python项目打包#https://zhuanlan.zhihu.com/p/624648232#python----》setuptools--》whl包结构 公司内部写了包---》公司内部用---......
  • pytest之.pytest_cache文件夹作用【Pytest中的cache缓存功能】
     前言pytest运行完用例之后会生成一个.pytest_cache的缓存文件夹,用于记录用例的ids和上一次失败的用例。1、跑自动化时经常会出现这样一个情况,一轮自动化跑完后零星出现了几个失败测试用例,无法断定失败的原因,所以可能需要重新跑一下失败的测试用例去调试,那我们要做的是就去......
  • (一)asyncio的基本使用框架,python高效处理数据,asyncio.gather(),asyncio. create_task
    asyncio是Python3.4引入的标准库,是一个基于事件循环的异步I/O并发库。它提供了一种协作式的多任务处理方式,使得我们能够在一个线程中并发处理多个I/O操作。它通过将I/O操作转化为异步的非阻塞调用,从而实现了高效的并发处理。其原理如下: 定义协程(coroutine):使用关键......
  • 数据科学 IPython 笔记本 7.4 Pandas 对象介绍
    7.4Pandas对象介绍原文:IntroducingPandasObjects译者:飞龙协议:CCBY-NC-SA4.0本节是《Python数据科学手册》(PythonDataScienceHandbook)的摘录。在最基本的层面上,Pandas对象可以认为是NumPy结构化数组的增强版本,其中行和列用标签而不是简单的整数索引来标识。我们将在本......
  • 数据科学 IPython 笔记本 7.6 Pandas 中的数据操作
    7.6Pandas中的数据操作原文:OperatingonDatainPandas译者:飞龙协议:CCBY-NC-SA4.0本节是《Python数据科学手册》(PythonDataScienceHandbook)的摘录。NumPy的一个重要部分是能够执行快速的逐元素运算,包括基本算术(加法,减法,乘法等),和更复杂的运算(三角函数,指数函数和对数函数等......
  • 数据科学 IPython 笔记本 7.3 Pandas 数据操作
    7.3Pandas数据操作原文:DataManipulationwithPandas译者:飞龙协议:CCBY-NC-SA4.0本节是《Python数据科学手册》(PythonDataScienceHandbook)的摘录。在前一章中,我们详细介绍了NumPy及其ndarray对象,它在Python中提供了密集类型数组的高效存储和操作。在这里,通过详细了解P......
  • shell脚本找出不过期的redis key
    1#!/bin/bash2#Redis通过scan找出不过期的key3#SCAN命令是一个基于游标的迭代器(cursorbasediterator):SCAN命令每次被调用之后,都会向用户返回一个新的游标,用户在下次迭代时需要使用这个新游标作为SCAN命令的游标参数,以此来延续之前的迭代过程。4#注意:当S......
  • Python中and和or返回值判断
    一、判断原则原则一:and 两真为真,一假为假or    两假为假,一真为真原则二:短路原则:如果and前面的条件为假,那么跳过and后面的条件(短路)直接返回假(一假为假,所以结果肯定为假)。如果or前面的条件为真,那么跳过or后面的条件(短路)直接返回真(一真为真,所以结果肯定为真)。二、结......