当前位置: 首页 > news >正文

【Redis】3-Redis应用

欢迎来到啾啾的博客🐱。
记录学习点滴。分享工作思考和实用技巧,偶尔也分享一些杂谈💬。
有很多很多不足的地方,欢迎评论交流,感谢您的阅读和评论😄。

目录

  • 引言
  • Redis自己是怎么介绍的?
    • String字符串
    • JSON
    • Lists
    • Sets
    • Hashes
    • Sorted Sets
    • Bitmaps
  • 常见Redis应用
    • 缓存
    • 分布式锁

引言

作为一个高效简单的内存数据库,Redis有哪些具体应用场景?

PS:本系列开始于“黄健宏”老师的老本著作《Redis设计与实现》、《Redis应用实例》。
我从问题的角度做了总结与拓展,前面几篇内容更偏向设计思想与机制总结。
阿里有出过《Redis最佳实践》,里面有更多的企业级应用实例,也推荐看看。

Redis自己是怎么介绍的?

在官网上,Redis有对自己的数据结构做介绍的同时并介绍用法,如下:

String字符串

Redis String可以用于存储字节序列,包括文本、序列化对象和二进制数组。注意值不能大于512MB。默认情况下,单个 Redis 字符串的最大大小为 512 MB。

  • set 命令有 nx 与 xx选项
    nx:要求key不存在才会成功
    xx:要求key存在才会成功
    ![[Redis应用-1.png]]

  • 作为计数器使用
    Redis的String可以作为一个原子增量使用,如下:

![[Redis应用.png]]

提供incr命令以原子方式将存储在给定键中的计数器增加 1。INCRBY 原子递增(并在传递负数时递减)存储在给定键处的计数器。

JSON

Redis 开源版的 JSON 功能为 Redis 提供了 JavaScript Object Notation (JSON) 支持。它允许您在 Redis 数据库中存储、更新和检索 JSON 值,就像处理任何其他 Redis 数据类型一样。

没什么示例应用,跳过。

Lists

Redis 列表是字符串值的链表。Redis 列表经常用于:

  • 实现栈和队列
    LPUSH 将一个新元素添加到列表头部; RPUSH 添加到列表尾部。
    LPOP 从列表头部移除并返回一个元素; RPOP 执行相同操作,但移除的是列表尾部元素。
    LLEN 返回列表的长度。
    LMOVE 原子性地将元素从一个列表移动到另一个列表。
    LRANGE 从列表中提取一个元素范围。
    LTRIM 将列表缩减为指定的元素范围。
    列表还支持多个阻塞命令:
    BLPOP 从列表头部移除并返回一个元素。如果列表为空,该命令会阻塞,直到有元素可用或直到指定的超时时间到达。
    BLMOVE 原子地将元素从源列表移动到目标列表。如果源列表为空,该命令会阻塞,直到有新元素可用。
    ![[Redis应用-2.png]]

  • 构建后台工作系统的队列管理
    比如在生产者——消费者模式中,其中生产者将项目推入列表,消费者(通常是工作进程)消费这些项目并执行操作。
    例子: Twitter 社交网络将用户发布的最新推文存入 Redis 列表中。

  • 作为限制列表
    在许多使用场景中,我们只想用列表来存储最新的项目,无论它们是什么:社交网络更新、日志或其他任何内容。
    Redis 允许我们使用列表作为一个有上限的集合,只记住最新的 N 个项目,并使用 LTRIM 命令丢弃所有最旧的项目。
    LTRIM 命令与 LRANGE 命令类似,但它不是显示指定的元素范围,而是将这个范围设置为新的列表值。给定范围之外的元素都会被移除。
    例如,如果你正在将自行车添加到维修列表的末尾,但只想关注列表中最长的 3 个项目:
    ![[Redis应用-3.png]]

Sets

是一个无序的唯一字符串(成员)的集合。
SADD 向集合中添加一个新成员。
SREM 从集合中移除指定的成员。
SISMEMBER 测试一个字符串是否属于集合。
SINTER 返回两个或多个集合共有的成员集合(即交集)。
SCARD 返回集合的大小(也称为基数)。

