如何在Windows的WSL2下载并配置Redis,并且通过配置端口转发,实现本地pycharm访问redis服务。一文详解。
我目前在使用Python的Celery库,需要用到Redis进行集成。安装Redis的过程中,遇到一些问题,以下是详细的解决过程。
记录下来详细处理过程,方便帮助更多掉坑的朋友。
在 WSL2(Windows Subsystem for Linux 2)中安装和运行 Redis 是推荐的方式,因为 Redis 在 Linux 环境下更稳定且性能更好。
以下是详细步骤,包括如何在 WSL2 中安装 Redis 以及如何配置 Celery 的 broker_url 和 result_backend。
1. 在 WSL2 中安装 Redis
假设你已经安装了 WSL2(例如 Ubuntu 分布),请按照以下步骤操作:
- 启动 WSL2:
- 打开 Windows 终端(或 PowerShell/CMD),输入:
wsl
确保 WSL2 环境已更新:
sudo apt update && sudo apt upgrade -y
下面我们开始安装 Redis:
1.安装 Redis Server:
sudo apt install redis-server -y
2.安装完成后,Redis 通常会自动启动。可以检查 Redis 是否运行:
redis-cli ping
如果返回 PONG,说明 Redis 已运行。
启动 Redis:
- 如果 Redis 未自动启动,手动启动:
sudo service redis-server start
验证 Redis 状态:
sudo service redis-server status
确保状态显示 active (running)。
默认情况下,Redis 监听在 127.0.0.1:6379
(可选)配置 Redis 开机自启: Redis 默认已启用开机自启。如果需要确认或调整:
sudo systemctl enable redis-server
2. 接下来我们来配置 Celery 的 broker_url 和 result_backend
在 WSL2 中运行 Redis 后,你需要确保 Celery(通常在 Windows 的 PyCharm 或 WSL2 的 Python 环境中运行)能够连接到 WSL2 的 Redis 实例。
由于 WSL2 的网络环境与 Windows 主机隔离,配置 broker_url 和 result_backend 需要注意网络访问。
情况 1:Celery 在 Windows 的 PyCharm 中运行
如果你的 Celery 代码在 Windows 的 PyCharm 中运行,而 Redis 在 WSL2 中,你需要让 Windows 访问 WSL2 的 Redis 实例。
- 获取 WSL2 的 IP 地址:
- 在 WSL2 终端中运行:
ip addr show eth0 | grep inet
输出类似:
inet 172.18.xxx.xxx/20 brd 172.18.xxx.xxx scope global eth0
记录 172.18.xxx.xxx(这是 WSL2 的内部 IP)。注意:WSL2 的 IP 可能在每次重启后变化。
或者,使用 WSL2 的主机别名:
- WSL2 提供了一个特殊的 DNS 名称 localhost 或 127.0.0.1,但 Windows 访问 WSL2 的服务需要端口转发。
配置端口转发(推荐): 为了简化连接,建议将 WSL2 的 Redis 端口(6379)转发到 Windows 的 localhost:
1、在 Windows PowerShell(以管理员身份运行)中,添加端口转发:
执行如下命令,
netsh interface portproxy add v4tov4 listenport=6379 listenaddress=127.0.0.1 connectport=6379 connectaddress=<WSL2_IP>
这一步执行完,是不会有任何返回结果的。另外,需注意:这里<WSL2_IP> 替换成上一步的 172.18.xxx.xxx 【你对应IP地址】即可
2、验证端口转发:
netsh interface portproxy show v4tov4
返回结果如下
侦听 ipv4: 连接到 ipv4: 地址 端口 地址 端口 --------------- ---------- --------------- ---------- 127.0.0.1 6379 172.18.xxx.xxx 6379
现在,Windows 的 127.0.0.1:6379 便会映射到 WSL2 的 Redis。
3、测试连接:
在 Windows 的 PyCharm 终端或 Python 脚本中,测试 Redis 连接
import redis r = redis.Redis(host='127.0.0.1', port=6379, db=0) # db 是redis的分区,相当于mysql的use xx print(r.ping()) # 应返回 True
至此,就已经实现了情况一的window访问wsl的redis服务。
情况 2:Celery 在 WSL2 中运行
如果你的 Celery 代码也在 WSL2 中运行(例如,你在 WSL2 的 PyCharm 或终端中开发),配置更简单,因为 Celery 和 Redis 在同一网络环境中。
- 安装 Python 和 Celery:
1、在 WSL2 中安装 Python 和 pip:
sudo apt install python3 python3-pip -y
2、安装 Celery 和 Redis 客户端:
pip3 install celery redis
设置 Celery 配置: 在 tasks.py 或配置文件中,使用 localhost 或 127.0.0.1
from celery import Celery app = Celery('tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0') app.conf.update( task_serializer='json', accept_content=['json'], result_serializer='json', timezone='Asia/Shanghai', enable_utc=True, )
说明:在 WSL2 内部,localhost:6379 直接指向本地的 Redis 服务。
启动 Celery:
1、确保 Redis 正在运行:
sudo service redis-server start
2、在 WSL2 终端中,切换到项目目录,运行:
celery -A tasks worker --loglevel=info
3. 动态处理 WSL2 IP 变化(可选)
WSL2 的 IP 地址可能在重启后变化,导致端口转发失效。我们可以编写一个脚本自动化更新:
- Windows 脚本(PowerShell): 创建一个 .ps1 文件(例如 update_wsl_redis.ps1):
$wsl_ip = wsl bash -c "ip addr show eth0 | grep inet | awk '{print \$2}' | cut -d'/' -f1" netsh interface portproxy delete v4tov4 listenport=6379 listenaddress=127.0.0.1 netsh interface portproxy add v4tov4 listenport=6379 listenaddress=127.0.0.1 connectport=6379 connectaddress=$wsl_ip Write-Output "Updated Redis forwarding to WSL2 IP: $wsl_ip"
以管理员身份运行:
.\update_wsl_redis.ps1
4. 注意事项
- 防火墙:确保 Windows 防火墙允许 6379 端口的通信。如果遇到连接问题,检查:
netstat -ano | findstr 6379
Redis 绑定:默认 Redis 只绑定 127.0.0.1。如果需要外部访问(不推荐),编辑 /etc/redis/redis.conf,将 bind 127.0.0.1 改为 bind 0.0.0.0,然后重启 Redis:
sudo service redis-server restart
- 性能:WSL2 的 Redis 性能优于 Windows 原生 Redis,适合开发和测试。生产环境建议使用独立的 Linux 服务器。
- PyCharm 集成:
- 如果在 Windows 的 PyCharm 中开发,确保使用正确的 Python 解释器(Windows 或 WSL2 的)。
- 如果在 WSL2 中开发,可以安装 WSL2 的 PyCharm 或直接用 VS Code 配合 WSL 插件。
5. 总结
- Windows 的 Celery + WSL2 的 Redis:
- broker_url = 'redis://127.0.0.1:6379/0'
- result_backend = 'redis://127.0.0.1:6379/0'
- 需要端口转发(127.0.0.1:6379 到 WSL2 IP)。
- WSL2 的 Celery + WSL2 的 Redis:
- broker_url = 'redis://localhost:6379/0'
- result_backend = 'redis://localhost:6379/0'
- 无需额外网络配置。