API详解

88 阅读6分钟

Redis是基于内存的键值存储,支持多种数据结构,采用单线程非阻塞I/O实现高性能,提供RDB/AOF持久化,适用于缓存、消息队列及实时数据处理。

一、Redis 基础概念

  1. 数据结构 Redis 支持以下核心数据结构:

    • String:字符串(文本、二进制数据、整数/浮点数)
    • Hash:键值对集合(适合存储对象)
    • List:有序元素集合(可重复)
    • Set:无序唯一元素集合
    • Sorted Set:有序唯一元素集合(按分值排序)
    • Stream:日志型数据结构(用于消息队列)
    • Bitmaps:基于字符串的位操作,节省内存(如用户签到统计)
    • HyperLogLog:基数统计(近似去重,误差率约 0.81%)
    • Geospatial (GEO) :地理位置坐标(存储、计算距离)
    • JSON(需 Redis Stack):支持 JSON 格式数据
  2. 单线程模型 Redis 使用单线程处理命令,通过非阻塞 I/O 实现高并发。

  3. 持久化

    • RDB:快照持久化(默认)。
    • AOF:追加日志文件持久化(更安全)。

二、安装与连接

1. 安装 Redis

# Linux (Ubuntu)
sudo apt-get install redis-server
​
# MacOS
brew install redis
​
# 启动 Redis 服务
redis-server

2. 连接 Redis

# 命令行客户端(Redis Shell)
redis-cli
​
# 测试连接
PING  # 返回 "PONG"# Redis Shell 高级功能
redis-cli --scan --pattern "user:*"  # 模式匹配键
redis-cli --latency                  # 查看延迟
redis-cli --bigkeys                  # 分析大 Key

三、核心 API 详解

1. 通用命令

  • 键管理

    KEYS *          # 匹配所有键(生产环境慎用)
    DEL key         # 删除键
    EXISTS key      # 判断键是否存在
    EXPIRE key 10   # 设置键过期时间(秒)
    TTL key         # 查看剩余过期时间
    TYPE key        # 查看键的数据类型
    
  • 慢查询分析

    SLOWLOG GET 5    # 获取最近 5 条慢查询
    CONFIG SET slowlog-log-slower-than 1000  # 设置阈值(微秒)
    

2. String(字符串)

  • 基本操作

    SET key value       # 设置键值
    GET key             # 获取值
    INCR key            # 自增整数(原子操作)
    DECR key
    INCRBY key 5        # 按步长增减
    APPEND key "world"  # 追加字符串
    
  • Bitmaps(位操作)

    SETBIT user:sign:2023 100 1  # 用户ID 100 在2023年签到
    GETBIT user:sign:2023 100    # 检查是否签到
    BITCOUNT user:sign:2023      # 统计总签到次数
    

使用场景:缓存、计数器、分布式锁、用户签到。


3. Hash(哈希表)

  • 操作对象字段

    HSET user:1 name "Alice" age 30  # 设置字段
    HGET user:1 name                # 获取字段值
    HGETALL user:1                  # 获取所有字段
    HDEL user:1 age                 # 删除字段
    HINCRBY user:1 age 1            # 字段自增
    

使用场景:存储对象(如用户信息)。


4. List(列表)

  • 队列操作

    LPUSH list1 "a"       # 左侧插入元素
    RPUSH list1 "b"       # 右侧插入元素
    LPOP list1            # 左侧弹出元素
    LRANGE list1 0 -1     # 获取所有元素
    
  • 阻塞操作

    BLPOP list1 10        # 阻塞式左弹出(超时10秒)
    

使用场景:消息队列、最新消息列表。


5. Set(集合)

  • 唯一性操作

    SADD tags "redis" "db"      # 添加元素
    SMEMBERS tags               # 获取所有元素
    SISMEMBER tags "redis"      # 判断元素是否存在
    SINTER tags1 tags2          # 求交集
    SUNION tags1 tags2          # 求并集
    

使用场景:标签系统、好友关系。


6. Sorted Set(有序集合)

  • 按分值排序

    ZADD rank 100 "Alice" 90 "Bob"   # 添加元素(分值)
    ZRANGE rank 0 -1 WITHSCORES      # 按升序获取元素
    ZREVRANGE rank 0 -1              # 按降序获取元素
    ZRANK rank "Alice"               # 获取排名
    

使用场景:排行榜、延时队列。


