一、键的过期
Redis 可以为每个键设置过期时间,当键过期时,会自动删除该键。
二、事务与流水线
使用 MULTI 和 EXEC 命令将事务操作包围起来,一次性发送给服务器,这种方式称为流水线,它可以减少客户端与服务器之间的网络通信次数从而提升性能。
三、持久化
将内存数据持久化到硬盘。
1. 快照持久化
将某个时间点的数据存放到硬盘。
缺点:
如果系统发生故障,将会丢失最后一次创建快照之后的数据。
如果数据量很大,保存快照的时间会很长。
2. AOF 持久化
对要写入到硬盘的数据先存放到缓冲区,再由以下同步选项决定何时写入到硬盘:
选项 | 同步频率 |
---|---|
always | 每个写命令都同步,严重减低服务器的性能 |
everysec | 每秒同步一次,比较合适 |
no | 由操作系统来决定,不能显著提升性能,反而增加系统奔溃时数据丢失的数量 |
当然,也可手动 file.fulsh() 写入到硬盘。
AOF (Append Only File)文件是用来存放写命令的,也就是要写什么入硬盘。随着服务器写请求的增多,AOF 文件会越来越大,Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令。
四、复制
指主服务器复制到从服务器。
首次从服务器先载入主服务器发来的快照文件,之后接受主服务器发来的写命令。
通过使用 slaveof host port 命令来让一个服务器成为另一个服务器的从服务器。
在一个 Redis 集群中,master 负责写请求,slave 负责读请求。
一方面 master 把读请求分散到其他机器从而减少了服务器压力;
另一方面 slave 专注于提供读服务从而提高了响应和读取速度。
五、分片
数据分散到多个 Redis 实例中。
对比将所有数据只存放的单台 redis 实例,能大大减轻 redis 实例压力。
还有两个问题:
一是如何分片,也就是如何合理地把数据分成一块一块,标准是什么?
二是在哪里进行分片,客户端?服务器?代理?
六、适用场景
- 缓存:将热点数据放入缓存。
- 消息队列:LIST 是双向链表,适合用于消息队列。
- 计数器:内存数据库,适合计数器频繁读写操作。
- 好友关系:两个 SET 的交集,可知两个用户的共同好友。
参考文档:
https://github.com/CyC2018/Interview-Notebook/blob/master/notes/Redis.md
网友评论