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

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.mzph.cn/diannao/70961.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JBoltAI_SpringBoot如何区分DeepSeek R1深度思考和具体回答的内容(基于Ollama)?

当我们用Ollama运行DeepSeek R1模型,向它提问时,会发现它的回答里是有think标签的 如果我们直接将Ollama的回复用于生产环境,肯定是不行的,对于不同的场景,前面输出的一堆内容,可能并不需要在客户端展示&a…

MySQL 使用 `WHERE` 子句时 `COUNT(*)`、`COUNT(1)` 和 `COUNT(column)` 的区别解析

文章目录 1. COUNT() 函数的基本作用2. COUNT(*)、COUNT(1) 和 COUNT(column) 的详细对比2.1 COUNT(*) —— 统计所有符合条件的行2.2 COUNT(1) —— 统计所有符合条件的行2.3 COUNT(column) —— 统计某一列非 NULL 的记录数 3. 性能对比3.1 EXPLAIN 分析 4. 哪种方式更好&…

将DeepSeek接入vscode的N种方法

接入deepseek方法一:cline 步骤1:安装 Visual Studio Code 后,左侧导航栏上点击扩展。 步骤2:搜索 cline,找到插件后点击安装。 步骤3:在大模型下拉菜单中找到deep seek,然后下面的输入框输入你在deepseek申请的api key,就可以用了 让deepseek给我写了一首关于天气的…

AndroidManifest.xml文件的作用

AndroidManifest.xml文件在Android应用程序中扮演着至关重要的角色。它是应用程序的全局配置文件,提供了关于应用程序的所有必要信息,这些信息对于Android系统来说是至关重要的,因为它决定了应用程序的运行方式和权限要求,确保了应…

Mac本地部署Deep Seek R1

Mac本地部署Deep Seek R1 1.安装本地部署大型语言模型的工具 ollama 官网:https://ollama.com/ 2.下载Deepseek R1模型 网址:https://ollama.com/library/deepseek-r1 根据电脑配置,选择模型。 我的电脑:Mac M3 24G内存。 这…

React进阶之前端业务Hooks库(五)

前端业务Hooks库 Hooks原理useStateuseEffect上述问题useState,useEffect 复用的能力练习:怎样实现一套React过程中的hooks状态 & 副作用Hooks原理 不能在循环中、条件判断、子函数中调用,只能在函数最外层去调用useEffect 中,deps 为空,执行一次useState 使用: imp…

从像素到光线:现代Shader开发的范式演进与性能优化实践

引言 在实时图形渲染领域,Shader作为GPU程序的核心载体,其开发范式已从早期的固定功能管线演进为高度可编程的计算单元。本文通过解析关键技术案例,结合现代图形API(如Vulkan、Metal)的特性,深入探讨Shade…

(七)消息队列-Kafka 序列化avro(传递)

(七)消息队列-Kafka 序列化avro(传递) 客从远方来,遗我双鲤鱼。呼儿烹鲤鱼,中有尺素书。 ——佚名《饮马长城窟行》 本文已同步CSDN、掘金平台、知乎等多个平台,图片依然保持最初发布的水印&…

PXE批量网络装机与Kickstart自动化安装工具

目录 一、系统装机的原理 1.1、系统装机方式 1.2、系统安装过程 二、PXE批量网络装机 2.1、PXE实现原理 2.2、搭建PXE实际案例 2.2.1、安装必要软件 2.2.2、搭建DHCP服务器 2.2.3、搭建TFTP服务器 2.2.4、挂载镜像并拷贝引导文件到tftp服务启动引导文件夹下 2.2.5、编…

【全栈开发】从0开始搭建一个图书管理系统【一】框架搭建

【全栈开发】从0开始搭建一个图书管理系统【一】框架搭建 前言 现在流行降本增笑,也就是不但每个人都要有事干不能闲着,更重要的是每个人都要通过报功的方式做到平日的各项工作异常饱和,实现1.5人的支出干2人的活计。单纯的数据库开发【肤浅…

部署Flink1.20.1

1、设置环境变量 export JAVA_HOME/cluster/jdk export CLASSPATH.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jarp #export HIVE_HOME/cluster/hive export MYSQL_HOME/cluster/mysql export HADOOP_HOME/cluster/hadoop3 export HADOOP_CONF_DIR$HADOOP_HOME/etc/hadoop …

【超详细】神经网络的可视化解释

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

深入了解 Python 中的 MRO(方法解析顺序)

文章目录 深入了解 Python 中的 MRO(方法解析顺序)什么是 MRO?如何计算 MRO?C3 算法的合并规则C3 算法的合并步骤示例:合并过程解析 MRO 解析失败的场景使用 mro() 方法查看 MRO示例 1:基本用法 菱形继承与…

数字化赋能:制造业如何突破低效生产的瓶颈?

随着全球经济的快速发展与市场需求的变化,制造业面临着前所未有的压力与挑战。生产效率、资源管理、品质控制、成本控制等方面的问题日益突出,尤其是低效生产成为了许多制造企业亟待解决的瓶颈。在这种背景下,数字化转型成为提升制造业效率的…

Element-Plus,使用 El-form中 的 scroll-to-error 没有效果问题记录

因业务需要表单组件中嵌套着表格列表,内容比较多; 所以需要表单校验不通过时,自动定位到不通过的节点; 但发现这个像是没有起到效果一样,后面就是排查的思路了: 容器高度问题:如果表单容器的高度…

基于Javase的停车场收费管理系统

基于Javase的停车场收费管理系统 停车场管理系统开发文档 项目概述 1.1 项目背景 随着现代化城市的不断发展,车辆数量不断增加,停车难问题也日益突出。为了更好地管理停车场资 源,提升停车效率,需要一个基于Java SE的停车场管理…

网络协议 HTTP、HTTPS、HTTP/1.1、HTTP/2 对比分析

1. 基本定义 HTTP(HyperText Transfer Protocol) 应用层协议,用于客户端与服务器之间的数据传输(默认端口 80)。 HTTP/1.0:早期版本,每个请求需单独建立 TCP 连接,效率低。HTTP/1.1&…

DeepSeek掘金——调用DeepSeek API接口 实现智能数据挖掘与分析

调用DeepSeek API接口:实现智能数据挖掘与分析 在当今数据驱动的时代,企业和开发者越来越依赖高效的数据挖掘与分析工具来获取有价值的洞察。DeepSeek作为一款先进的智能数据挖掘平台,提供了强大的API接口,帮助用户轻松集成其功能到自己的应用中。本文将详细介绍如何调用D…

LabVIEW同步数据采集功能

VI通过使用数据采集(DAQ)硬件系统,进行多通道同步采集,实时获取模拟信号数据。它利用外部时钟信号触发数据采集,支持连续采样模式,并将采集到的数据实时显示在波形图上,方便用户进行数据监控和分…

SpringDataJPA使用deleteAllInBatch方法逻辑删除失效

概述 在使用Spring Boot JPA时,执行批量删除操作时,遇到逻辑删除失效的问题。具体而言,当使用deleteAllInBatch方法时,数据会被物理删除,而不是进行逻辑删除;但是当使用deleteAll时,逻辑删除操…