常用于:

  • 跟踪唯一项(例如,跟踪访问特定博客文章的所有唯一 IP 地址)
  • 表示关系(例如,具有给定角色的所有用户的集合)
  • 执行交集、并集和差集等常见集合操作

比如存储比赛的自行车集合。
登记操作:
![[Redis应用-4.png]]

检查操作,bike:2 只存在于bikes:racing:france

![[Redis应用-5.png]]

bike:1 两个集合都存在。SINTER命令查看交集。

Hashes

Redis 哈希是记录类型,结构为字段-值对的集合。你可以使用哈希来表示基本对象,以及存储计数器分组等。
每个哈希可以存储高达 4,294,967,295 (2^32 - 1) 个字段-值对。在实际应用中,你的哈希受限于承载 Redis 部署的虚拟机的总内存。

Sorted Sets

有序集合是一个由唯一字符串(成员)组成的集合,这些成员按关联的分数排序。当多个字符串具有相同的分数时,这些字符串会按字典序排序。
常用于以下场景:

  • 排行榜
    可以使用 sorted sets 轻松维护大型在线游戏中最高分数的有序列表。
# 添加/更新玩家得分
ZADD game:xyz:leaderboard 1500 "player1"
ZADD game:xyz:leaderboard 2200 "player2"
ZADD game:xyz:leaderboard 1800 "player3"# "player1" 得分增加 300
ZINCRBY game:xyz:leaderboard 300 "player1" # player1 score becomes 1800# 获取得分最高的 Top 3 玩家 (降序)
ZREVRANGE game:xyz:leaderboard 0 2 WITHSCORES# 获取 "player2" 的排名 (0-based, 降序)
ZREVRANK game:xyz:leaderboard "player2"
  • 速率限制器
    可以使用一个 sorted set 来构建滑动窗口速率限制器,以防止过多的 API 请求。

Bitmaps

本质上是字符串,但可以对字符串的任意位进行操作(0或1)。非常节省空间,适合大规模布尔型数据。由于字符串是二进制安全的字节数组,且其最大长度为 512 MB,因此它们适合设置多达 2^32 个不同的位。
核心操作: SETBIT, GETBIT, BITCOUNT, BITPOS, BITOP (AND, OR, XOR, NOT)

  • 签到与统计
# 用户ID为1000的用户在某天签到 (假设1000是bit的偏移量)
# key: daily_checkin:2023-10-27
SETBIT daily_checkin:2023-10-27 1000 1
SETBIT daily_checkin:2023-10-27 1005 1# 检查用户ID为1000是否签到
GETBIT daily_checkin:2023-10-27 1000# 统计当天签到总人数
BITCOUNT daily_checkin:2023-10-27# 统计连续3天都签到的用户 (需要BITOP AND)
# SETBIT daily_checkin:2023-10-26 1000 1
# SETBIT daily_checkin:2023-10-25 1000 1
# BITOP AND连续3天签到 daily_checkin:2023-10-27 daily_checkin:2023-10-26 daily_checkin:2023-10-25
# BITCOUNT 连续3天签到

等等……
基本上都是从数据结构的特性出发做应用。这里放一个官网地址https://redis.io/docs/latest/develop/data-types/

常见Redis应用

缓存

在微服务架构中,我们往往需要一个线程安全的共享存储来作为缓存使用。目的是提升性能与降低数据源压力。
在权衡内存后,一些热点数据、读多写少的数据都可以使用缓存来提升性能。
作为缓存时,其按照命中与使用情况常常有3类问题:
![[Redis应用P1-Redis的自我介绍-3.png]]

  • 缓存穿透
    缓存未命中,请求到数据源。
    缓存穿透主要是需要防范不正常请求,如数据库一般肯定没有的user:id -999。
    需要在应用层对查询数据做过滤限制,或者为无效请求缓存一个短期结果。

  • 缓存击穿
    缓存未命中,请求到数据源。但是请求是有效的。
    一般发生在热点数据上。需要给热点数据续时间或者设置永不过期。
    或者给热点数据的数据源请求加互斥操作。只要能实现给数据源降压的效果都行。

  • 缓存雪崩
    雪崩意味着同一时间大量问题。在缓存这里就是同一时间缓存都失效。
    应对方法有给缓存设置不同的随机失效时间。热点数据不过期、讲热点数据分散在不同缓存数据库等。

