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

四川省建设厅招投标网站百度网盘搜索引擎入口在哪里

四川省建设厅招投标网站,百度网盘搜索引擎入口在哪里,网站分站如何做,网站做多久基于Redis实现的延时队列 针对于Redis实现延时队列有两种实现方式: 使用zset实现实现的延时队列 借助redis zset来实现延时队列,具体的实现代码很简单,就是从zset中取出score小于当前时间戳的数据 import cn.hutool.json.JSONUtil; impor…

基于Redis实现的延时队列

针对于Redis实现延时队列有两种实现方式:

使用zset实现实现的延时队列

借助redis zset来实现延时队列,具体的实现代码很简单,就是从zset中取出score小于当前时间戳的数据

import cn.hutool.json.JSONUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.util.CollectionUtils;import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;@Component
public class RedisDelayDemo {@Autowiredprivate RedisTemplate redisTemplate;private static final Long DELETE_SUCCESS = 1L;//线程安全setprivate Set<String> topic = new CopyOnWriteArraySet<>();//放入数据public  void push(String key, Object val, long delayTime) {topic.add(key);//hutool的json转换工具会有些问题,性能相对来说比较原生的jackson也会差一些  我这边是为了图方便String strVal = val instanceof String ? (String) val : JSONUtil.toJsonStr(val);redisTemplate.opsForZSet().add(key, strVal, System.currentTimeMillis() + delayTime);}//获取数据public String get(String key) {Set<String> sets = redisTemplate.opsForZSet().rangeByScore(key, 0, System.currentTimeMillis(), 0, 3);if (CollectionUtils.isEmpty(sets)) {return null;}for (String val : sets) {if (DELETE_SUCCESS.equals(redisTemplate.opsForZSet().remove(key, val))) {// 删除成功,表示抢占到return val;}}return null;}}

为什么会这么设计?

  • 为啥将数据返回包在删除中?

    • 如果我们按照正常的实现流程,每次从zset中取一个,在单实例(单机)的情况下这个操作的话是没有问题的,但是你无法保证该情况下就只有一个人拿到了这个数据,在多实例(多机)的场景下,可能存在多个实例同时拿到了它,那我们要如何表示只有一个实例拥有了她呢?此时我们就要借助redis的单线程机制,只可能会有一个实例会删除成功,所以拿到并删除成功的那个实例就是幸运儿
  • 为啥一次取3个数据

    • 如果一次只拿一个,那么每次抢占到数据的几率并不太大,特别是当实例比较多时,可能会做多次的无效操作,为了减少这个可能性,所以可以一次多拿几个做备选,具体拿几个这个看你定时任务的时间间隔和具体的业务场景

Demo

 final String key = "myzset";
for (int i = 0; i < 10; i++) {redisDelayDemo.push(key, "xiaozhang"+  i, 9000);
}
while (true) {String value = redisDelayDemo.get(key);if (StringUtils.isBlank(value)) {continue;}System.out.println(value);
}

基于Redis过期监听实现延时队列

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.listener.KeyExpirationEventMessageListener;
import org.springframework.data.redis.listener.RedisMessageListenerContainer;public class RedisExpiredListenter extends KeyExpirationEventMessageListener {private static final Logger LOGGER = LoggerFactory.getLogger(RedisExpiredListenter.class);public RedisExpiredListenter(RedisMessageListenerContainer listenerContainer) {super(listenerContainer);}@Overridepublic void onMessage(Message message, byte[] pattern) {String channel = new String(message.getChannel(), StandardCharsets.UTF_8);//过期的keyString key = new String(message.getBody(),StandardCharsets.UTF_8);LOGGER.info("redis key 过期:pattern={},channel={},key={}",new String(pattern),channel,key);/***你可以将你的内容一起拼接到key中或者可以在redis中存储两个key (例如mykey和mykey_backup)*针对mykey设置过期时间,对于mykey_backup不设置过期时间,这样就可以通过mykey_backup获取到value了**/}}
}

使用Redis过期监听实现延时队列方法较为便捷,但是该方法也存在一个很大的问题
因为当过期的key数量高于一个阈值的时候, Redis 不能确保 key 在指定时间被删除 , 也就造成了消息可能比你设置的延时时间更长
所以如果你的系统针对于延时队列这个时间要求十分严格,并且在同一时间内会有多个消息需要发生那我就不推荐使用Redis的延时队列,如果你的系统对于该业务并没有如此严格的要求,并且数量不多的情况下是可以使用的。

使用Redis 实现延时队列还有一个比较大的问题,他并不像消息队列一样保证送达。当订阅事件的客户端会丢失所有在断线期间所有分发给它的事件。 这个问题也是开发者需要考虑的,根据自己的业务场景去判断。

http://www.hengruixuexiao.com/news/40578.html

相关文章:

  • 做网站啦代理的方法网络广告的计费方式
  • 网站规划的任务怎么创建网站快捷方式到桌面
  • 做app还是做网站seo黑帽教学网
  • 程序员自己做网站怎么能来钱广州头条新闻最新
  • 学java做安卓还是做网站好海底捞口碑营销案例
  • 网站的描述 都应该写 什么 优化企业推广网站
  • 在360网站做公告怎么弄营销心得体会感悟300字
  • 凡科网之前做的网站在哪看百度统计app下载
  • 自己网站内容怎么才能被百度抓取今日头条新闻最新疫情
  • wordpress smzdm主题百度推广seo效果怎么样
  • 网站建设分金手指专业二七百度智能云官网
  • 电商网站怎么做聚合百度搜索收录入口
  • 网站开发藏汉双语现在外贸推广做哪个平台
  • 中国建设银行网站官网下载安装创新驱动发展战略
  • wordpress语音朗读沈阳优化推广哪家好
  • 南阳锐诚网站建设三生网络营销靠谱吗
  • 国家骨干院校建设网站企业网站推广方法
  • 云南网站制作怎么计费宣传网站有哪些
  • 宝坻做网站站长之家网站介绍
  • 电商 网站 降低 跳出率 措施 效果网络软文发布
  • 装饰网站建设运营常州seo建站
  • 前端做用vue做后台多还是做网站多最佳磁力吧cili8
  • wordpress wp_register()sem优化是什么
  • 学建设网站及功能免费打广告网站
  • 济南网站建设新风向有什么平台可以推广
  • 网站建设费用申请网络营销课程去哪里学
  • 现在一般做网站都是去哪家做的推广网站的文案
  • 注册公司在哪个网站注册无锡百度推广开户
  • 个人做淘宝客网站有哪些搜索引擎yandex入口
  • 外贸跟单的流程搜索引擎优化策略