python操作哨兵与集群,缓存优化,穿透,击穿,雪崩
python操作哨兵与集群
哨兵
做了高可用架构后,不能直接连某一个主库了,主库可能会挂掉,后来他就不是主库了。
之前连接redis的操作需要变更了
import redis
conn = redis.Redis(host='',port=6379)
conn.set()
conn.close()
# 现在用的
import redis
from redis.sentinel import Sentinel
sentinel = Sentinel([('10.0.0.101',26379),
('10.0.0.102',26380),
('10.0.0.102',26381)],socket_timeout=5)
# 获取主服务器地址
master = sentinel.discover_master('mymaster')
print(master)
# 获取从服务器地址
slave = sentinel.discover_slaves('mymaster')
print(slave)
# 读写分离
# 获取主服务器进行写入
master = sentinel.master_for('mymaster', socket_timeout=0.5)
w_ret = master.set('foo', 'bar')
slave = sentinel.slave_for('mymaster', socket_timeout=0.5)
r_ret = slave.get('foo')
print(r_ret)
"注意:要写机器的ip地址,不要写127.0.0.1,想在公网用,就写公网ip,python要是在内网中使用,要写内网ip"
集群
搭建好集群后需要用python操作集群,需要下载模块
rediscluster
pip3 install redis-py-cluster
from rediscluster import RedisCluster
startup_nodes = [{"host":"127.0.0.1", "port": "7000"},{"host":"127.0.0.1", "port": "7001"},{"host":"127.0.0.1", "port": "7002"}]
# rc = RedisCluster(startup_nodes=startup_nodes,decode_responses=True)
rc = RedisCluster(startup_nodes=startup_nodes)
rc.set("foo", "bar")
print(rc.get("foo"))
redis缓存优化
1.缓存更新策略
redis本身是使用内存存储,内存会出现不够用,新数据就会存不进去,redis有些策略会删除一些旧数据,再存新数据。
LRU 没有被使用时间最长的
LFU 一定时间段内使用次数最少的
FIFO 先进先出
2.缓存穿透
缓存穿透是指缓存中和数据库中都没有的数据,而用户不断发起请求。此用户很有可能是攻击者,发起查询id小于0或过大的数据,会导致数据库压力过大
解决方案:
1.接口层增加校验,用户做权限校验,id做基础校验,不合法的直接拦截
2. 缓存中取不到的数据在 数据库中也查询不到可以在缓存中存一个key=null并设置过期时间
3. 使用布隆过滤器
3.缓存击穿
是指缓存中没有的数据数据库中有,同一时间并发量过大,导致数据库压力瞬间增大
解决方案:
设置热点数据永不过期
4.缓存雪崩
是指缓存中数据大批量到期,查询数据量巨大,落在了数据库上,导致数据库压力过大
解决方案:
随机设置过期时间
使用分布式部署 将热点数据均匀分给不同的缓存数据库中
设置热点数据永不过期