Java程序访问本地Redis服务
在单台机器上同时部署了Java程序和Redis服务时,从Java程序获取Redis缓存的键值对(kv)不会走网卡。原因:
本地通信:Java程序和Redis服务在同一台机器上,它们通过本地回环接口(
127.0.0.1
或localhost
)通信,数据不会经过物理网卡,而是在操作系统内核中直接传输;网络配置无关:即使机器没有物理网卡或网络配置不正确,只要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.1
或localhost
访问 Redis,数据会通过本地回环接口传输,不会经过物理网卡;如果 Java 程序通过宿主机的物理网卡 IP 访问 Redis,数据会经过物理网卡。
使用 --net=container
模式
如果 Redis 容器与另一个容器共享网络命名空间(如
--net=container:<other_container>
),则 Redis 的网络行为取决于共享的容器的网络配置(可能是bridge
或host
模式);
使用 Unix Domain Socket(最佳性能)
如果 Redis 容器和 Java 程序都支持 Unix Domain Socket(UDS),可以通过挂载宿主机的目录,让容器和 Java 程序通过文件系统进行通信;
数据通过文件系统传输,完全不走网络栈,性能最佳。