Redis常用合集

simon
61
2025-10-14

1. 安装

1.1. 普通安装
docker run -d \
  --name simon-redis-server \
  -p 6379:6379 \
  redis:7.2-alpine \
  redis-server --appendonly yes
  • redis:7.2-alpine:轻量镜像(推荐)

  • --appendonly yes:开启持久化(可选)

1.2. 密码安装

基于 Alpine 的镜像),你可以直接通过环境变量 REDIS_PASSWORD 来设置密码。

docker run -d \
  --name simon-redis-server \
  -p 6380:6379 \
  redis:7.2-alpine \
  redis-server --requirepass "BWOYO0R7oDt40y0shH6t" --appendonly yes
1.3. 密码可持久化
docker run -itd --name simon-redis \
    -p 56379:6379 \
    -v $PWD/redis/data:/data \
    redis:7.2-alpine \
    redis-server --requirepass "BWOYO0R7oDt40y0shH6t" --appendonly yes


docker run -d \
  --name redis-custom \
  -p 6381:6379 \
  -v $PWD/redis.conf:/usr/local/etc/redis/redis.conf \
  redis:7.2-alpine \
  redis-server /usr/local/etc/redis/redis.conf

Redis 是一个高性能的键值存储系统,支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),并提供了丰富的 API。以下是对 Redis 主要 API 的整理,并附带实际使用案例(基于 Redis 命令行或 Redis 客户端如 redis-cli)。

1.4. python
import redis

r = redis.Redis(
    host='localhost',
    port=6379,
    db=0,
    decode_responses=True
)

print(r.ping())  # → True
r.set("test", "hello from python without password")
print(r.get("test"))
1.5. python-密码
import redis

r = redis.Redis(
    host='localhost',
    port=6380,  # 注意端口!
    password='MySecretPassword123!',
    db=0,
    decode_responses=True
)

print(r.ping())  # → True
r.set("test", "hello from python with password")
print(r.get("test"))
1.6. python 连接池
import redis

pool = redis.ConnectionPool(
    host='localhost',
    port=6380,
    password='MySecretPassword123!',
    db=0,
    decode_responses=True,
    max_connections=20
)

r = redis.Redis(connection_pool=pool)
print(r.get("test"))
1.7. go
package main

import (
    "context"
    "fmt"
    "github.com/redis/go-redis/v9"
)

var ctx = context.Background()

func main() {
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "", // 无密码留空
        DB:       0,
    })

    pong, err := rdb.Ping(ctx).Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("Ping:", pong) // → PING

    err = rdb.Set(ctx, "test", "hello from go without password", 0).Err()
    if err != nil {
        panic(err)
    }

    val, err := rdb.Get(ctx, "test").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("Value:", val)
}
1.8. go 含密码
package main

import (
    "context"
    "fmt"
    "github.com/redis/go-redis/v9"
)

var ctx = context.Background()

func main() {
    rdb := redis.NewClient(&redis.Options{
        Addr:     "localhost:6380", // 注意端口!
        Password: "MySecretPassword123!",
        DB:       0,
    })

    pong, err := rdb.Ping(ctx).Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("Ping:", pong)

    err = rdb.Set(ctx, "test", "hello from go with password", 0).Err()
    if err != nil {
        panic(err)
    }

    val, err := rdb.Get(ctx, "test").Result()
    if err != nil {
        panic(err)
    }
    fmt.Println("Value:", val)
}
1.9. go 连接池
rdb := redis.NewClient(&redis.Options{
    Addr:         "localhost:6380",
    Password:     "MySecretPassword123!",
    DB:           0,
    PoolSize:     20,
    MinIdleConns: 5,
})
1.10. 选择数据库
# 默认是0号数据库
SELECT 1

2. 通用命令(Key 相关)

命令

描述

示例

KEYS pattern

查找匹配模式的所有 key(生产慎用)

KEYS user:*

DEL key [key ...]

删除一个或多个 key

DEL user:1001

EXISTS key

检查 key 是否存在

EXISTS user:1001 → 返回 1 或 0

EXPIRE key seconds

设置 key 过期时间(秒)

EXPIRE session:abc 3600

TTL key

获取 key 剩余生存时间(秒)

TTL session:abc

TYPE key

获取 key 对应值的数据类型

TYPE user:1001 → string/hash/list 等

2.1. 案例:设置用户会话过期
SET session:abc "user_data_here"
EXPIRE session:abc 3600  # 1小时后自动删除
TTL session:abc          # 查看剩余时间

3. 字符串(String)

最基础的数据类型,可存文本、数字等。

命令

描述

示例

SET key value

设置 key-value

SET name "Alice"

GET key

获取值

GET name → "Alice"

INCR key

数值 +1(必须为整数)

INCR views

DECR key

数值 -1

DECR stock

INCRBY key increment

加指定数值

INCRBY counter 5

SETEX key seconds value

设置值并指定过期时间

SETEX token 300 "xyz123"

MSET key value [key value ...]

批量设置

MSET k1 v1 k2 v2

MGET key [key ...]

批量获取

MGET k1 k2

3.1. 案例:计数器与缓存
SET article:1:title "Redis入门指南"
SETEX article:1:views 86400 "125"  # 缓存24小时阅读数

