D8.Redis基础

Redis支持五种数据结构,包括:

  1. String(字符串):最简单的类型,一个key对应一个value。适合简单数据
  2. Hash(哈希):是string类型的field和value的映射表,适合用于存储对象。适合多个字段的值的数据。
  3. List(列表):是一个链表结构,主要功能是push、pop、获取一个范围的所有值等等。操作中key理解为链表的名字。适合有顺序插入的数据,如消息队列、日志记录
  4. Set(集合):set是集合,和我们数学中的集合概念相似,对集合的操作有添加删除元素,有对多个集合求交并差等操作。操作中key理解为集合的名字。适合集合交、并、差运算。
  5. Sorted Set(排序set):和set相比,sorted set是将set中的元素增加了一个权重参数score,使得我们可以通过score排序。

Redis有2种存储策略:

1.RDB - 先临时表存储,再更新上一次持久化存储,达到数据恢复

2.AOF - 记录执行的语句,数据恢复时再直接执行

重启时,会优先用AOF。

3种使用模式

持久化 - 用RDB或AOF写入磁盘

内存淘汰 - 有5种,1不删(缺省) 2删最近最少用 3定时间删最近最少用 4定时随机删 5定时删存活最短的

定期 - 有固定和惰性,固定到一定时间直接删,惰性到访问时才检查是否删。

