redis中开启事务:multi
- 项目中开启了主从、分布式、哨兵;
- 主master:用来写操作
- 从slaver:用来读操作
- 查看主从配置信息info Replication
- 使用事务:
- multi:在事务开启后,本质上是可以使用多个指令,指定没有立即执行;
- exec:当exec执行后,multi事务开启后的指令,开始执行;
- 事务中:如果多个指令之间,中间有指令执行不成功,不影响后面的执行。
- python中使用:
from redis import StrictRedis,Redis
redis_cli = StrictRedis(host,port,db)
pl = redis_cli.pipeline()
pl.multi()
pl.set()
pl.get()
pl.execute()
redis的watch
- watch:监视数据;
- watch可以指定需要看管的数据,在一次操作过程中不允许别人操作,如果有别人操作,此次操作不成功;
- 类似于乐观锁;
redis的持久化:
两种方式:快照、追加文件;
- RDB:redis数据库默认开启,保存当前的操作状态
如果要关闭快照
save ''
# 配置快照的方案
save 900 1
save 300 10
save 60 10000
# 自定义
save 10 100000
默认:900s一次写操作,快照一次;
# 手动触发RDB:
指令:
在redis终端中:
BGSAVE
shutdown
- AOF:追加文件,把对数据库所有的操作,都记录到文件中;
默认不开启,把对redis操作的指定,记录到磁盘文件中;
appendonly no/yes
appendfilename "appendonly.aof"
alway:所有操作;
1秒
操作系统决定;
redis数据库,1秒中支持10000+操作;
- 使用:
- 快照,根据写操作记录;
- 追加文件,根据秒数,容易造成文件过大;容易丢失1秒中之内的数据;
- 综合使用,即使丢失数据,也就是1秒中产生的数据;
redis高可用
master1 sentinel1 master2
| | |
salver1 salver2 salver3
哨兵:redis数据库自带程序,负责看管复制集和分布式;复制集中的不同机器,生产环境下,会放在不同的机器中;
哨兵会看管每台运行的redis实例,进行故障转移,心跳机制;ping-pong
哨兵至少开启3台以上;投票机制;
- redis-sentinel使用和配置信息
# 查看redis配置文件信息时,有可能和真正运行的redis实例不一致;
建议在redis终端中使用查看redis实例的信息:
info Replication
当进行故障转移后,原master重启,依然是slave;
redis-sentinel /etc/redis/***.config
redis-server /etc/redis/6380.config
bind 127.0.0.1
port 26380
daemonize yes
logfile /var/log/redis-sentinel.log
sentinel monitor mymaster 127.0.0.1 6380 2
sentinel down-after-milliseconds mymaster 30000 # 30s
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000 # 3分钟、180s
# sentinel monitor mymaster 127.0.0.1 6380 2
mymaster表示主从或集群的名称、可以自定义;
2
python中使用哨兵
REDIS_SENTINELS = [
('127.0.0.1', '26380'),
('127.0.0.1', '26381'),
('127.0.0.1', '26382'),
]
# 给哨兵访问定义名称
REDIS_SENTINEL_SERVICE_NAME = 'mymaster'
from redis.sentinel import Sentinel
_sentinel = Sentinel(REDIS_SENTINELS)
redis_master = _sentinel.master_for(REDIS_SENTINEL_SERVICE_NAME)
redis_slave = _sentinel.slave_for(REDIS_SENTINEL_SERVICE_NAME)
try:
redis_master.get()
except:
redis_slave.get()
python中redis集群
REDIS_CLUSTER = [
{'host': '127.0.0.1', 'port': '7000'},
{'host': '127.0.0.1', 'port': '7001'},
{'host': '127.0.0.1', 'port': '7002'},
]
from rediscluster import StrictRedisCluster
redis_cluster = StrictRedisCluster(startup_nodes=REDIS_CLUSTER)
# 可以将redis_cluster就当作普通的redis客户端使用
redis_master.delete(key)
- redis一旦使用集群,不支持事务
- 不支持多键值mset、mget
作用:
- 复制集和分布式:存储冗余字段的数据;构建缓存层;