INCR article:1:daily_views        # 每次访问+1
GET article:1:daily_views          # 获取当前访问数

4. 哈希(Hash)

适合存储对象,字段-值对结构。

命令

描述

示例

HSET key field value

设置字段值

HSET user:1001 name "Bob" age 25

HGET key field

获取字段值

HGET user:1001 name

HMSET key field value [field value ...]

批量设字段(已废弃,建议用 HSET)

HSET user:1001 email "bob@example.com"

HMGET key field [field ...]

批量获取字段

HMGET user:1001 name age

HGETALL key

获取所有字段和值

HGETALL user:1001

HDEL key field [field ...]

删除字段

HDEL user:1001 age

HEXISTS key field

判断字段是否存在

HEXISTS user:1001 name

HLEN key

获取字段数量

HLEN user:1001

4.1. 案例:存储用户信息
HSET user:1001 name "Alice" email "alice@example.com" score 95
HGET user:1001 name         # → "Alice"
HGETALL user:1001           # → 所有字段和值
HINCRBY user:1001 score 5   # 分数+5

5. 列表(List)

有序可重复元素,支持从两端操作。

命令

描述

示例

LPUSH key value [value ...]

左侧插入

LPUSH queue task1

RPUSH key value [value ...]

右侧插入

RPUSH log "error msg"

LPOP key

左侧弹出

LPOP queue

RPOP key

右侧弹出

RPOP log

LRANGE key start stop

获取范围元素(0起始,-1结尾)

LRANGE queue 0 -1

LLEN key

获取列表长度

LLEN queue

LINDEX key index

获取指定索引元素

LINDEX queue 0

LREM key count value

删除指定元素

LREM queue 1 "task1"

案例:消息队列 / 最新动态

RPUSH news "新闻A"
RPUSH news "新闻B"
RPUSH news "新闻C"

LRANGE news 0 2    # 获取前三条
LPOP news          # 处理一条(FIFO)

6. 集合(Set)

无序不重复元素集合,支持交并差运算。

命令

描述

示例

SADD key member [member ...]

添加成员

SADD tags "redis" "nosql"

SMEMBERS key

获取所有成员

SMEMBERS tags

SISMEMBER key member

判断是否是成员

SISMEMBER tags "redis"

SCARD key

获取成员数量

SCARD tags

SREM key member [member ...]

删除成员

SREM tags "nosql"

SINTER key [key ...]

交集

SINTER set1 set2

SUNION key [key ...]

并集

SUNION set1 set2

SDIFF key [key ...]

差集

SDIFF set1 set2

6.1. 案例:标签系统 / 好友共同兴趣
SADD user:1:tags "music" "sports" "coding"
SADD user:2:tags "sports" "travel" "coding"

SINTER user:1:tags user:2:tags  # → "sports", "coding" (共同兴趣)

7. 有序集合(Sorted Set / ZSet)

每个成员关联一个分数(score),按分数排序。

命令

描述

示例

ZADD key score member [score member ...]

添加成员和分数

ZADD leaderboard 100 "Alice"

ZRANGE key start stop [WITHSCORES]

按排名获取成员(升序)

ZRANGE leaderboard 0 9 WITHSCORES

ZREVRANGE key start stop [WITHSCORES]

降序获取

ZREVRANGE leaderboard 0 9

ZSCORE key member

获取成员分数

ZSCORE leaderboard "Alice"

ZCARD key

获取成员总数

ZCARD leaderboard

ZREM key member [member ...]

删除成员

ZREM leaderboard "Alice"

ZRANK key member

获取成员排名(升序)

ZRANK leaderboard "Alice"

ZREVRANK key member

降序排名

ZREVRANK leaderboard "Alice"

7.1. 案例:排行榜系统
ZADD game:leaderboard 850 "player1"
ZADD game:leaderboard 920 "player2"
ZADD game:leaderboard 760 "player3"

ZREVRANGE game:leaderboard 0 2 WITHSCORES  # 前三名及分数
ZRANK game:leaderboard "player1"           # 查看排名(从0开始)

8. 其他实用命令

8.1. 发布订阅(Pub/Sub)
# 订阅频道
SUBSCRIBE chatroom

# 发布消息
PUBLISH chatroom "Hello everyone!"
8.2. 事务(Transactions)
MULTI
SET name "Tom"
INCR counter
EXEC
8.3. Lua 脚本(原子操作)
EVAL "return redis.call('GET', KEYS[1])" 1 mykey

9. 综合案例:电商购物车 + 排行榜 + 库存

# 用户1001添加商品到购物车(Hash)
HSET cart:1001 item_001 2 item_002 1

# 商品销量排行榜(ZSet)
ZINCRBY sales_rank 1 "item_001"   # 销量+1
ZREVRANGE sales_rank 0 9 WITHSCORES

# 商品库存(String + INCR/DECR)
SET stock:item_001 100
DECR stock:item_001               # 下单减库存
GET stock:item_001                # 剩余库存

# 设置订单过期(30分钟未支付自动取消)
SETEX order:ORD20240501 1800 "pending"

10. 参考文档:

动物装饰