Redis实战入门:数据类型、缓存策略与常见应用场景

运维  ·  2026-06-26

Redis

Redis是最流行的内存数据库,广泛用于缓存、会话管理、消息队列等场景。本文介绍Redis的核心数据类型和实际应用场景。

一、Redis五大基础数据类型

1. String(字符串)— 最基本的类型

# 设置和获取
SET name "hello"
GET name

# 设置过期时间(秒)
SET token "abc123" EX 3600

# 不存在时才设置(分布式锁常用)
SET lock "1" NX EX 10

# 自增(计数器)
INCR view_count
INCRBY user:1001:score 10

# 批量操作
MSET k1 v1 k2 v2 k3 v3
MGET k1 k2 k3

2. Hash(哈希)— 存储对象

# 存储用户信息

HSET user:1001 name "张三" age 25 email "zhangsan@test.com"

 获取单个字段

HGET user:1001 name

 获取所有字段

HGETALL user:1001

 只获取需要的字段

HMGET user:1001 name email

 字段自增

HINCRBY user:1001 age 1

 判断字段是否存在

HEXISTS user:1001 phone

3. List(列表)— 消息队列、最新动态

# 从左边插入
LPUSH recent_posts "post:1003" "post:1002" "post:1001"

 从右边插入

RPUSH queue "task1" "task2" "task3"

 弹出元素

LPOP recent_posts     # 左边弹出
RPOP queue            # 右边弹出
BLPOP queue 30        # 阻塞弹出(等待30秒)

 获取列表范围

LRANGE recent_posts 0 9   # 获取前10条

 获取列表长度

LLEN recent_posts

4. Set(集合)— 去重、交集并集

# 添加成员
SADD user:1001:tags "python" "linux" "docker"
SADD user:1002:tags "python" "java" "k8s"

 获取所有成员

SMEMBERS user:1001:tags

 判断是否是成员

SISMEMBER user:1001:tags "python"

 交集(共同标签)

SINTER user:1001:tags user:1002:tags

 并集(所有标签)

SUNION user:1001:tags user:1002:tags

 差集

SDIFF user:1001:tags user:1002:tags

5. Sorted Set(有序集合)— 排行榜

# 添加带分数的成员
ZADD leaderboard 100 "player:1"
ZADD leaderboard 85 "player:2"
ZADD leaderboard 92 "player:3"

 获取排名(从高到低)

ZREVRANGE leaderboard 0 9 WITHSCORES

 获取分数

ZSCORE leaderboard "player:1"

 自增分数

ZINCRBY leaderboard 10 "player:1"

 获取排名

ZREVRANK leaderboard "player:1"

 范围查询

ZRANGEBYSCORE leaderboard 80 100

二、缓存策略

# 设置过期时间
EXPIRE key 3600          # 秒
PEXPIRE key 3600000      # 毫秒

 查看剩余时间

TTL key

 持久化(取消过期)

PERSIST key

 缓存穿透:查询不存在的数据

 方案:缓存空值,设置较短过期时间

SET user:99999 "" EX 60

 缓存击穿:热点key过期

 方案:互斥锁

SET lock:key "1" NX EX 10

 获取到锁才查数据库

 缓存雪崩:大量key同时过期

 方案:过期时间加随机值

EXPIRE key $((3600 + RANDOM % 300))

三、常见应用场景

# 1. 会话存储
SET session:abc123 "{"user_id":1001,"role":"admin"}" EX 1800

 2. 接口限流

INCR rate:user:1001
EXPIRE rate:user:1001 60

 检查是否超过限制

GET rate:user:1001

 3. 分布式锁

SET lock:order:1001 "1" NX EX 10

 处理完删除

DEL lock:order:1001

 4. 最新消息列表

LPUSH messages "msg:1003"
LTRIM messages 0 99    # 只保留100条
LRANGE messages 0 19   # 获取最新20条

 5. 计数器

INCR article:1001:views
INCRBY user:1001:coins 100

四、运维常用命令

# 连接Redis
redis-cli -h 127.0.0.1 -p 6379 -a password

 查看信息

INFO
INFO memory
INFO clients

 查看key数量

DBSIZE

 查看慢查询

SLOWLOG GET 10

 持久化

BGSAVE           # 后台保存RDB
BGREWRITEAOF     # 重写AOF

 监控实时命令

MONITOR

 查看内存使用

INFO memory | grep used_memory_human

五、性能优化建议

  • 使用批量操作:MSET/MGET代替多次SET/GET

  • 避免大key:单个key的value不要超过10KB

  • 合理设置过期时间:避免内存泄漏

  • 使用连接池:避免频繁建立连接

  • 监控慢查询:定期检查SLOWLOG

Redis的命令非常丰富,以上是最常用的场景。建议结合实际业务需求,选择合适的数据类型和策略。

评论
远方. All Rights Reserved. Theme Jasmine by Kent Liao.