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

作用:

  • 复制集和分布式:存储冗余字段的数据;构建缓存层;