<think>我们正在解决在WSL2的Ubuntu中,使用dockerexec运行redis-cli命令时出现的'executablefilenotfoundin$PATH'错误。用户提供了几个引用,但我们主要关注如何正确使用dockerexec命令以及容器配置。根据错误信息,通常是因为在容器中找不到redis-cli可执行文件。可能的原因:1.容器中没有安装redis-cli(如果容器是Redis官方镜像,默认是有redis-cli的,但可能路径不在$PATH中)。2.容器中redis-cli的路径没有包含在环境变量$PATH中。3.命令书写错误,比如命令名称拼写错误,或者没有提供完整路径。用户提到是在Redis容器中运行,因此我们假设使用的是Redis官方镜像。在Redis官方镜像中,redis-cli可执行文件通常位于/usr/local/bin目录下。该目录通常被包含在$PATH环境变量中,因此应该可以直接使用redis-cli命令。所以,可能是在使用dockerexec时,命令参数传递不正确。常见的正确运行方式:dockerexec-it<redis容器名称或ID>redis-cli如果上述命令报错,我们可以尝试使用完整路径:dockerexec-it<容器名称或ID>/usr/local/bin/redis-cli另外,注意容器是否处于运行状态。另一种可能是,容器虽然运行了,但容器内没有包含redis-cli(例如用户使用了alpine版本的Redis镜像,可能没有安装redis-cli?),但Redis官方镜像默认包含redis-cli。让我们回顾用户提供的引用[3],它展示了--mount的用法,但更相关的是dockerrun命令的写法。不过,我们这里的问题在dockerexec。此外,用户提到在WSL2的Ubuntu中,这通常不会影响容器内的路径,因此我们重点检查容器内部。因此,解决步骤建议:1.首先确认容器是否正在运行:dockerps2.尝试进入容器的shell:dockerexec-it<容器名称或ID>/bin/bash然后,在容器内部运行:whereisredis-cli或者whichredis-cli,以确定redis-cli的位置。如果找到,则记录下完整路径,然后在dockerexec命令中使用完整路径。3.如果发现容器内确实没有redis-cli(这不太可能,因为Redis镜像通常会包含),则需要检查用户使用的镜像到底是什么。可以查看Dockerfile中是否包含redis-cli的安装。4.如果使用的是自定义镜像,可能没有安装redis-cli,则需要在Dockerfile中安装。如果是官方镜像,可以尝试重新拉取最新版本的镜像。5.注意:在Redis容器中,默认的ENTRYPOINT是docker-entrypoint.sh,CMD是redis-server,所以容器运行时只启动了redis-server。但是redis-cli应该是包含在镜像中的。6.还有一种情况:如果容器是基于alpine系统,那么redis-cli可能叫其他名字?但官方Redis镜像的alpine版本也包含redis-cli,只是路径可能不同。7.使用命令:dockerexec-it<容器名称或ID>sh-c"pwd&&echo$PATH&&ls-l/usr/local/bin"来检查路径和文件是否存在。8.如果上述方法都不行,可以考虑在容器内部更新PATH环境变量,但通常不建议这样做,因为需要修改容器配置。根据引用[4],它展示了一个Dockerfile的编写,其中设置了环境变量PATH。如果用户自定义了Dockerfile,可能需要确保PATH包含了redis-cli所在的目录。所以,具体到用户的问题,建议用户先使用dockerexec进入容器内部,然后检查redis-cli是否存在。我们总结可能的解决方案:步骤一:检查容器状态运行`dockerps`确保容器正在运行。步骤二:尝试进入容器并查找redis-cli运行:dockerexec-it<container_id>/bin/bash然后执行:whichredis-cli||whereisredis-cli如果找不到,尝试在容器的根目录下搜索:find/-nameredis-cli2>/dev/null步骤三:根据找到的路径执行假设找到路径是/usr/local/bin/redis-cli,那么执行命令:dockerexec-it<container_id>/usr/local/bin/redis-cli步骤四:如果以上都失败,可能需要重新安装redis-cli(针对自定义镜像)或者检查镜像是否正确。另外,注意在WSL2中,文件系统的问题通常不会导致这种错误,所以重点还是容器内部。由于用户提到了引用[1]到[5],但大部分与当前问题无关,因此我们主要关注容器内部路径问题。我们可以参考引用[3]中给出的dockerrun使用--mount的方式,但这不是解决当前问题的直接方法。生成相关问题:1.如何检查Docker容器中的环境变量PATH?2.在自定义Docker镜像中如何确保可执行文件在PATH中?3.为什么使用alpine基础镜像时,可执行文件可能无法找到?4.如何调试Docker容器内部的命令路径问题?</think> ### 解决 WSL2 Ubuntu 中 Docker Exec Redis-cli "executable file not found" 错误 #### 问题分析 当您在 WSL2 Ubuntu 环境中运行 `docker exec -it <容器名> redis-cli` 时出现 `executable file not found in $PATH` 错误,通常有以下原因: 1. **容器内缺少 redis-cli**:Redis 官方镜像默认包含 CLI,但您可能使用了精简版镜像或自定义 Dockerfile 2. **PATH 路径配置错误**:容器环境的 `$PATH` 变量未包含 redis-cli 所在目录 3. **镜像版本差异**:不同 Redis 镜像版本对 redis-cli 的安装位置不同 4. **WSL2 文件系统兼容性**:WSL2 的 Linux 内核与 Docker 文件交互可能产生路径问题 [^3] #### 解决方案(逐步操作) ##### 步骤 1:验证容器状态 ```bash # 检查容器是否运行 docker ps | grep redis # 查看容器详细信息 docker inspect <容器名> | grep -i "path\|cmd" ``` ##### 步骤 2:进入容器排查 ```bash # 启动交互式 shell docker exec -it <容器名> sh # 在容器内查找 redis-cli find / -name redis-cli 2>/dev/null # 检查环境变量 echo $PATH exit ``` 🔍 典型查找结果: - 官方镜像:`/usr/local/bin/redis-cli` - Alpine 镜像:`/usr/bin/redis-cli` ##### 步骤 3:修正执行命令 根据查找结果使用完整路径: ```bash # 官方镜像路径 docker exec -it <容器名> /usr/local/bin/redis-cli # Alpine 镜像路径 docker exec -it <容器名> /usr/bin/redis-cli ``` ##### 步骤 4:修改容器 PATH(临时方案) ```bash # 启动容器时添加 PATH 变量 docker run -d --name redis-server \ -e PATH="/usr/local/bin:$PATH" \ redis:alpine ``` ##### 步骤 5:自定义 Dockerfile(永久方案) 参考引用[4]修改 Dockerfile: ```dockerfile FROM redis:6.2 # 确保 redis-cli 在 PATH 中 ENV PATH="/usr/local/bin:${PATH}" # 验证命令 RUN which redis-cli ``` 构建镜像: ```bash docker build -t custom-redis . ``` ##### 步骤 6:WSL2 特定优化 ```bash # 更新 WSL2 内核 wsl --update # 在 /etc/docker/daemon.json 添加配置(引用[1]) echo '{"experimental": true}' | sudo tee /etc/docker/daemon.json sudo service docker restart ``` #### 错误处理流程图 ```mermaid graph TD A[出现 PATH 错误] --> B{进入容器查找 redis-cli} B -- 找到 --> C[用完整路径执行] B -- 未找到 --> D[检查镜像版本] D -- 官方镜像 --> E[重拉镜像 docker pull redis] D -- 自定义镜像 --> F[修改 Dockerfile 添加 PATH] C --> G[成功连接] E --> G F --> G ``` #### 📌 关键注意事项 1. Redis 官方镜像的 `redis-cli` **默认位于 `/usr/local/bin`**(非 Alpine 版) 2. Alpine 镜像需使用 `redis:alpine` 标签,路径为 `/usr/bin` 3. WSL2 建议启用 **Systemd 支持**(`wsl.exe --set-version 2`)确保服务管理兼容性 4. 避免使用 `docker-compose` 路径映射时的相对路径错误(引用[3])
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值