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

devtools/2025/3/1 4:29:18/

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


1. 分布式会话存储

  • 用途:存储用户会话信息(如登录状态),实现多服务间共享会话。
  • 优势:避免传统 Session 存储在单点故障或扩展性问题。
  • 数据结构:Hash(存储会话字段)、String(简单键值)。
  • 示例
    # 存储用户会话
    HSET user:session:1234 username "john" role "admin" expires 3600
    # 获取会话信息
    HGETALL user:session:1234
    

2. 分布式锁

  • 用途:实现跨服务的互斥锁,防止并发操作导致的数据不一致。
  • 核心命令SET key value NX PX 30000(原子操作 + 超时)。
  • 示例(防止重复下单):
    # 尝试获取锁(存在则失败)
    SET order_lock:1001 "locked" NX PX 10000
    # 释放锁(需结合Lua脚本保证原子性)
    if redis.call("get", KEYS[1]) == ARGV[1] thenreturn redis.call("del", KEYS[1])
    elsereturn 0
    end
    

3. 消息队列

  • 用途:实现轻量级消息队列,支持异步任务处理。
  • 数据结构:List(LPUSH/RPOP)、Stream(支持消费者组)。
  • 示例(使用 List):
    # 生产者推送任务
    LPUSH task_queue "send_email:user1@example.com"
    # 消费者获取任务
    RPOP task_queue
    

4. 实时排行榜

  • 用途:实时更新和查询排行榜(如游戏积分、商品销量)。
  • 数据结构:Sorted Set(按分数排序)。
  • 示例(游戏积分排行榜):
    # 添加玩家积分
    ZADD game_leaderboard 1500 "player1" 2000 "player2" 1800 "player3"
    # 获取前10名
    ZREVRANGE game_leaderboard 0 9 WITHSCORES
    

5. 计数器与限流

  • 用途:统计访问量、点赞数,或限制接口请求频率。
  • 核心命令INCRINCRBYEXPIRE
  • 示例(接口限流:每分钟最多100次请求):
    # 每次请求递增计数器
    INCR api_rate_limit:user123
    # 设置过期时间(首次设置时)
    EXPIRE api_rate_limit:user123 60
    # 检查是否超限
    GET api_rate_limit:user123  # 超过100则拒绝
    

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

  • 用途:实现消息广播,支持实时通知(如聊天室、实时数据推送)。
  • 核心命令PUBLISHSUBSCRIBE
  • 示例(实时新闻推送):
    # 订阅频道
    SUBSCRIBE news_channel
    # 发布消息
    PUBLISH news_channel "Breaking: Redis 7.0 released!"
    

7. 地理位置服务

  • 用途:存储和查询地理位置(如附近的人、商家)。
  • 数据结构:GEO(基于 Sorted Set 实现)。
  • 示例(查找附近的餐厅):
    # 添加地理位置
    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)

  • 用途:高效判断元素是否存在(如防止缓存穿透、去重)。
  • 原理:基于概率的数据结构,占用空间极小。
  • 示例(校验新用户是否已注册):
    # 添加元素
    BF.ADD users "user123"
    # 检查是否存在
    BF.EXISTS users "user123"  # 返回1(可能存在)或0(一定不存在)
    

9. 实时数据分析

  • 用途:统计在线用户数、实时点击量等。
  • 数据结构:HyperLogLog(去重计数)、Bitmap(位操作)。
  • 示例(统计每日活跃用户):
    # 记录用户访问(用户ID为整型)
    SETBIT daily_active:20231001 1001 1
    # 统计总活跃用户数
    BITCOUNT daily_active:20231001
    

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

  • 用途:作为 MySQL 的二级存储,缓存复杂查询结果。
  • 模式:先查 Redis,未命中则查数据库并回填。
  • 示例缓存商品详情):
    # 查询商品信息
    GET product:detail:1001
    # 未命中时从数据库加载并写入Redis
    SET product:detail:1001 '{"id":1001,"name":"Phone"}' EX 3600
    

总结

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


http://www.ppmy.cn/devtools/163521.html

相关文章

Django ORM 的常用字段类型、外键关联的跨表引用技巧,以及 `_` 和 `__` 的使用场景

一、Django ORM 常用字段类型 1. 基础字段类型 字段类型说明示例CharField字符串字段,必须指定 max_lengthname models.CharField(max_length50)IntegerField整数字段age models.IntegerField()BooleanField布尔值字段is_active models.BooleanField()DateFiel…

【Excel】 Power Query抓取多页数据导入到Excel

抓取多页数据想必大多数人都会,只要会点编程技项的人都不会是难事儿。那么,如果只是单纯的利用Excel软件,我还真的没弄过。昨天,我就因为这个在网上找了好久发好久。 1、在数据-》新建查询-》从其他源-》自网站 ,如图 …

登录次数限制

文章目录 一、应用场景与设计目的1. 应用场景2. 设计目的 二、功能设计1. 登录限制规则2. 解锁机制3. 适用维度 三、技术实现1. 数据存储2. 逻辑流程3. 实现代码示例4. 动态锁定时间 四、安全增强与扩展1. 防止用户名枚举2. 加入验证码3. 监控与报警4. 分布式支持 五、设计思考…

TCP/IP的分层结构、各层的典型协议,以及与ISO七层模型的差别

1. TCP/IP的分层结构 TCP/IP模型是一个四层模型,主要用于网络通信的设计和实现。它的分层结构如下: (1) 应用层(Application Layer) 功能:提供应用程序之间的通信服务,处理特定的应用细节。 典型协议&am…

ChatGPT背后的理论基础:从预训练到微调的深度解析

友情提示:本文内容由银河易创(https://ai.eaigx.com)AI创作平台GPT-4o-mini模型生成,仅供参考。请根据具体情况和需求进行适当的调整和验证。 随着人工智能特别是自然语言处理技术的飞速发展,ChatGPT作为一种强大的对话…

Chart.js 折线图深入解析与使用指南

Chart.js 折线图深入解析与使用指南 引言 在数据可视化领域,折线图因其简洁直观的特性而被广泛应用。Chart.js 是一个轻量级的图表库,允许开发者轻松地创建各种图表,包括折线图。本文将深入解析 Chart.js 折线图的使用方法,帮助读者快速掌握其在网页中的应用。 目录 Cha…

解决Deepseek“服务器繁忙,请稍后再试”问题,基于硅基流动和chatbox的解决方案

文章目录 前言操作步骤步骤1:注册账号步骤2:在线体验步骤3:获取API密钥步骤4:安装chatbox步骤5:chatbox设置 价格方面 前言 最近在使用DeepSeek时,开启深度思考功能后,频繁遇到“服务器繁忙&am…

LeetCodeHot100_0x03

LeetCodeHot100_0x03 17. 缺失的第一个正数 求解思路: 这题一眼,这么简单???做出了还过了,第二眼,不接助O(N)空间,什么鬼?好吧,起码能想到用哈希解决&#…