Redis除了做缓存还能做什么?

Redis 除了作为高性能缓存外,还因其丰富的数据结构和功能,广泛应用于多种场景。以下是 Redis 的十大核心用途及具体示例:


1. 分布式会话存储

  • 用途:存储用户会话信息(如登录状态),实现多服务间共享会话。

  • 优势:避免传统 Session 存储在单点故障或扩展性问题。

  • 数据结构:Hash(存储会话字段)、String(简单键值)。

  • 示例

    bash 复制代码
    # 存储用户会话
    HSET user:session:1234 username "john" role "admin" expires 3600
    # 获取会话信息
    HGETALL user:session:1234

2. 分布式锁

  • 用途:实现跨服务的互斥锁,防止并发操作导致的数据不一致。

  • 核心命令SET key value NX PX 30000(原子操作 + 超时)。

  • 示例 (防止重复下单):

    bash 复制代码
    # 尝试获取锁(存在则失败)
    SET order_lock:1001 "locked" NX PX 10000
    # 释放锁(需结合Lua脚本保证原子性)
    if redis.call("get", KEYS[1]) == ARGV[1] then
        return redis.call("del", KEYS[1])
    else
        return 0
    end

3. 消息队列

  • 用途:实现轻量级消息队列,支持异步任务处理。

  • 数据结构:List(LPUSH/RPOP)、Stream(支持消费者组)。

  • 示例 (使用 List):

    bash 复制代码
    # 生产者推送任务
    LPUSH task_queue "send_email:user1@example.com"
    # 消费者获取任务
    RPOP task_queue

4. 实时排行榜

  • 用途:实时更新和查询排行榜(如游戏积分、商品销量)。

  • 数据结构:Sorted Set(按分数排序)。

  • 示例 (游戏积分排行榜):

    bash 复制代码
    # 添加玩家积分
    ZADD game_leaderboard 1500 "player1" 2000 "player2" 1800 "player3"
    # 获取前10名
    ZREVRANGE game_leaderboard 0 9 WITHSCORES

5. 计数器与限流

  • 用途:统计访问量、点赞数,或限制接口请求频率。

  • 核心命令INCRINCRBYEXPIRE

  • 示例 (接口限流:每分钟最多100次请求):

    bash 复制代码
    # 每次请求递增计数器
    INCR api_rate_limit:user123
    # 设置过期时间(首次设置时)
    EXPIRE api_rate_limit:user123 60
    # 检查是否超限
    GET api_rate_limit:user123  # 超过100则拒绝

6. 发布/订阅(Pub/Sub)

  • 用途:实现消息广播,支持实时通知(如聊天室、实时数据推送)。

  • 核心命令PUBLISHSUBSCRIBE

  • 示例 (实时新闻推送):

    bash 复制代码
    # 订阅频道
    SUBSCRIBE news_channel
    # 发布消息
    PUBLISH news_channel "Breaking: Redis 7.0 released!"

7. 地理位置服务

  • 用途:存储和查询地理位置(如附近的人、商家)。

  • 数据结构:GEO(基于 Sorted Set 实现)。

  • 示例 (查找附近的餐厅):

    bash 复制代码
    # 添加地理位置
    GEOADD restaurants 116.404269 39.913818 "restaurant_A"
    GEOADD restaurants 116.407531 39.915264 "restaurant_B"
    # 查找2公里内的餐厅
    GEORADIUS restaurants 116.405285 39.912987 2 km WITHDIST

8. 布隆过滤器(Bloom Filter)

  • 用途:高效判断元素是否存在(如防止缓存穿透、去重)。

  • 原理:基于概率的数据结构,占用空间极小。

  • 示例 (校验新用户是否已注册):

    bash 复制代码
    # 添加元素
    BF.ADD users "user123"
    # 检查是否存在
    BF.EXISTS users "user123"  # 返回1(可能存在)或0(一定不存在)

9. 实时数据分析

  • 用途:统计在线用户数、实时点击量等。

  • 数据结构:HyperLogLog(去重计数)、Bitmap(位操作)。

  • 示例 (统计每日活跃用户):

    bash 复制代码
    # 记录用户访问(用户ID为整型)
    SETBIT daily_active:20231001 1001 1
    # 统计总活跃用户数
    BITCOUNT daily_active:20231001

10. 数据库与缓存的二级存储

  • 用途:作为 MySQL 的二级存储,缓存复杂查询结果。

  • 模式:先查 Redis,未命中则查数据库并回填。

  • 示例 (缓存商品详情):

    bash 复制代码
    # 查询商品信息
    GET product:detail:1001
    # 未命中时从数据库加载并写入Redis
    SET product:detail:1001 '{"id":1001,"name":"Phone"}' EX 3600

总结

Redis 的多样化应用得益于其 高性能丰富的数据结构原子操作。合理使用 Redis 可以显著提升系统性能,解决分布式场景下的复杂问题。根据具体需求选择合适的数据结构和功能,是最大化 Redis 价值的关键。

相关推荐
松岛的枫叶3 分钟前
【缓冲区】数据库备份的衍生问题,缓冲区在哪里?JVMor操作系统?(二)
数据库
littlegirll40 分钟前
命令行方式安装KFS同步KES到KADB
java·大数据·数据库
Y编程小白1 小时前
MySQL的存储引擎
数据库·mysql
爱老的虎油1 小时前
MySQL零基础教程10—正则表达式搜索(下)
数据库·mysql·正则表达式
️Carrie️2 小时前
6.6.3 SQL数据查询(一)
数据库·sql·select·子查询·连接查询·简单查询·聚集函数
jay丿2 小时前
Django应用的高级配置和管理
数据库·django·sqlite
ILUUSION_S3 小时前
学习路程五 向量数据库Milvus操作
数据库·python·学习·langchain·milvus
m0_748237153 小时前
MySQL 篇 - Java 连接 MySQL 数据库并实现数据交互
java·数据库·mysql
秦时明月之君临天下3 小时前
SQLite自增列相关内容
jvm·数据库·sqlite