拿个offer - 开源&项目实战 拿个offer - 开源&项目实战
首页
后端技术
🚀大话面试
  • 校&社招实战项目

    • 12306(铁路购票平台)
    • 短链接(Sass平台)
  • 社招进阶项目

    • 刚果商城(DDD领域驱动)
  • 基础架构项目

    • 幂等基础组件(支持接口及多种MQ)
    • 企业基础架构组件库
  • 校&社招实战项目

    • 12306(铁路购票平台) (opens new window)
    • 短链接(Sass平台) (opens new window)
  • 社招进阶项目

    • 刚果商城(DDD领域驱动) (opens new window)
加入群聊
🔋知识星球
代码仓库 (opens new window)
首页
后端技术
🚀大话面试
  • 校&社招实战项目

    • 12306(铁路购票平台)
    • 短链接(Sass平台)
  • 社招进阶项目

    • 刚果商城(DDD领域驱动)
  • 基础架构项目

    • 幂等基础组件(支持接口及多种MQ)
    • 企业基础架构组件库
  • 校&社招实战项目

    • 12306(铁路购票平台) (opens new window)
    • 短链接(Sass平台) (opens new window)
  • 社招进阶项目

    • 刚果商城(DDD领域驱动) (opens new window)
加入群聊
🔋知识星球
代码仓库 (opens new window)
  • 小册简介

    • 什么是大话面试
  • Redis

    • Redis为什么这么快?
    • Redis宕机数据会丢失么?
    • Redis的AOF是怎么实现的?
    • Redis的RDB是怎么实现的?
    • Redis如何实现到期删除的?
    • Redis常用内存淘汰策略?
    • Redis字符串底层数据结构?
    • Redis的压缩列表是什么?
    • Redis的跳表是什么?
    • Redis的ZSet底层是怎么实现的?
    • 什么是布隆过滤器?
    • 布隆过滤器容量如何评估?
    • 布隆过滤器容量不够用如何解决?
    • Redis节点CPU核数越高越好?
    • 为什么Redis不适合海量请求?
    • Redis如何应对海量请求?
    • 如何提升Redis批量访问性能?
      • 回答话术
        • 1. 批量命令
        • 2. Pipeline 管道
        • 3. LUA 脚本
      • 问题详解
        • 1. Pipeline 管道
        • 2. LUA 脚本
  • 缓存

    • 如何解决缓存击穿?
    • 如何解决缓存穿透?
    • 如何解决缓存雪崩?
    • 如何解决大Key问题?
    • 缓存如何预热?
    • 如何发现缓存中热Key?
    • 如何解决热Key问题?
    • 缓存与数据库一致性?
    • 先写DB再删除缓存解决一致性?
    • Binlog配合MQ如何解决一致性?
目录

如何提升Redis批量访问性能?

# 回答话术

可以从两个方面提高,一个是从 API 操作命令上优化,另一个则是通过聚合批命令节省网络 IO。

# 1. 批量命令

以 Redis Hash 结构举例,涉及到批量操作,Redis 提供了 MGET 和 MSET 命令,可以一次性获取多个键的值或者设置多个键的值。

# 2. Pipeline 管道

使用 Pipeline 可以在一次网络往返中发送多个命令,从而减少了通信开销。通过将多个命令打包发送,可以极大地提升批量访问的性能。使用上需要注意:Pipeline 并不会保证原子性,所以在涉及事务和多个命令的情况下,需要格外小心。

# 3. LUA 脚本

如果需要保证原子性的同时还需要批量特性,可以使用 Lua 脚本在 Redis 机器上原子地执行多个命令序列。这对于需要在多个键之间执行复杂操作的情况非常有用。

# 问题详解

# 1. Pipeline 管道

Redis Pipeline(管道)是一种可以在一次网络往返中发送多个命令并接收它们的响应的机制。这样可以减少网络通信的开销,从而提升了 Redis 的批量操作性能。

在普通模式下,每个Redis命令都会在客户端发送给Redis服务器后,等待Redis服务器的响应,然后再发送下一个命令。

当使用 Pipeline 时,客户端可以一次性发送多个命令给Redis服务器,而无需等待每个命令的响应。这意味着一次网络往返可以执行多个命令。

  1. 客户端会将多个命令打包发送到 Redis 服务器,这些命令会被按照发送的顺序执行。
  2. Redis 服务器会依次处理接收到的命令,并将它们按照顺序执行。
  3. 一旦所有命令被执行完毕,Redis 服务器会将它们的响应一次性发送给客户端。
  4. 客户端会按照发送命令的顺序依次接收到各个命令的响应。这些响应可以被客户端用来处理相应的结果。

Redis 管道命令客户端与服务端交互模型。

Pipeline 管道命令注意事项:

  • Pipeline 过大可能会导致网络拥堵:如果一次性发送的命令过多,可能会导致网络拥塞,反而降低性能。
  • Pipeline 并不保证原子性:如果在 Pipeline 中的某个命令执行失败,它不会回滚已经执行的命令。
  • 适用场景:Pipeline 适合于批量读取或写入大量的数据,特别是在需要频繁地与 Redis 进行交互时。

# 2. LUA 脚本

Redis 的 Lua 脚本功能允许你在 Redis 服务器上执行自定义的脚本。这些脚本可以实现复杂的逻辑操作,同时保证了在执行期间的原子性。

执行流程如下:

  1. Redis 会将脚本作为一个单独的原子操作来执行。这意味着在脚本执行期间,其他客户端的请求不会被插入,保证了脚本的原子性。
  2. 脚本可以接收键和参数作为输入,并可以返回一个或多个值作为输出。
  3. 脚本执行完毕后,Redis 会将脚本的返回值发送给客户端。

在 Redis 中,可以使用 EVAL 命令来执行 Lua 脚本。EVAL 命令接受脚本字符串、键的数量和具体的键名作为参数。

需要注意的是,Lua 脚本是在 Redis 服务器上原子执行的,但是在编写脚本时,需要确保脚本的执行时间不会过长,以免影响其他客户端的请求。

上次更新: 2023/11/06, 23:14:13
Redis如何应对海量请求?
如何解决缓存击穿?

← Redis如何应对海量请求? 如何解决缓存击穿?→

Theme by Vdoing | Copyright © 2022-2023 马丁玩编程 | Apache2 License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式