$npx -y skills add chaterm/terminal-skills --skill redisRedis 数据库管理
| 1 | # Redis 数据库管理 |
| 2 | |
| 3 | ## 概述 |
| 4 | Redis 命令、持久化、集群配置等技能。 |
| 5 | |
| 6 | ## 连接管理 |
| 7 | |
| 8 | ```bash |
| 9 | # 本地连接 |
| 10 | redis-cli |
| 11 | |
| 12 | # 远程连接 |
| 13 | redis-cli -h hostname -p 6379 |
| 14 | redis-cli -h hostname -p 6379 -a password |
| 15 | |
| 16 | # 连接并选择数据库 |
| 17 | redis-cli -n 1 |
| 18 | |
| 19 | # 执行单条命令 |
| 20 | redis-cli ping |
| 21 | redis-cli get key |
| 22 | |
| 23 | # 集群连接 |
| 24 | redis-cli -c -h hostname -p 6379 |
| 25 | ``` |
| 26 | |
| 27 | ## 基础命令 |
| 28 | |
| 29 | ### 键操作 |
| 30 | ```bash |
| 31 | # 查看键 |
| 32 | KEYS * # 所有键(生产慎用) |
| 33 | KEYS user:* # 匹配模式 |
| 34 | SCAN 0 MATCH user:* COUNT 100 # 安全遍历 |
| 35 | |
| 36 | # 键信息 |
| 37 | EXISTS key |
| 38 | TYPE key |
| 39 | TTL key # 剩余过期时间 |
| 40 | PTTL key # 毫秒 |
| 41 | |
| 42 | # 键操作 |
| 43 | DEL key |
| 44 | EXPIRE key 3600 # 设置过期时间 |
| 45 | PERSIST key # 移除过期时间 |
| 46 | RENAME key newkey |
| 47 | ``` |
| 48 | |
| 49 | ### 字符串 |
| 50 | ```bash |
| 51 | SET key value |
| 52 | SET key value EX 3600 # 带过期时间 |
| 53 | SETNX key value # 不存在时设置 |
| 54 | GET key |
| 55 | MSET key1 val1 key2 val2 |
| 56 | MGET key1 key2 |
| 57 | INCR counter |
| 58 | INCRBY counter 10 |
| 59 | DECR counter |
| 60 | APPEND key " suffix" |
| 61 | STRLEN key |
| 62 | ``` |
| 63 | |
| 64 | ### 哈希 |
| 65 | ```bash |
| 66 | HSET user:1 name "John" age 30 |
| 67 | HGET user:1 name |
| 68 | HMSET user:1 name "John" age 30 |
| 69 | HMGET user:1 name age |
| 70 | HGETALL user:1 |
| 71 | HDEL user:1 age |
| 72 | HEXISTS user:1 name |
| 73 | HKEYS user:1 |
| 74 | HVALS user:1 |
| 75 | HINCRBY user:1 age 1 |
| 76 | ``` |
| 77 | |
| 78 | ### 列表 |
| 79 | ```bash |
| 80 | LPUSH list value # 左侧插入 |
| 81 | RPUSH list value # 右侧插入 |
| 82 | LPOP list |
| 83 | RPOP list |
| 84 | LRANGE list 0 -1 # 获取所有 |
| 85 | LLEN list |
| 86 | LINDEX list 0 |
| 87 | LSET list 0 newvalue |
| 88 | LTRIM list 0 99 # 保留前100个 |
| 89 | BLPOP list 10 # 阻塞弹出 |
| 90 | ``` |
| 91 | |
| 92 | ### 集合 |
| 93 | ```bash |
| 94 | SADD set member1 member2 |
| 95 | SREM set member1 |
| 96 | SMEMBERS set |
| 97 | SISMEMBER set member |
| 98 | SCARD set # 元素数量 |
| 99 | SINTER set1 set2 # 交集 |
| 100 | SUNION set1 set2 # 并集 |
| 101 | SDIFF set1 set2 # 差集 |
| 102 | SRANDMEMBER set 3 # 随机获取 |
| 103 | ``` |
| 104 | |
| 105 | ### 有序集合 |
| 106 | ```bash |
| 107 | ZADD zset 100 member1 200 member2 |
| 108 | ZREM zset member1 |
| 109 | ZRANGE zset 0 -1 # 按分数升序 |
| 110 | ZRANGE zset 0 -1 WITHSCORES |
| 111 | ZREVRANGE zset 0 -1 # 按分数降序 |
| 112 | ZRANK zset member # 排名 |
| 113 | ZSCORE zset member # 分数 |
| 114 | ZCOUNT zset 100 200 # 分数范围内数量 |
| 115 | ZINCRBY zset 10 member |
| 116 | ``` |
| 117 | |
| 118 | ## 持久化 |
| 119 | |
| 120 | ### RDB 快照 |
| 121 | ```bash |
| 122 | # 手动触发 |
| 123 | SAVE # 阻塞 |
| 124 | BGSAVE # 后台 |
| 125 | |
| 126 | # 配置 redis.conf |
| 127 | save 900 1 # 900秒内1次修改 |
| 128 | save 300 10 # 300秒内10次修改 |
| 129 | save 60 10000 # 60秒内10000次修改 |
| 130 | |
| 131 | dbfilename dump.rdb |
| 132 | dir /var/lib/redis |
| 133 | ``` |
| 134 | |
| 135 | ### AOF 日志 |
| 136 | ```bash |
| 137 | # 配置 redis.conf |
| 138 | appendonly yes |
| 139 | appendfilename "appendonly.aof" |
| 140 | appendfsync everysec # always/everysec/no |
| 141 | |
| 142 | # AOF 重写 |
| 143 | BGREWRITEAOF |
| 144 | |
| 145 | # 自动重写配置 |
| 146 | auto-aof-rewrite-percentage 100 |
| 147 | auto-aof-rewrite-min-size 64mb |
| 148 | ``` |
| 149 | |
| 150 | ## 主从复制 |
| 151 | |
| 152 | ```bash |
| 153 | # 从节点配置 |
| 154 | REPLICAOF master_host master_port |
| 155 | REPLICAOF NO ONE # 取消复制 |
| 156 | |
| 157 | # 查看复制状态 |
| 158 | INFO replication |
| 159 | |
| 160 | # redis.conf 配置 |
| 161 | replicaof master_host master_port |
| 162 | masterauth master_password |
| 163 | replica-read-only yes |
| 164 | ``` |
| 165 | |
| 166 | ## 集群管理 |
| 167 | |
| 168 | ```bash |
| 169 | # 创建集群 |
| 170 | redis-cli --cluster create \ |
| 171 | node1:6379 node2:6379 node3:6379 \ |
| 172 | node4:6379 node5:6379 node6:6379 \ |
| 173 | --cluster-replicas 1 |
| 174 | |
| 175 | # 集群信息 |
| 176 | redis-cli -c cluster info |
| 177 | redis-cli -c cluster nodes |
| 178 | |
| 179 | # 添加节点 |
| 180 | redis-cli --cluster add-node new_node:6379 existing_node:6379 |
| 181 | |
| 182 | # 重新分片 |
| 183 | redis-cli --cluster reshard node:6379 |
| 184 | |
| 185 | # 检查集群 |
| 186 | redis-cli --cluster check node:6379 |
| 187 | ``` |
| 188 | |
| 189 | ## 性能监控 |
| 190 | |
| 191 | ```bash |
| 192 | # 服务器信息 |
| 193 | INFO |
| 194 | INFO memory |
| 195 | INFO replication |
| 196 | INFO stats |
| 197 | INFO clients |
| 198 | |
| 199 | # 实时监控 |
| 200 | MONITOR # 实时命令(调试用) |
| 201 | |
| 202 | # 慢查询 |
| 203 | SLOWLOG GET 10 |
| 204 | SLOWLOG LEN |
| 205 | SLOWLOG RESET |
| 206 | |
| 207 | # 配置慢查询 |
| 208 | CONFIG SET slowlog-log-slower-than 10000 |
| 209 | CONFIG SET slowlog-max-len 128 |
| 210 | |
| 211 | # 内存分析 |
| 212 | MEMORY USAGE key |
| 213 | MEMORY DOCTOR |
| 214 | DEBUG OBJECT key |
| 215 | |
| 216 | # 客户端列表 |
| 217 | CLIENT LIST |
| 218 | CLIENT KILL ID client_id |
| 219 | ``` |
| 220 | |
| 221 | ## 常见场景 |
| 222 | |
| 223 | ### 场景 1:分布式锁 |
| 224 | ```bash |
| 225 | # 加锁 |
| 226 | SET lock:resource unique_value NX EX 30 |
| 227 | |
| 228 | # 解锁(Lua 脚本保证原子性) |
| 229 | EVAL "if redis.call('get',KEYS[1]) == ARGV[1] then return redis.call('del',KEYS[1]) else return 0 end" 1 lock:resource unique_value |
| 230 | ``` |
| 231 | |
| 232 | ### 场景 2:限流 |
| 233 | ```bash |
| 234 | # 滑动窗口限流 |
| 235 | MULTI |
| 236 | ZADD rate_limit:user:1 timestamp timestamp |
| 237 | ZREMRANGEBYSCORE rate_limit:user:1 0 (timestamp-60000) |
| 238 | ZCARD rate_limit:user:1 |
| 239 | EXPIRE rate_limit:user:1 60 |
| 240 | EXEC |
| 241 | ``` |
| 242 | |
| 243 | ### 场景 3:缓存穿透防护 |
| 244 | ```bash |
| 245 | # 布隆过滤器(需要 RedisBloom 模块) |
| 246 | BF.ADD filter key |
| 247 | BF.EXISTS filter key |
| 248 | |
| 249 | # 空值缓存 |
| 250 | SET key "" EX 60 # 缓存空值 |
| 251 | ``` |
| 252 | |
| 253 | ### 场景 4:批量删除 |
| 254 | ```bash |
| 255 | # 使用 SCAN + DEL |
| 256 | redis-cli --scan --pattern "prefix:*" | xargs redis-cli DEL |
| 257 | |
| 258 | # 使用 UNLINK(异步删除) |
| 259 | UNLINK key1 key2 key3 |
| 260 | ``` |
| 261 | |
| 262 | ## 故障排查 |
| 263 | |
| 264 | | 问题 | 排查方法 | |
| 265 | |------|----------| |
| 266 | | 内存不足 | `INFO memory`, `MEMORY DOCTOR` | |
| 267 | | 连接数过多 | `INFO clients`, `CLIENT LIST` | |
| 268 | | 响应慢 | `SLOWLOG GET`, 检查大 key | |
| 269 | | 主从延迟 | `INFO replication` | |
| 270 | | 集群故障 | `CLUSTER INFO`, `CLUSTER NODES` | |
| 271 | |
| 272 | ```bash |
| 273 | # 查找大 key |
| 274 | redis-cli --bigkeys |
| 275 | |
| 276 | # 内存分析 |
| 277 | redis-cli --memkeys |
| 278 | |
| 279 | # 延迟测试 |
| 280 | redis-cli --latency |
| 281 | redis-cli --latency-history |
| 282 | ``` |