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

晋江+网站建设+推广软件定制

晋江+网站建设+推广,软件定制,学校网站怎么做推广,登封快乐送餐在那个网站做的广告“如何实现Redis延时队列”这个面试题应该也是比较常见的,解答如下: 使用sortedset(有序集合) ,拿时间戳作为 score ,消息内容作为key 调用 zadd 来生产消息,消费者用zrangebyscore 指令获取 N …

“如何实现Redis延时队列”这个面试题应该也是比较常见的,解答如下:
使用sortedset(有序集合) ,拿时间戳作为 score ,消息内容作为key 调用 zadd 来生产消息,消费者用zrangebyscore 指令获取 N 秒之前的数据轮询进行处理。

目录

  • 实现思路
  • 引入Jedis
  • 指令简介
    • zadd
    • zrem
    • zrangeByScore
  • Java实现Redis延时队列

实现思路

Java实现Redis延时队列,首先要了解何为延时队列,即可以将消息存储在队列中,并在指定的延时时间后再将消息出队。这种队列在很多场景下都非常有用,例如消息延时处理,延时确认(订单确认) 等,参考以上解答,思路应该拆分:
首先需要有个延时队列,该队列是通过一定顺序(当前时间戳+延时时间)排序的(即优先取到延时时间已结束的数据),然后消费者端就需要获取到队列中延时时间靠前结束的数据(即当前时间戳+延时时间靠前)。

引入Jedis

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>3.7.0</version>
</dependency>

指令简介

zadd

zadd命令用于将一个成员Score值加入到有序集合中。Score值可以是整数或者浮点数。如果有序集合中已经存在相同的成员,那么旧成员将被替代。
语法:ZADD key Score member [Score2 member2 …]
示例:ZADD students 100 alice 或 ZADD students 80 alice 90 bob (添加单个或多个情况)

zrem

zrem命令用于从有序集合中移除一个或多个成员。该命令接收两个参数:第一个参数是要操作的有序集合的键,第二个参数是将要移除的成员的值。
语法:ZREM key member [member …]
示例:ZREM students alice

zrangeByScore

zrangeByScore命令用于获取分数在指定范围内的所有成员。
语法:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
参数说明:
key:Redis中的键。
min:最小分数。
max:最大分数。
WITHSCORES:可选参数,如果设置为true,则返回分数以及成员。
LIMIT:可选参数,用于限制返回的成员数量。
offset:偏移量,从第几个成员开始。
count:限制返回的成员数量。
返回值:
按照分数升序返回成员列表。
如果设置了LIMIT参数,则返回限制数量的成员。
示例:ZADD ZRANGEBYSCORE students 80 90 WITHSCORES

Java实现Redis延时队列

核心部分,消息队列工具类

import redis.clients.jedis.Jedis;
import java.util.Set;public class DelayQueueWithRedis {private Jedis jedis;private String queueKey;public DelayQueueWithRedis(Jedis jedis, String queueKey) {this.jedis = jedis;this.queueKey = queueKey;}// 添加消息到延迟队列public void push(String message, long delaySeconds) {// 计算消息的分数,这里使用消息进入队列的时间加上延迟时间long score = System.currentTimeMillis() / 1000 + delaySeconds;//向有序集合添加一个成员,并设置其分数jedis.zadd(queueKey, score, message);}// 获取并消费一条消息public String pop() {while (true) {long now = System.currentTimeMillis() / 1000;// 只获取分数在0到当前时间的元素Set<String> messages = jedis.zrangeByScore(queueKey, 0, now, 0, 1);if (messages.isEmpty()) {System.out.println("No messages");// 没有可消费的消息,休眠一会儿继续尝试try {Thread.sleep(500);} catch (InterruptedException e) {Thread.currentThread().interrupt();break;}} else {String message = messages.iterator().next();// 从有序集合中移除一个成员jedis.zrem(queueKey, message);return message;}}return null;}
}

生产者端测试

import redis.clients.jedis.Jedis;/*** @Author: zhangximing* @Email: 530659058@qq.com* @Date: 2024/2/19 16:53* @Description: 生产者端测试*/
public class MainP {public static void main(String[] args) {Jedis jedis = new Jedis("localhost",6379);DelayQueueWithRedis delayQueue = new DelayQueueWithRedis(jedis, "delay_queue");// 添加延时消息delayQueue.push("message1", 5);delayQueue.push("message2", 10);delayQueue.push("message3", 8);}}

消费者端测试

import redis.clients.jedis.Jedis;/*** @Author: zhangximing* @Email: 530659058@qq.com* @Date: 2024/2/19 16:51* @Description: 消费者端测试*/
public class MainC {public static void main(String[] args) {Jedis jedis = new Jedis("localhost",6379);DelayQueueWithRedis delayQueue = new DelayQueueWithRedis(jedis, "delay_queue");// 消费延时消息while (true) {String message = delayQueue.pop();if (message != null) {System.out.println("Consumed: " + message);}}}
}

测试结果:数据在延时指定时间后才正常打印
在这里插入图片描述

http://www.fp688.cn/news/145077.html

相关文章:

  • wordpress主题 微软seo sem
  • 长沙市住房城乡建设委网站百度账号人工客服
  • 网站建设服务有哪些内容百度投诉中心在线申诉
  • 哪家公司做网站建设比较好微信推广广告在哪里做
  • 网站模板内容怎么添加图片不显示百度首页推荐关不掉吗
  • 网页网站设计与制作seo发展前景怎么样啊
  • 个人做跨境电商网站有哪些新站优化案例
  • 关于seo关键词选择有哪些方法seo优化中以下说法正确的是
  • 网站制作内容文案谷歌推广seo
  • 做拉皮条网站关键词推广优化外包
  • 建设网站的目的四川企业seo推广
  • 关于做网站的外语文献珠海seo快速排名
  • 项目网站有哪些品牌推广的意义
  • 好的网站分享百度sem竞价托管公司
  • 官方网站车联网是谁做企业网站制作开发
  • 企业网站开发心得体会网站模板平台资源
  • 莒县网站建设河南网站建站推广
  • 网站建设seo 视频友情链接购买
  • 临沂在线上网站建设中国搜索引擎份额排行
  • 申请注册网站上海职业技能培训机构一览表
  • 用什么做网站简单湘潭网站定制
  • 免费 网站源码百度推广关键词排名规则
  • 宝安做网站信科网站关键词排名优化电话
  • 政府信息网站建设对策长沙百度百科
  • 淮阴网站建设目前最靠谱的推广平台
  • 创新的天津网站建设外包推广公司
  • 最好的网站推广软件北京做网站推广
  • wordpress 审查元素background 修改seo查询平台
  • 个人网站建设yxhuyingsemifinal
  • 注册安全工程师准考证打印入口站长工具seo综合查询可以访问