分布式锁

Redis本省是线程安全的+String有nx操作。所以Redis String很适合用来作为分布式锁。


文章转载自:

http://Ie297wpY.mfxcg.cn
http://mcCwyjbG.mfxcg.cn
http://MhBwpv0I.mfxcg.cn
http://yyeP0THj.mfxcg.cn
http://tkKJ5f21.mfxcg.cn
http://6rO2jvi2.mfxcg.cn
http://w6uzwFoT.mfxcg.cn
http://ESyxYzC7.mfxcg.cn
http://Q2hEO1k1.mfxcg.cn
http://3p0yQ0u7.mfxcg.cn
http://2HpZPe0M.mfxcg.cn
http://qGjGI5Pa.mfxcg.cn
http://W9CA6KXZ.mfxcg.cn
http://5ZyOkcz7.mfxcg.cn
http://b1H3Ezcg.mfxcg.cn
http://gXgoQQS3.mfxcg.cn
http://ed1OJKsG.mfxcg.cn
http://4cH62fWK.mfxcg.cn
http://E1AVFFqV.mfxcg.cn
http://7OwZlIh9.mfxcg.cn
http://ogVTUwzz.mfxcg.cn
http://f3Bb8OX6.mfxcg.cn
http://9gUOfYfL.mfxcg.cn
http://Q7ais8MZ.mfxcg.cn
http://2WcRDLMG.mfxcg.cn
http://zeIdUVMB.mfxcg.cn
http://jl7fl4qF.mfxcg.cn
http://UudDR4rg.mfxcg.cn
http://MCc9kjn4.mfxcg.cn
http://Geupsjro.mfxcg.cn
http://www.dtcms.com/a/214664.html

相关文章:

  • 大语言模型(LLM)入门项目推荐
  • 【springMVC】springMVC学习系列一:springMVC的组件
  • 经典分类模型
  • C#编解码:Base64扩展类的实现与应用
  • 一、奋斗类(事业奋斗/梦想实现)
  • ACM Latex模板:合并添加作者和单位
  • 智能护航 安心畅游——AI智能监控系统解决方案
  • 双11、618大促要做什么?
  • 报错:ImportError: cannot import name ‘metadata‘ from ‘importlib‘
  • IAM角色访问AWS RDS For MySQL
  • Linux云计算训练营笔记day16(Linux周期性计划任务、Python)
  • Prometheus、Exporter 和 Grafana:性能分析铁三角
  • 两阶段法目标检测发展脉络
  • Python 实现简单车牌识别
  • 【01】大模型原理与API使用
  • 第2章(新)Day2 - Python基础入门
  • 设计模式-简单工厂模式
  • #git 储藏库意外被清空 Error: bad index – Fatal: index file corrupt
  • 横向联邦学习、纵向联邦学习与联邦迁移学习是联邦学习的三大主要分支
  • 【保姆级教程】TortoiseGit安装和Visual Studio2019插件配置详细说明
  • IP动态伪装开关
  • 【后端高阶面经:Elasticsearch篇】38、Elasticsearch 高可用架构解析:分片容灾、Translog 调优与双集群
  • ArkUI:鸿蒙应用响应式与组件化开发指南(一)
  • 工业通信新利器: RS485/MQTT转换器技术解析与应用指南
  • Python 的开发效率真的比 Java 高吗
  • Vue 3.0 中状态管理Vuex 与 Pinia 的区别
  • 企业级云原生平台的演进路径与治理框架
  • 《软件工程》第 11 章 - 结构化软件开发
  • 华为OD机试真题——通信系统策略调度(用户调度问题)(2025B卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • Node.js全局函数详解:定时器与即时回调