redis 命令详解与实战案例
一、redis 基础介绍
redis(remote dictionary server)是一个开源的、基于内存的键值存储系统,支持多种数据结构,可用作数据库、缓存和消息代理。它提供字符串(strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等多种数据结构的存储。
二、redis 核心数据结构与命令
1. 字符串(strings)
最基础的数据类型,可存储文本、数字或二进制数据(最大512mb)。
常用命令:
| 命令 | 语法 | 说明 |
|---|---|---|
| set | set key value [ex seconds] | 设置键值对(带过期时间) |
| get | get key | 获取键值 |
| incr | incr key | 值增加1(整数操作) |
| decr | decr key | 值减少1(整数操作) |
| append | append key value | 追加值到现有字符串 |
| strlen | strlen key | 获取字符串长度 |
实战案例:
# 设置用户会话 > 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"
2. 哈希(hashes)
键值对集合,适合存储对象(如用户信息)。
常用命令:
| 命令 | 语法 | 说明 |
|---|---|---|
| hset | hset key field value | 设置哈希字段值 |
| hget | hget key field | 获取哈希字段值 |
| hgetall | hgetall key | 获取所有字段和值 |
| hdel | hdel key field | 删除字段 |
| hincrby | hincrby key field increment | 增加数值字段的值 |
实战案例:
# 存储用户信息 > 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
3. 列表(lists)
有序字符串集合,支持从两端插入/删除元素,实现队列和栈。
常用命令:
| 命令 | 语法 | 说明 |
|---|---|---|
| lpush | lpush key value [value …] | 左侧插入元素 |
| rpush | rpush key value [value …] | 右侧插入元素 |
| lpop | lpop key | 左侧弹出元素 |
| rpop | rpop key | 右侧弹出元素 |
| lrange | lrange key start stop | 获取列表片段 |
| ltrim | ltrim key start stop | 修剪列表 |
实战案例:
# 消息队列(生产者) > 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条
4. 集合(sets)
无序的唯一字符串集合,支持交集、并集等操作。
常用命令:
| 命令 | 语法 | 说明 |
|---|---|---|
| sadd | sadd key member [member …] | 添加成员 |
| srem | srem key member [member …] | 移除成员 |
| smembers | smembers key | 获取所有成员 |
| sismember | sismember key member | 检查成员是否存在 |
| sinter | sinter key [key …] | 多个集合的交集 |
实战案例:
# 用户标签系统 > 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
5. 有序集合(sorted sets)
带分数的有序集合,元素按分数排序,适合排行榜场景。
常用命令:
| 命令 | 语法 | 说明 |
|---|---|---|
| zadd | zadd key score member | 添加成员(带分数) |
| zrange | zrange key start stop [withscores] | 按索引范围获取成员 |
| zrevrange | zrevrange key start stop [withscores] | 按索引倒序获取成员 |
| zrank | zrank key member | 获取成员排名(升序) |
| zrevrank | zrevrank key member | 获取成员排名(降序) |
实战案例:
# 游戏排行榜 > 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"# 更新分数
三、redis 高级功能与命令
1. 键管理命令
| 命令 | 语法 | 说明 |
|---|---|---|
| keys | keys pattern | 查找匹配的键 |
| del | del key [key …] | 删除键 |
| expire | expire key seconds | 设置键过期时间 |
| ttl | ttl key | 查看键剩余生存时间 |
| type | type key | 查看键的数据类型 |
实战案例:
> set session:abc123 "user_data" ex 1800# 30分钟后过期 > ttl session:abc123 (integer) 1798 > keys session:*# 查找所有会话键 1) "session:abc123"
2. 事务操作(multi/exec)
> multi# 开始事务 > set balance:1000 500 > decrby balance:1000 100# 扣款100 > incrby sales:2023 100# 增加销售额 > exec# 执行事务 1) ok 2) (integer) 400 3) (integer) 100
3. lua 脚本支持
# 原子性更新计数器并返回新值
> eval "local current = redis.call('get', keys[1]);
if current then
current = tonumber(current) + 1
else
current = 1
end;
redis.call('set', keys[1], current);
return current" 1 page:views4. 发布/订阅(pub/sub)
# 终端1:订阅频道 > subscribe news # 终端2:发布消息 > publish news "breaking: redis 7 released!"
四、redis 最佳实践与性能优化
1. 键命名规范
- 使用冒号分隔的命名空间:
user:1000:profile - 避免过长的键名(影响内存和性能)
- 示例:
order:2023:09:1234
2. 内存优化技巧
# 使用哈希压缩小型对象 > hset user:1000 name "alice" age 30 # 比多个独立键更节省内存: # set user:1000:name "alice" # set user:1000:age 30
3. 批量操作提升性能
# 管道(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()4. 持久化策略选择
| 策略 | 特点 |
|---|---|
| rdb | 定时快照,恢复快,可能丢失最后一次快照后的数据 |
| aof | 记录所有写操作,数据更安全,文件较大 |
| rdb+aof | 推荐方案,结合两者优势(redis 4.0+ 支持) |
五、redis 实战应用场景
1. 缓存穿透解决方案
# 布隆过滤器防止缓存穿透 > bf.reserve products 0.01 1000000 > bf.add products "product:1234" > bf.exists products "product:5678"# 返回0表示不存在
2. 分布式锁实现
# 获取锁(set扩展命令)
> set lock:order_1234 uuid nx ex 30
# 释放锁(lua脚本保证原子性)
> eval "if redis.call('get', keys[1]) == argv[1] then
return redis.call('del', keys[1])
else
return 0
end" 1 lock:order_1234 uuid3. 实时排行榜
# 添加分数 > zadd leaderboard 95 "playera" 87 "playerb" 92 "playerc" # 获取前10名 > zrevrange leaderboard 0 9 withscores # 获取玩家排名 > zrevrank leaderboard "playerb"
六、redis 命令速查表
| 类别 | 常用命令 |
|---|---|
| 通用 | keys, del, exists, expire, ttl, type |
| 字符串 | set, get, incr, decr, append, strlen |
| 哈希 | hset, hget, hgetall, hdel, hincrby |
| 列表 | lpush, rpush, lpop, rpop, lrange, ltrim |
| 集合 | sadd, srem, smembers, sismember, sinter |
| 有序集合 | zadd, zrange, zrevrange, zrank, zrevrank |
| 事务 | multi, exec, discard, watch |
| 发布订阅 | publish, subscribe, unsubscribe |
通过掌握这些核心命令和实战案例,您将能够高效地利用 redis 构建高性能应用系统。建议结合 redis 官方文档(https://redis.io/commands)深入学习每个命令的详细参数和使用场景。
到此这篇关于redis 命令详解与实战案例的文章就介绍到这了,更多相关redis 命令实战内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论