7. Stream(流)

  • 消息队列操作

    XADD mystream * field1 value1   # 添加消息(自动生成ID)
    XREAD COUNT 2 STREAMS mystream 0 # 读取消息
    XGROUP CREATE mystream mygroup 0 # 创建消费者组
    

使用场景:消息队列(类似 Kafka)。


8. HyperLogLog

  • 基数统计

    PFADD visits:2023 "user1" "user2"  # 添加元素
    PFCOUNT visits:2023               # 统计独立用户数
    PFMERGE visits:all visits:2022 visits:2023  # 合并统计
    

特点:12KB 内存可统计约 2^64 个元素,误差率 0.81%。


9. Geospatial (GEO)

  • 地理位置操作

    GEOADD cities 116.40 39.90 "Beijing"   # 添加坐标
    GEODIST cities "Beijing" "Shanghai" km  # 计算距离
    GEORADIUS cities 116 39 100 km         # 查询半径内城市
    

使用场景:附近地点搜索、配送范围计算。


四、高级功能

1. Pipeline(管道)

  • 批量执行命令,减少网络往返

    # 命令行示例
    (echo -en "PING\r\nPING\r\nPING\r\n"; sleep 1) | nc localhost 6379
    
    # Python 示例
    pipe = r.pipeline()
    pipe.set("a", 1).get("a").incr("counter")
    result = pipe.execute()  # 结果按顺序返回 [True, b'1', 1]
    

    性能提升:非事务模式管道可提升 5-10 倍吞吐量。


2. 事务与 Lua 脚本

  • 事务(原子操作)

    MULTI
    SET key1 10
    INCR key1
    EXEC
    
  • Lua 脚本(原子 + 复杂逻辑)

    EVAL "return redis.call('GET', KEYS[1])" 1 key1
    # 预加载脚本
    SCRIPT LOAD "return redis.call('SET', KEYS[1], ARGV[1])"
    EVALSHA <sha1_hash> 1 key1 value1
    

优势:避免竞态条件,自定义原子命令。


3. 发布订阅

  • 消息广播机制

    SUBSCRIBE news          # 订阅频道
    PUBLISH news "hello"    # 发布消息
    PSUBSCRIBE news.*       # 模式订阅
    

局限:消息不持久化,消费者离线会丢失消息(推荐用 Stream 替代)。


五、性能优化与监控

1. 慢查询分析

  • 配置与查看:

    # 设置慢查询阈值(单位:微秒,默认 10000)
    CONFIG SET slowlog-log-slower-than 1000
    # 查看最近 10 条慢查询
    SLOWLOG GET 10
    

2. 内存优化

  • 避免大 Key:单 Key 数据不超过 1MB。
  • 使用高效数据结构:如 HyperLogLog 替代 Set 统计 UV。

3. 连接池(Python 示例)

from redis import ConnectionPool

pool = ConnectionPool(host='localhost', port=6379, max_connections=10)
r = redis.Redis(connection_pool=pool)

六、客户端示例(Python)

使用 redis-py 库:

import redis

# 连接 Redis
r = redis.Redis(host='localhost', port=6379, db=0)

# Bitmaps 操作
r.setbit("user:sign:2023", 100, 1)  # 用户 100 签到
print(r.getbit("user:sign:2023", 100))  # 输出 1

# GEO 操作
r.geoadd("cities", (116.40, 39.90, "Beijing"))
print(r.geodist("cities", "Beijing", "Shanghai", "km"))

# HyperLogLog 操作
r.pfadd("visits:2023", "user1", "user2")
print(r.pfcount("visits:2023"))  # 输出 2

七、最佳实践

  1. Pipeline 批量操作:减少网络延迟对性能的影响。

  2. Lua 脚本替代事务:处理复杂原子逻辑更灵活。

  3. 合理选择数据结构

    • 统计独立用户数 → HyperLogLog
    • 地理位置计算 → GEO
    • 标记用户行为 → Bitmaps
  4. 监控工具

    • redis-cli --bigkeys 分析大 Key
    • INFO 命令查看服务器状态
    • RedisInsight(可视化监控)

通过结合 Redis 丰富的数据结构、原子操作和高级功能(如 Lua、Pipeline),开发者可以高效解决高并发场景下的缓存、实时统计、消息队列等问题。同时,合理使用慢查询分析和性能优化策略,能进一步提升系统稳定性。