Java程序访问本地Redis服务

在单台机器上同时部署了Java程序和Redis服务时,从Java程序获取Redis缓存的键值对(kv)不会走网卡。原因:

  • 本地通信:Java程序和Redis服务在同一台机器上,它们通过本地回环接口(127.0.0.1localhost)通信,数据不会经过物理网卡,而是在操作系统内核中直接传输;

  • 网络配置无关:即使机器没有物理网卡或网络配置不正确,只要Redis服务监听本地接口,Java程序仍能正常访问。

Java程序访问本地容器化的Redis服务

如果Java程序部署在物理机上,通过Java程序访问同一台物理机上运行的Redis容器,是否会走网卡取决于容器的网络配置。

使用 bridge 网络模式(默认情况)

  • 在默认的 bridge 网络模式下,Docker 会为容器创建一个虚拟网络接口,并分配一个私有 IP 地址(如 172.17.0.x);

  • Java 程序通过容器的 IP 地址(如 172.17.0.2)或主机名访问 Redis 容器时,数据会经过 Docker 的虚拟网络接口;

  • 数据会经过操作系统的网络栈,但通常不会经过物理网卡,而是通过内核的虚拟网络设备(如 docker0)进行传输;

  • 虽然数据不会经过物理网卡,但仍然会经过网络协议栈,性能略低于本地回环接口。

使用 host 网络模式

  • 如果 Redis 容器使用 --network host 启动,容器会直接共享宿主机的网络命名空间;

  • Redis 服务会监听宿主机的网络接口(如 127.0.0.1 或物理网卡的 IP);

  • 如果 Java 程序通过 127.0.0.1localhost 访问 Redis,数据会通过本地回环接口传输,不会经过物理网卡;

  • 如果 Java 程序通过宿主机的物理网卡 IP 访问 Redis,数据会经过物理网卡。

使用 --net=container 模式

  • 如果 Redis 容器与另一个容器共享网络命名空间(如 --net=container:<other_container>),则 Redis 的网络行为取决于共享的容器的网络配置(可能是 bridgehost 模式);

使用 Unix Domain Socket(最佳性能)

  • 如果 Redis 容器和 Java 程序都支持 Unix Domain Socket(UDS),可以通过挂载宿主机的目录,让容器和 Java 程序通过文件系统进行通信;

  • 数据通过文件系统传输,完全不走网络栈,性能最佳。