面试题答案
一键面试优化思路一:批量写入
- 原理:减少频繁的小I/O操作,将多个命令批量提交,从而减少磁盘I/O次数。
- 代码示例:
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
pipe = r.pipeline()
for i in range(100):
pipe.set(f'key_{i}', f'value_{i}')
pipe.execute()
优化思路二:适当调整AOF刷盘策略
- 原理:AOF有不同的刷盘策略(always、everysec、no),
everysec
是默认策略,在性能和数据安全性上做了较好的平衡。如果对数据丢失不太敏感,可以考虑将策略设置为no
,由操作系统来决定何时刷盘,进一步减少磁盘I/O。不过这种方式在系统崩溃时可能会丢失一些数据。 - 代码示例:
通过修改Redis配置文件
redis.conf
,将appendfsync
参数设置为no
:
appendfsync no
在Python代码中连接Redis时,确保使用的是修改配置后的Redis实例:
import redis
r = redis.Redis(host='localhost', port=6379, db=0)
# 后续进行正常的AOF相关操作,此时刷盘策略已修改为no
优化思路三:使用异步I/O
- 原理:利用
redis - py
库的异步功能,在主线程继续执行其他任务的同时,后台进行AOF持久化操作,减少主线程等待磁盘I/O的时间。 - 代码示例:
import asyncio
import aioredis
async def main():
r = await aioredis.from_url('redis://localhost:6379')
tasks = []
for i in range(100):
tasks.append(r.set(f'key_{i}', f'value_{i}'))
await asyncio.gather(*tasks)
await r.close()
if __name__ == '__main__':
asyncio.run(main())