面试题答案
一键面试连接复用
- 长连接:建立持久化的长连接,避免每次请求都进行三次握手和四次挥手的开销。在应用启动时就创建并保持与 Redis 的连接,后续的请求都复用这个连接。
- 连接池:使用连接池管理多个 Redis 连接。连接池预先创建一定数量的连接,当有请求时从连接池中获取连接,使用完毕后再归还到连接池。这样可以减少连接创建和销毁的次数,提高连接的使用效率。例如在 Java 中可以使用 Jedis 连接池。
数据序列化
- 选择高效的序列化方式:避免使用默认的序列化方式,如 Java 的原生序列化,因其产生的数据量较大。推荐使用如 Protocol Buffers、MessagePack 等轻量级序列化框架。这些框架生成的字节数组更小,序列化和反序列化速度更快,能有效减少网络传输的数据量,提升性能。
- 定制序列化策略:对于复杂对象,根据实际需求定制序列化方案,只序列化必要的字段,避免序列化冗余信息。比如在业务对象中有些字段在网络传输时并不需要,就可以不进行序列化。
缓存策略
- 本地缓存:在应用服务器端设置本地缓存,如使用 Guava Cache 或 Caffeine。对于频繁读取且不经常变化的数据,先从本地缓存中获取。只有当本地缓存中不存在时,再通过 Socket 从 Redis 中获取数据。这样可以减少对 Redis 的请求次数,降低网络压力。
- 读写分离缓存:对于读多写少的场景,设置多个从 Redis 节点用于读取数据,主 Redis 节点用于写入数据。应用根据操作类型选择不同的节点进行数据访问,分散读请求,提高系统的并发处理能力。同时,合理设置缓存的过期时间,确保数据的一致性。
- 批量操作缓存:将多个相关的操作合并为一次批量操作。例如,在需要获取多个 Redis key 的值时,使用 mget 命令替代多次 get 命令,减少网络交互次数。在写入数据时,也可以使用 pipeline 技术将多个写操作打包发送,提高操作效率。