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

redis常见使用场景

文章目录

    • redis常见使用场景
    • 全局ID
    • 位统计
    • 购物车
    • 用户消息时间线timeline
    • 抽奖
    • 商品筛选
    • 分布式锁
    • 限流
    • redis实现计数器
    • 排行榜
    • 消息队列
      • redis 如何实现延时队列
    • redis生产常用的场景

redis常见使用场景

Redis 是一种高性能的内存数据库,广泛应用于各种场景中。以下是 Redis 的常见使用场景:

  1. 缓存:作为缓存层,将频繁访问的数据存储在内存中,以加速数据访问速度。Redis 提供了丰富的数据结构和缓存策略,可以用于实现各种灵活的缓存方案。
  2. 会话存储:将用户会话数据存储在 Redis 中,用于实现分布式会话管理,提高系统的可扩展性和容错性。
  3. 计数器:用于实现各种计数器功能,比如网站访问量统计、点赞数统计等。
  4. 消息队列:利用 Redis 的发布订阅功能或者列表数据结构,实现简单的消息队列,用于异步处理任务、事件驱动等场景。
  5. 分布式锁:利用 Redis 的原子性操作和过期时间特性,实现分布式锁,用于解决并发访问时的资源竞争问题。
  6. 地理位置应用:利用 Redis 的地理位置数据结构,实现地理位置相关的应用,比如附近的人功能、地理位置搜索等。
  7. 实时排行榜:利用有序集合数据结构,实现实时排行榜功能,用于排名、统计等应用场景。
  8. 缓存预热:在系统启动或者高峰期前,通过 Redis 预先加载数据,以提高系统的响应速度和稳定性。
  9. 分布式会议管理:用于实现分布式锁、分布式信号量等功能,用于分布式系统的协调和同步。
  10. 实时数据分析:通过 Redis 提供的数据结构和原子性操作,支持实时数据分析、统计等功能。
    总的来说,Redis 在缓存、会话存储、消息队列、分布式锁等方面具有广泛的应用场景,可以帮助构建高性能、可扩展的应用系统。然而在使用 Redis 时,需要考虑数据持久化、高可用性、安全性等方面的问题,以及合理设计和优化 Redis 的使用方式。

缓存
String类型
例如:热点数据缓存(例如报表、明星出轨),对象缓存、全页缓存、可以提升热点数据的访问数据。

数据共享分布式
String 类型,因为 Redis 是分布式的独立服务,可以在多个应用之间共享
例如:分布式Session

<dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-data-redis</artifactId> </dependency>

全局ID

nt类型,incrby,利用原子性
incrby userid 1000
分库分表的场景,一次性拿一段

位统计

String类型的bitcount(1.6.6的bitmap数据结构介绍)
字符是以8位二进制存储的
setk1 a
setbit k1 6 1
setbit k1 7 0
get k1
/* 6 7 代表的a的二进制位的修改
a 对应的ASCII码是97,转换为二进制数据是01100001
b 对应的ASCII码是98,转换为二进制数据是01100010

因为bit非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。
*/
例如:在线用户统计,留存用户统计

购物车

String 或hash。所有String可以做的hash都可以做

用户消息时间线timeline

list,双向链表,直接作为timeline就好了。插入有序

抽奖

自带一个随机获得值
spop myset

商品筛选

sdiffset1 set2
//获取交集(intersection )
sinter set1 set2
//获取并集
sunion set1 set2

分布式锁

 String 类型setnx方法,只有不存在时才能添加成功,返回true  
public static boolean getLock(String key) {Long flag = jedis.setnx(key, "1");if (flag == 1) {jedis.expire(key, 10);}return flag == 1;
}public static void releaseLock(String key) {jedis.del(key);
}

