Redis 命令详解与实战案例
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">Redis 命令详解与实战案例</a></li><ul class="second_class_ul"><li><a href="#_lab2_0_0">一、Redis 基础介绍</a></li><li><a href="#_lab2_0_1">二、Redis 核心数据结构与命令</a></li><ul class="third_class_ul"><li><a href="#_label3_0_1_0">1. 字符串(Strings)</a></li><li><a href="#_label3_0_1_1">2. 哈希(Hashes)</a></li><li><a href="#_label3_0_1_2">3. 列表(Lists)</a></li><li><a href="#_label3_0_1_3">4. 集合(Sets)</a></li><li><a href="#_label3_0_1_4">5. 有序集合(Sorted Sets)</a></li></ul><li><a href="#_lab2_0_2">三、Redis 高级功能与命令</a></li><ul class="third_class_ul"><li><a href="#_label3_0_2_5">1. 键管理命令</a></li><li><a href="#_label3_0_2_6">2. 事务操作(MULTI/EXEC)</a></li><li><a href="#_label3_0_2_7">3. Lua 脚本支持</a></li><li><a href="#_label3_0_2_8">4. 发布/订阅(Pub/Sub)</a></li></ul><li><a href="#_lab2_0_3">四、Redis 最佳实践与性能优化</a></li><ul class="third_class_ul"><li><a href="#_label3_0_3_9">1. 键命名规范</a></li><li><a href="#_label3_0_3_10">2. 内存优化技巧</a></li><li><a href="#_label3_0_3_11">3. 批量操作提升性能</a></li><li><a href="#_label3_0_3_12">4. 持久化策略选择</a></li></ul><li><a href="#_lab2_0_4">五、Redis 实战应用场景</a></li><ul class="third_class_ul"><li><a href="#_label3_0_4_13">1. 缓存穿透解决方案</a></li><li><a href="#_label3_0_4_14">2. 分布式锁实现</a></li><li><a href="#_label3_0_4_15">3. 实时排行榜</a></li></ul><li><a href="#_lab2_0_5">六、Redis 命令速查表</a></li><ul class="third_class_ul"></ul></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>Redis 命令详解与实战案例</h2><p class="maodian"><a name="_lab2_0_0"></a></p><h3>一、Redis 基础介绍</h3>
<p>Redis(Remote Dictionary Server)是一个开源的、基于内存的键值存储系统,支持多种数据结构,可用作数据库、缓存和消息代理。它提供字符串(Strings)、哈希(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)等多种数据结构的存储。</p>
<p class="maodian"><a name="_lab2_0_1"></a></p><h3>二、Redis 核心数据结构与命令</h3>
<p class="maodian"><a name="_label3_0_1_0"></a></p><h4>1. 字符串(Strings)</h4>
<p>最基础的数据类型,可存储文本、数字或二进制数据(最大512MB)。</p>
<h5>常用命令:</h5>
<table><thead><tr><th>命令</th><th>语法</th><th>说明</th></tr></thead><tbody><tr><td>SET</td><td>SET key value </td><td>设置键值对(带过期时间)</td></tr><tr><td>GET</td><td>GET key</td><td>获取键值</td></tr><tr><td>INCR</td><td>INCR key</td><td>值增加1(整数操作)</td></tr><tr><td>DECR</td><td>DECR key</td><td>值减少1(整数操作)</td></tr><tr><td>APPEND</td><td>APPEND key value</td><td>追加值到现有字符串</td></tr><tr><td>STRLEN</td><td>STRLEN key</td><td>获取字符串长度</td></tr></tbody></table>
<h5>实战案例:</h5>
<div class="jb51code"><pre class="brush:bash;"># 设置用户会话
> SET user:1000:session "session_token" EX 3600# 1小时后过期
# 网站访问计数器
> SET visits 0
> INCR visits# 访问量+1
(integer) 1
> INCR visits
(integer) 2
# 缓存商品信息
> SET product:1234:name "iPhone 15 Pro"
> GET product:1234:name
"iPhone 15 Pro"</pre></div>
<p class="maodian"><a name="_label3_0_1_1"></a></p><h4>2. 哈希(Hashes)</h4>
<p>键值对集合,适合存储对象(如用户信息)。</p>
<h5>常用命令:</h5>
<table><thead><tr><th>命令</th><th>语法</th><th>说明</th></tr></thead><tbody><tr><td>HSET</td><td>HSET key field value</td><td>设置哈希字段值</td></tr><tr><td>HGET</td><td>HGET key field</td><td>获取哈希字段值</td></tr><tr><td>HGETALL</td><td>HGETALL key</td><td>获取所有字段和值</td></tr><tr><td>HDEL</td><td>HDEL key field</td><td>删除字段</td></tr><tr><td>HINCRBY</td><td>HINCRBY key field increment</td><td>增加数值字段的值</td></tr></tbody></table>
<h5>实战案例:</h5>
<div class="jb51code"><pre class="brush:bash;"># 存储用户信息
> HSET user:1000 name "Alice" age 30 email "alice@example.com"
(integer) 3
# 获取用户信息
> HGET user:1000 name
"Alice"
> HGETALL user:1000
1) "name"
2) "Alice"
3) "age"
4) "30"
5) "email"
6) "alice@example.com"
# 更新用户年龄
> HINCRBY user:1000 age 1
(integer) 31</pre></div>
<p class="maodian"><a name="_label3_0_1_2"></a></p><h4>3. 列表(Lists)</h4>
<p>有序字符串集合,支持从两端插入/删除元素,实现队列和栈。</p>
<h5>常用命令:</h5>
<table><thead><tr><th>命令</th><th>语法</th><th>说明</th></tr></thead><tbody><tr><td>LPUSH</td><td>LPUSH key value </td><td>左侧插入元素</td></tr><tr><td>RPUSH</td><td>RPUSH key value </td><td>右侧插入元素</td></tr><tr><td>LPOP</td><td>LPOP key</td><td>左侧弹出元素</td></tr><tr><td>RPOP</td><td>RPOP key</td><td>右侧弹出元素</td></tr><tr><td>LRANGE</td><td>LRANGE key start stop</td><td>获取列表片段</td></tr><tr><td>LTRIM</td><td>LTRIM key start stop</td><td>修剪列表</td></tr></tbody></table>
<h5>实战案例:</h5>
<div class="jb51code"><pre class="brush:bash;"># 消息队列(生产者)
> LPUSH notifications "Order #1001 shipped"
> LPUSH notifications "User login alert"
# 消息队列(消费者)
> RPOP notifications
"Order #1001 shipped"
# 最新动态(保留最近的10条)
> LPUSH user:1000:activity "Liked post #123"
> LTRIM user:1000:activity 0 9# 只保留前10条</pre></div>
<p class="maodian"><a name="_label3_0_1_3"></a></p><h4>4. 集合(Sets)</h4>
<p>无序的唯一字符串集合,支持交集、并集等操作。</p>
<h5>常用命令:</h5>
<table><thead><tr><th>命令</th><th>语法</th><th>说明</th></tr></thead><tbody><tr><td>SADD</td><td>SADD key member </td><td>添加成员</td></tr><tr><td>SREM</td><td>SREM key member </td><td>移除成员</td></tr><tr><td>SMEMBERS</td><td>SMEMBERS key</td><td>获取所有成员</td></tr><tr><td>SISMEMBER</td><td>SISMEMBER key member</td><td>检查成员是否存在</td></tr><tr><td>SINTER</td><td>SINTER key </td><td>多个集合的交集</td></tr></tbody></table>
<h5>实战案例:</h5>
<div class="jb51code"><pre class="brush:bash;"># 用户标签系统
> SADD user:1000:tags "sports" "music" "tech"
> SADD user:1001:tags "music" "food" "travel"
# 查找共同兴趣
> SINTER user:1000:tags user:1001:tags
1) "music"
# 内容去重
> SADD article:1234:viewers "user1000" "user1001"
> SADD article:1234:viewers "user1000"# 重复添加无效
(integer) 0</pre></div>
<p class="maodian"><a name="_label3_0_1_4"></a></p><h4>5. 有序集合(Sorted Sets)</h4>
<p>带分数的有序集合,元素按分数排序,适合排行榜场景。</p>
<h5>常用命令:</h5>
<table><thead><tr><th>命令</th><th>语法</th><th>说明</th></tr></thead><tbody><tr><td>ZADD</td><td>ZADD key score member</td><td>添加成员(带分数)</td></tr><tr><td>ZRANGE</td><td>ZRANGE key start stop </td><td>按索引范围获取成员</td></tr><tr><td>ZREVRANGE</td><td>ZREVRANGE key start stop </td><td>按索引倒序获取成员</td></tr><tr><td>ZRANK</td><td>ZRANK key member</td><td>获取成员排名(升序)</td></tr><tr><td>ZREVRANK</td><td>ZREVRANK key member</td><td>获取成员排名(降序)</td></tr></tbody></table>
<h5>实战案例:</h5>
<div class="jb51code"><pre class="brush:bash;"># 游戏排行榜
> ZADD leaderboard 2500 "PlayerA"
> ZADD leaderboard 3200 "PlayerB"
> ZADD leaderboard 1800 "PlayerC"
# 获取前3名
> ZREVRANGE leaderboard 0 2 WITHSCORES
1) "PlayerB"
2) "3200"
3) "PlayerA"
4) "2500"
5) "PlayerC"
6) "1800"
# 更新玩家分数
> ZADD leaderboard 3500 "PlayerB"# 更新分数</pre></div>
<p class="maodian"><a name="_lab2_0_2"></a></p><h3>三、Redis 高级功能与命令</h3>
<p class="maodian"><a name="_label3_0_2_5"></a></p><h4>1. 键管理命令</h4>
<table><thead><tr><th>命令</th><th>语法</th><th>说明</th></tr></thead><tbody><tr><td>KEYS</td><td>KEYS pattern</td><td>查找匹配的键</td></tr><tr><td>DEL</td><td>DEL key </td><td>删除键</td></tr><tr><td>EXPIRE</td><td>EXPIRE key seconds</td><td>设置键过期时间</td></tr><tr><td>TTL</td><td>TTL key</td><td>查看键剩余生存时间</td></tr><tr><td>TYPE</td><td>TYPE key</td><td>查看键的数据类型</td></tr></tbody></table>
<h5>实战案例:</h5>
<div class="jb51code"><pre class="brush:bash;">> SET session:abc123 "user_data" EX 1800# 30分钟后过期
> TTL session:abc123
(integer) 1798
> KEYS session:*# 查找所有会话键
1) "session:abc123"</pre></div>
<p class="maodian"><a name="_label3_0_2_6"></a></p><h4>2. 事务操作(MULTI/EXEC)</h4>
<div class="jb51code"><pre class="brush:bash;">> MULTI# 开始事务
> SET balance:1000 500
> DECRBY balance:1000 100# 扣款100
> INCRBY sales:2023 100# 增加销售额
> EXEC# 执行事务
1) OK
2) (integer) 400
3) (integer) 100</pre></div>
<p class="maodian"><a name="_label3_0_2_7"></a></p><h4>3. Lua 脚本支持</h4>
<div class="jb51code"><pre class="brush:bash;"># 原子性更新计数器并返回新值
> EVAL "local current = redis.call('GET', KEYS);
if current then
current = tonumber(current) + 1
else
current = 1
end;
redis.call('SET', KEYS, current);
return current" 1 page:views</pre></div>
<p class="maodian"><a name="_label3_0_2_8"></a></p><h4>4. 发布/订阅(Pub/Sub)</h4>
<div class="jb51code"><pre class="brush:bash;"># 终端1:订阅频道
> SUBSCRIBE news
# 终端2:发布消息
> PUBLISH news "Breaking: Redis 7 released!"</pre></div>
<p class="maodian"><a name="_lab2_0_3"></a></p><h3>四、Redis 最佳实践与性能优化</h3>
<p class="maodian"><a name="_label3_0_3_9"></a></p><h4>1. 键命名规范</h4>
<ul><li>使用冒号分隔的命名空间:<code>user:1000:profile</code></li><li>避免过长的键名(影响内存和性能)</li><li>示例:<code>order:2023:09:1234</code></li></ul>
<p class="maodian"><a name="_label3_0_3_10"></a></p><h4>2. 内存优化技巧</h4>
<div class="jb51code"><pre class="brush:bash;"># 使用哈希压缩小型对象
> HSET user:1000 name "Alice" age 30
# 比多个独立键更节省内存:
# SET user:1000:name "Alice"
# SET user:1000:age 30</pre></div>
<p class="maodian"><a name="_label3_0_3_11"></a></p><h4>3. 批量操作提升性能</h4>
<div class="jb51code"><pre class="brush:bash;"># 管道(Pipeline)操作
(echo -en "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379
# 现代客户端支持(如Redis-py)
pipe = redis.pipeline()
pipe.set('key1', 'value1')
pipe.get('key2')
pipe.execute()</pre></div>
<p class="maodian"><a name="_label3_0_3_12"></a></p><h4>4. 持久化策略选择</h4>
<table><thead><tr><th>策略</th><th>特点</th></tr></thead><tbody><tr><td>RDB</td><td>定时快照,恢复快,可能丢失最后一次快照后的数据</td></tr><tr><td>AOF</td><td>记录所有写操作,数据更安全,文件较大</td></tr><tr><td>RDB+AOF</td><td>推荐方案,结合两者优势(Redis 4.0+ 支持)</td></tr></tbody></table>
<p class="maodian"><a name="_lab2_0_4"></a></p><h3>五、Redis 实战应用场景</h3>
<p class="maodian"><a name="_label3_0_4_13"></a></p><h4>1. 缓存穿透解决方案</h4>
<div class="jb51code"><pre class="brush:bash;"># 布隆过滤器防止缓存穿透
> BF.RESERVE products 0.01 1000000
> BF.ADD products "product:1234"
> BF.EXISTS products "product:5678"# 返回0表示不存在</pre></div>
<p class="maodian"><a name="_label3_0_4_14"></a></p><h4>2. 分布式锁实现</h4>
<div class="jb51code"><pre class="brush:bash;"># 获取锁(SET扩展命令)
> SET lock:order_1234 UUID NX EX 30
# 释放锁(Lua脚本保证原子性)
> EVAL "if redis.call('GET', KEYS) == ARGV then
return redis.call('DEL', KEYS)
else
return 0
end" 1 lock:order_1234 UUID</pre></div>
<p class="maodian"><a name="_label3_0_4_15"></a></p><h4>3. 实时排行榜</h4>
<div class="jb51code"><pre class="brush:bash;"># 添加分数
> ZADD leaderboard 95 "PlayerA" 87 "PlayerB" 92 "PlayerC"
# 获取前10名
> ZREVRANGE leaderboard 0 9 WITHSCORES
# 获取玩家排名
> ZREVRANK leaderboard "PlayerB"</pre></div>
<p class="maodian"><a name="_lab2_0_5"></a></p><h3>六、Redis 命令速查表</h3>
<table><thead><tr><th>类别</th><th>常用命令</th></tr></thead><tbody><tr><td>通用</td><td>KEYS, DEL, EXISTS, EXPIRE, TTL, TYPE</td></tr><tr><td>字符串</td><td>SET, GET, INCR, DECR, APPEND, STRLEN</td></tr><tr><td>哈希</td><td>HSET, HGET, HGETALL, HDEL, HINCRBY</td></tr><tr><td>列表</td><td>LPUSH, RPUSH, LPOP, RPOP, LRANGE, LTRIM</td></tr><tr><td>集合</td><td>SADD, SREM, SMEMBERS, SISMEMBER, SINTER</td></tr><tr><td>有序集合</td><td>ZADD, ZRANGE, ZREVRANGE, ZRANK, ZREVRANK</td></tr><tr><td>事务</td><td>MULTI, EXEC, DISCARD, WATCH</td></tr><tr><td>发布订阅</td><td>PUBLISH, SUBSCRIBE, UNSUBSCRIBE</td></tr></tbody></table>
<p>通过掌握这些核心命令和实战案例,您将能够高效地利用 Redis 构建高性能应用系统。建议结合 Redis 官方文档(https://redis.io/commands)深入学习每个命令的详细参数和使用场景。</p>
頁:
[1]