1快照持久化(损失一部分数据)
可以创建快照来获取存储在内存里面的数据在某个时间点的副本。
BGSAVE:额外的子进程完成写入
SAVE:期间不在响应任何其他命令
save 60 10000:周期自动保存快照BGSAVE
SHUTDOWN or TERM信号:save后关闭
'''conn:redis连接, path:日志路径, callback:行处理回调函数 '''
def process_logs(conn, path, callback):
current_file, offset = conn.mget(
'progress:file', 'progress::posipion')
pipe = conn.pipeline()
def update_progress():
pipe.mset({
'progress:file' : fname,
'progress:position' : offset
})
pipe.execute()
for fname in sorted(os.listdir(path)):
if fname < current_file:
continue
inp = open(os.path.join(path, fname), 'rb')
#继续处理上次读的日志,后面有新的日志可以从断点处重新读取
if fname == current_file:
#偏移到指定行号
inp.seek(int(offset, 10))
else:
offset = 0
current_file = None
#枚举文件返回行号和行数据
for lno, line in enumerate(inp):
#处理每一行的日志,恢复到数据库
callback(pipe, line)
offset += int(offset) + len(line)
if not(lno+1) % 1000:
#每当处理一个1000行保存进度
update_progress()
#每当处理一个文件保存下进度
update_progress()
inp.close()
AOF持久化:
会将被执行的写命令写到文件末尾,以此来记录数据发生的变化。
为了兼顾数据安全和写入性能,用户可以考虑使用appendfsync everysec选项,让Redis以每秒一次的频率对AOF文件进行同步
复制:
配置slaveof host port再启动就从主服务器上复制,通过slaveof no one终止复制
从服务器进行同步时,会清空自己的所有数据。
错误:Redis不支持主主复制。
事务:
如上架商品和购买商品
在用户使用watch命令对键进行监控之后,指导用户执行exec之前的这段时间内,如果监控的对象进行了替换更新删除等操作,那么执行exec的时候,会返回watcherror错误。
使用pipeline减少通信往返的时间损耗
redis-benchmark -c 1 -q#测试服务器上性能特征