代码要执多个redis命令,不加锁的情况下如何保证原子性 --分布式锁
lua脚本:https://segmentfault.com/a/1190000009811453
Redis 中执行 Lua 脚本
Lua脚本功能为Redis开发和运维人员带来如下三个好处:
●Lua脚本在Redis中是原子执行的,执行过程中间不会插入其他命令。
●Lua脚本可以帮助开发和运维人员创造出自己定制的命令,并可以将这些命令常驻在Redis内存中,实现复用的效果。
●Lua脚本可以将多条命令一次性打包,有效地减少网络开销。

限流

int类型,incr方法
以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false

redis实现计数器

int类型,increment()方法
例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库
使用场景: 一般常用在需要计数的场景,比如用户的访问次数、热点文章的点赞转发数量等

 /*** 利用redis做计数器* 可以处理业务上面的的一些访问次数之类的* 例如:文章的点赞数,阅读量,允许有一点的延迟效果,先保存到redis中,然后在同步到数据库当中*/@RequestMapping("hello")public void count() {/*** 判断是否到达次数*/Boolean aBoolean = invokeExceededTimes("time_key2",1,3);if (aBoolean) {LOGGER.info("可以访问");}else {LOGGER.info("请求次数达标了");}}/*** 判断同一个key在规定时间内访问次数是否到达了最高值* @param key   键* @param days  时间* @param count 一定时间内的访问次数* @return*/public Boolean invokeExceededTimes(String key, int days, int count) {LOGGER.info("key值:{}",key);// 判断在redis中是否有key值Boolean redisKey = stringRedisTemplate.hasKey(key);if (redisKey) {// 获取key所对应的valueInteger hasKey =Integer.parseInt((String)stringRedisTemplate.opsForValue().get(key));if (hasKey >= count) {return false;}// 对value进行加1操作stringRedisTemplate.opsForValue().increment(key,1);return true;}else {// 如果没有key值,对他进行添加到redis中stringRedisTemplate.opsForValue().set(key,"1",days,TimeUnit.DAYS);}return true;}

排行榜

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(SortedSet)也使得我们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的 10 个用户–我们称之为“user_scores”,
我们只需要像下面一样执行即可:
当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是使用 Redis 来存储数据的,你可以在这里看到

消息队列

List提供了两个阻塞的弹出操作:blpop/brpop,可以设置超时时间
blpop:blpop key1 timeout 移除并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
brpop:brpop key1 timeout 移除并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。
上面的操作。其实就是java的阻塞队列。学习的东西越多。学习成本越低
● 队列:先进先除:rpush blpop,左头右尾,右边进入队列,左边出队列
● 栈:先进后出:rpush brpop
发布订阅
Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。
Redis 客户端可以订阅任意数量的频道。
客户端向频道中发布消息,多个订阅者可以同时收到
Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得 Redis 能作为一个很好的消息队列平台来使用。Redis 作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。
如果你快速的在 Google 中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用 Redis 创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用 Redis 作为 broker,你可以从这里去查看。

Redis 异步队列
答:一般使用 list 结构作为队列,rpush 生产消息,lpop 消费消息。当 lpop 没有消息的时候, 要适当
sleep 一会再重试。
如果对方追问可不可以不用 sleep 呢?
list 还有个指令叫 blpop,在没有消息的时候,它会阻塞住直到消息到来。如果对方追问能不能生产一
次消费多次呢? 使用 pub/sub 主题订阅者模式, 可以实现1:N 的消息队列。
如果对方追问 pub/sub 有什么缺点?
在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 RabbitMQ 等。
如果对方追问 redis 如何实现延时队列?
我估计现在你很想把面试官一棒打死如果你手上有一根棒球棍的话, 怎么问的这么详细。但是你很克制,然后神态自若的回答道:使用 sortedset,拿时间戳作为score,消息内容作为 key 调用 zadd 来生产消息,消费者用 zrangebyscore 指令获取 N 秒之前的数据轮询进行处理。到这里, 面试官暗地里已经对你竖起了大拇指。但是他不知道的是此刻你却竖起了中指, 在椅子背后。

redis 如何实现延时队列

redis过期监听
redis的zset
redisson
redis延迟队列 的原理
基于上述原理,Redis延迟队列的工作流程通常如下:
● 将待执行的任务或消息以有序集合的形式存储在Redis中,其中成员为消息内容,分数为消息的执行时间。
● 使用定时任务轮询机制,定期检查有序集合中是否有到期的任务。可以通过Redis的定时任务调度器或外部定时任务程序实现。
● 当检测到有任务的执行时间已到达时,从有序集合中取出该任务,并执行相应的处理逻辑。
通过以上流程,可以实现延迟处理任务或消息的功能。Redis延迟队列通常具有较高的性能和可靠性,并且易于实现和部署。然而,需要注意的是,Redis延迟队列通常只能提供基本的延迟功能,如果需要更复杂的消息队列功能(如消息重试、消息持久化等),可能需要结合其他消息中间件来实现。
Redis延迟队列是一种常用的消息队列模式,用于延迟处理任务或消息。其原理通常基于两个主要组件:有序集合(Sorted Set)和定时任务轮询。

  1. 有序集合(Sorted Set):
    ○ Redis中的有序集合是一种数据结构,其中的每个成员都关联了一个分数(score)。有序集合的特性之一是按照分数从小到大排序。在延迟队列中,可以将消息或任务的执行时间作为分数,将消息内容作为成员存储在有序集合中。
  2. 定时任务轮询:
    ○ 定时任务轮询是一种机制,用于定期检查有序集合中是否有到期的任务或消息。通过定期轮询有序集合,可以检查是否有任务的执行时间已到达,从而将其取出并执行。
    基于上述原理,Redis延迟队列的工作流程通常如下:
    ● 将待执行的任务或消息以有序集合的形式存储在Redis中,其中成员为消息内容,分数为消息的执行时间。
    ● 使用定时任务轮询机制,定期检查有序集合中是否有到期的任务。可以通过Redis的定时任务调度器或外部定时任务程序实现。
    ● 当检测到有任务的执行时间已到达时,从有序集合中取出该任务,并执行相应的处理逻辑。
    通过以上流程,可以实现延迟处理任务或消息的功能。Redis延迟队列通常具有较高的性能和可靠性,并且易于实现和部署。然而,需要注意的是,Redis延迟队列通常只能提供基本的延迟功能,如果需要更复杂的消息队列功能(如消息重试、消息持久化等),可能需要结合其他消息中间件来实现。

redis生产常用的场景

分布式锁
限流
计数器
我们项目中有用到,主要用了3个场景:
1.缓存相关的场景,我们是做在线教育的,内容模板会有很多课程相关,这些数据在DB单表有5.600W;如果走mysql查询会很比较慢,用户体验感比较差,并发也上不去。所以我们做了些接口缓存、课程内容的对象缓存。提升了性能的同时,还解决了本地缓存不一致问题。
2.同时,我们由于它是分布式的,并且可以设置过期时间,也会用来保存用户token。因为token也是有过期时间的,用Redis来保存刚好满足。
3.我们还用它去基于日期+incr自增指令实现了一个分布式ID。因为我们的课程ID比较大,需要分库分表,数据库自增满足不了我们需求。

相关文章:

redis常见使用场景

文章目录 redis常见使用场景全局ID位统计购物车用户消息时间线timeline抽奖商品筛选分布式锁限流redis实现计数器排行榜消息队列redis 如何实现延时队列 redis生产常用的场景 redis常见使用场景 Redis 是一种高性能的内存数据库&#xff0c;广泛应用于各种场景中。以下是 Redi…...

模糊C均值(FCM)算法更新公式推导

模糊C均值&#xff08;FCM&#xff09;算法更新公式推导 目标函数 FCM的目标函数为&#xff1a; J m ∑ i 1 n ∑ j 1 k u i j m ∥ x i − c j ∥ 2 J_m \sum_{i1}^n \sum_{j1}^k u_{ij}^m \|x_i - c_j\|^2 Jm​i1∑n​j1∑k​uijm​∥xi​−cj​∥2 其中&#xff1a; …...

金融创新浪潮下的拆分盘投资探索

随着数字化时代的步伐加速&#xff0c;金融领域正经历着前所未有的变革。在众多金融创新中&#xff0c;拆分盘作为一种新兴的投资模式&#xff0c;以其独特的增长机制&#xff0c;吸引了投资者的广泛关注。本文将对拆分盘的投资逻辑进行深入剖析&#xff0c;并结合具体案例&…...

一份不知道哪里来的第十五届国赛模拟题

这是一个不知道来源的模拟题目&#xff0c;没有完全完成&#xff0c;只作代码记录&#xff0c;不作分析和展示&#xff0c;极其冗长&#xff0c;但里面有长按短按双击的复合&#xff0c;可以看看。 目录 题目代码底层驱动主程序核心代码关键&#xff1a;双击单击长按复合代码 …...

机器人动力学模型与MATLAB仿真

机器人刚体动力学由以下方程控制&#xff01;&#xff01;&#xff01; startup_rvc mdl_puma560 p560.dyn 提前计算出来这些“disturbance”&#xff0c;然后在控制环路中将它“抵消”&#xff08;有时候也叫前馈控制&#xff09; 求出所需要的力矩&#xff0c;其中M项代表克服…...

SAPUI5基础知识3 - 引导过程(Bootstrap)

1. 背景 在上一篇博客中&#xff0c;我们已经建立出了第一个SAPUI5项目&#xff0c;接下来&#xff0c;我们将为这个项目添加引导过程。 在动手练习之前&#xff0c;让我们先解释一下什么引导过程。 1.1 什么是引导过程&#xff1f; 在计算机科学中&#xff0c;引导过程也称…...

ABAP 借助公司封装的钉钉URL,封装的RFC给钉钉发送消息

FUNCTION ZRFC_BC_SMSSEND_DINGTALK. *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *" IMPORTING *" VALUE(DESTUSRID) TYPE CHAR255 *" VALUE(CONTENT) TYPE CHAR255 *&quo…...

登录校验及全局异常处理器

登录校验 会话技术 会话:用户打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束.在一次会话中可以包含多次请求和响应会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话请求间共享数据会话跟踪方案 客户端…...

计算机视觉与模式识别实验1-2 图像的形态学操作

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;1.图像膨胀2.图像腐蚀3.膨胀与腐蚀的综合使用4.对下面二值图像的目标提取骨架&#xff0c;并分析骨架结构。 &#x1f9e1;&#x1f9e1;全部代码&#x1f9e1;&#x1f9e1; &#x1f9e1;&#x1f9e1…...

【前端每日基础】day31——uni-app

uni-app 开发详细介绍 基本概念 uni-app&#xff1a;uni-app 是一个使用 Vue.js 开发多端应用的框架&#xff0c;可以编译到微信小程序、支付宝小程序、百度小程序、字节跳动小程序、H5、App等多个平台。 跨平台&#xff1a;一次开发&#xff0c;多端部署。通过条件编译实现多…...

云动态摘要 2024-05-31

给您带来云厂商的最新动态&#xff0c;最新产品资讯和最新优惠更新。 最新优惠与活动 [1.5折起]年中盛惠--AI分会场 腾讯云 2024-05-30 人脸核身、语音识别、文字识别、数智人、腾讯混元等热门AI产品特惠&#xff0c;1.5折起 云服务器ECS试用产品续用 阿里云 2024-04-14 云…...

Oracle数据块如何存储真实数据

上周休假了几天,颓废了,没有输出。今天写一点内容。 先抛出一个问题。表中的数据在Oracle数据块中是如何存储的呢?今天简单说一下这个问题。通常数据库中的表会存储字符,数字,日期 这3种常见的数据类型。下面的例子就用这3种数据类型作说明 首先,Oracle数据块底层存储这…...

【WEB前端2024】开源智体世界:乔布斯3D纪念馆-第30课-门的移动动画

【WEB前端2024】开源智体世界&#xff1a;乔布斯3D纪念馆-第30课-门的移动动画 使用dtns.network德塔世界&#xff08;开源的智体世界引擎&#xff09;&#xff0c;策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎…...

智能化改造给企业带来的实际效果

1. 提高生产效率&#xff1a;通过自动化和智能化的生产线&#xff0c;减少人工操作&#xff0c;显著提升单位时间内的生产量。 2. 提升产品质量&#xff1a;智能化改造通过精确控制生产过程&#xff0c;减少人为错误&#xff0c;提高产品的一致性和可靠性。 3. 降低生产成本&am…...

深度学习-语言模型

深度学习-语言模型 统计语言模型神经网络语言模型语言模型的应用序列模型&#xff08;Sequence Model&#xff09;语言模型&#xff08;Language Model&#xff09;序列模型和语言模型的区别 语言模型&#xff08;Language Model&#xff09;是自然语言处理&#xff08;NLP&…...

微型导轨在自动化制造中有哪些优势?

微型导轨在自动化制造中发挥重要作用&#xff0c;能够满足自动化设备制造中对精度要求较高的工艺环节。适用于自动装配线、自动检测设备和机器人操作等环节&#xff0c;推动了行业的进步与发展。那么&#xff0c;微型导轨在使用中有哪些优势呢&#xff1f; 1、精度高和稳定性强…...

探索气象数据的多维度三维可视化:PM2.5、风速与高度分析

探索气象数据的多维度可视化&#xff1a;PM2.5、风速与高度分析 摘要 在现代气象学中&#xff0c;数据可视化是理解复杂气象模式和趋势的关键工具。本文将介绍一种先进的数据可视化技术&#xff0c;它能够将PM2.5浓度、风速和高度等多维度数据以直观和动态的方式展现出来。 …...

【传知代码】双深度学习模型实现结直肠癌检测(论文复现)

前言&#xff1a;在医学领域&#xff0c;科技的进步一直是改变人类生活的关键驱动力之一。随着深度学习技术的不断发展&#xff0c;其在医学影像诊断领域的应用正日益受到关注。结直肠癌是一种常见但危害极大的恶性肿瘤&#xff0c;在早期发现和及时治疗方面具有重要意义。然而…...

平衡二叉树的应用举例

AVL 是一种自平衡二叉搜索树&#xff0c;其中任何节点的左右子树的高度之差不能超过 1。 AVL树的特点&#xff1a; 1、它遵循二叉搜索树的一般属性。 2、树的每个子树都是平衡的&#xff0c;即左右子树的高度之差最多为1。 3、当插入新节点时&#xff0c;树会自我平衡。因此…...

一键安装 HaloDB 之 Ansible for Halo

↑ 关注“少安事务所”公众号&#xff0c;欢迎⭐收藏&#xff0c;不错过精彩内容~ 前倾回顾 前面介绍了“光环”数据库的基本情况和安装办法。 哈喽&#xff0c;国产数据库&#xff01;Halo DB! 三步走&#xff0c;Halo DB 安装指引 以及 HaloDB 的 Oracle 和 MySQL 兼容模式: …...

深入解析:高级 Android 开发工程师职位与面试全攻略

引言:移动互联网时代的核心力量 在当今移动互联网蓬勃发展的时代,智能手机已成为人们日常生活中不可或缺的一部分。作为连接用户与数字服务的桥梁,移动应用扮演着至关重要的角色。而在移动应用的生态中,Android 系统凭借其开放性和庞大的用户基础,占据了全球移动操作系统…...

ANPC逆变器下垂控制的“阻抗相消术

ANPC-下垂功率均分-两台ANPC三电平逆变器在不同阻感性线路阻抗下实现有功均分与无功均分&#xff0c;采用积分改进法&#xff08;阻抗相消法&#xff09;&#xff0c;电压电流双闭环控制&#xff0c;中点电位平衡控制&#xff0c;SPWM调制。 1.下垂&#xff0c;电压电流双闭环控…...

OpenClaw自动化周报生成:Qwen3-32B私有镜像精准提取Git提交记录

OpenClaw自动化周报生成&#xff1a;Qwen3-32B私有镜像精准提取Git提交记录 1. 为什么需要自动化周报生成 每周五下午&#xff0c;我都会面临同样的困扰&#xff1a;需要从零散的Git提交记录中手动整理本周工作内容&#xff0c;再拼凑成一份结构化的周报。这个过程不仅耗时&a…...

蓝牙5.1室内定位精度提升秘籍:iBeacon+AoA技术实战指南

蓝牙5.1室内定位精度提升秘籍&#xff1a;iBeaconAoA技术实战指南 在仓储物流和医疗设备管理等对定位精度要求严苛的场景中&#xff0c;传统蓝牙RSSI定位技术常因多径效应和信号衰减导致2-5米的误差。而蓝牙5.1引入的AoA&#xff08;到达角&#xff09;技术&#xff0c;配合iBe…...

从SolidWorks到Gazebo:手把手教你用SW2URDF插件为ROS2 Humble机械臂建模(含ROS2适配避坑指南)

从SolidWorks到Gazebo&#xff1a;ROS2 Humble机械臂建模全流程实战 1. 工业设计与机器人仿真的桥梁搭建 当机械工程师第一次接触机器人仿真时&#xff0c;往往会面临一个关键挑战&#xff1a;如何将精心设计的SolidWorks模型转化为可在Gazebo中运行的仿真模型&#xff1f;这个…...

Comsol流固耦合分析中的达西定律模块与固体力学模块的应用

Comsol流固耦合注浆及冒浆分析 采用其中达西定律模块及固体力学模块&#xff0c;通过建立质量源项、体荷载等实现上述考虑渗流场与结构场流固耦合理论方程的嵌入。在COMSOL里玩流固耦合就像给工程问题装了个动态CT扫描仪。最近在搞注浆冒浆模拟时发现&#xff0c;把达西渗流和固…...

数字图书馆下载工具:高效获取策略与跨平台使用方案

数字图书馆下载工具&#xff1a;高效获取策略与跨平台使用方案 【免费下载链接】internet_archive_downloader A chrome/firefox extension that download books from Internet Archive(archive.org) and HathiTrust Digital Library (hathitrust.org) 项目地址: https://git…...

HTML2Canvas终极指南:快速将网页内容转为精美图片的完整方案

HTML2Canvas终极指南&#xff1a;快速将网页内容转为精美图片的完整方案 【免费下载链接】html2canvas Screenshots with JavaScript 项目地址: https://gitcode.com/gh_mirrors/ht/html2canvas HTML2Canvas是一款强大的JavaScript库&#xff0c;能够直接在浏览器中把网…...

实践指南:如何使用Cisco DefenseClaw保护你的AI Agent安全

一、背景&#xff1a;AI Agent安全面临的新挑战 最近&#xff0c;开源AI代理框架OpenClaw遭遇了大规模供应链攻击&#xff0c;超过800个恶意技能被植入ClawHub技能市场。这个事件被命名为"ClawHavoc"&#xff0c;它暴露了AI Agent生态的安全漏洞。 作为开发者&#x…...

pyqt使用QChartView绘制饼状图详解(QPieSeries)

pyqt使用QChartView绘制柱状图一、工程搭建二、QPieSeries详解1、核心概念2、主要功能和方法2.1、QPieSeries 的常用方法2.2、QPieSlice 的常用属性和方法3、关键点解释4、常见问题二、代码示例1、示例代码2、效果展示一、工程搭建 pyqt6QtCharts模块需要单独安装&#xff0c;…...