redis实现定长队列

Redis入门到精通(十),Lettuce操作Redis Redis入门到精通 专栏会分几期介绍Redis的概念操作,以及生产过程中频繁出现的一些问题及解决方案,在几期内逐渐深入带你全面了解Reids 本文为该专栏第十期,主要介绍Redis的几种主流框架之Lettuce......... 阅读详情

方案一:lua脚本

  考虑到多条命令的原子性,可以用lua脚本进行操作.通过lpush添加到队列头部,再对list进行ltrim操作,只保留前10个元素,其他内容丢弃.这样就实现了一个定长为10的队列.

@Component
public class MyTest {

	public static final String APP_INFO_KEY = "bszn:app";

	@Resource
	private RedisTemplate<String, String> redisTemplate;

	/**
	 * redis lua脚本:维护一个定长队列(长度10),每次新数据加到队列头部,超过长度部分丢弃
	 */
	private static final String FIXED_LENGTH_QUEUE_LUA_SCRIPT =
			"local key = KEYS[1] " +
					"redis.call('lpush',key,unpack(ARGV))" +
					"redis.call('ltrim',key,0,9)";

	/**
	 * 推送数据到redis
	 * @param deviceList 设备信息
	 */
	public void pushDeviceRegInfo(List<Device> deviceList) {
		// lua脚本
		DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
		redisScript.setScriptText(FIXED_LENGTH_QUEUE_LUA_SCRIPT);
		String[] regInfoJsons = deviceList.stream().map(JSON::toJSONString).toArray(String[]::new);
		// 执行lua脚本
		redisTemplate.execute(redisScript, Collections.singletonList(APP_INFO_KEY), regInfoJsons);
	}

	/**
	 * 从redis中取出设备信息
	 */
	public List<Device> getDeviceInfoList() {
		return Optional.ofNullable(redisTemplate.opsForList().range(APP_INFO_KEY, 0, -1))
				.orElseGet(ArrayList::new)
				.stream()
				// str转实体
				.map(s -> JSON.parseObject(s, Device.class))
				// 时间倒叙排序列表
				.sorted(Comparator.comparing(Device::getCreateTime).reversed())
				// 只取10条
				.limit(10)
				.collect(Collectors.toList());
	}
}

方案二:multi+exec

   redis通过MULTI、EXEC、WATCH等命令来实现​事务(transaction)功能。redis的事务提供了一种将多个命令请求打包、一次性、按顺序地执行多个命令的机制。在事务执行期间,服务器不会中断事务而去执行其他客户端的命令请求,它会将事务中的所有命令都执行完毕,然后才去处理其他客户端的命令请求。redis事务不支持回滚机制,如果事务中的某条命令在执行期间出现了错误,事务后续其他命令都不会执行,已经执行的命令都不会收到任何影响,不进行回滚。

@Component
public class MyTest {

	public static final String APP_INFO_KEY = "bszn:app";

	@Resource
	private RedisTemplate<String, String> redisTemplate;
	
	/**
	 * 推送数据到redis
	 * @param deviceList 设备信息list
	 */
	public void pushDeviceInfo(List<Device> deviceList) {
		SessionCallback sessionCallback = new SessionCallback() {
			@Override
			public Object execute(RedisOperations redisOperations) throws DataAccessException {
				redisOperations.multi();
				String[] deviceInfoJsons = deviceList.stream().map(JSON::toJSONString).toArray(String[]::new);
				ListOperations listOperations = redisOperations.opsForList();
				listOperations.leftPushAll(APP_INFO_KEY, deviceInfoJsons);
				listOperations.trim(APP_INFO_KEY, 0, 9);
				return redisOperations.exec();
			}
		};
		redisTemplate.execute(sessionCallback);
	}
}

PHP+Redis 定长队列(redis.call) 阅读详情

相关推荐

redis实现简单队列

主要为大家详细介绍了redis实现简单队列的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

Redis 定长队列的探索和实践

通过组合使用Redis的List等数据结构,结合Lua脚本,完成类消息队列功能,解决分组批量读取等功能。

vivo互联网技术 395

手把手教你用Siemens EDA破解工具搞定PADs VX2.7安装与卡死问题

本文详细介绍了如何使用Siemens EDA工具解决PADs VX2.7的安装与卡死问题。从License配置到性能调优,提供全面的解决方案,帮助工程师高效完成电子设计自动化任务。特别针对常见的卡顿现象,给出了输入法兼容性调整、图形性能优化等实用技巧。

k8l9m0n的博客 556

redis list 设置队列大小

Redis列表类型的最大长度(maxlen)功能直到版本6.2才被引入,它可以用于为列表设置最大长度,实现有限大小的队列。

西京刀客 5477

Win11家庭版彻底关闭Hyper-V的3种方法(实测有效)

本文详细介绍了Win11家庭版彻底关闭Hyper-V的3种实测有效方法,解决与VMware的兼容性问题。包括命令行禁用虚拟化功能、微软官方工具DG_Readiness深度清理以及组策略与功能组件联用方案,帮助用户高效禁用Hyper-V并优化系统性能。

weixin_33728268的博客 2691

Qt Coordinate System

Qt 坐标系统Qt 坐标系统 数学基础 Qt坐标系统 视口 平移变换 缩放变换 setWindow 旋转 总结数学基础 矩阵与线性变换坐标系变换Qt坐标系统 视口和OpenGL一样,视口确定了画面在窗口(QWidget)中显示的区域,Qt的绘图坐标会完全映射到视口(View port)上,就像图示一样。默认情况下,窗口和视口是重合的,视口的大小覆盖了整个窗口。和OpenGL一样,Qt的QPa

unclerunning的博客 1151

redis-list列表

redis list列表

u010519674的专栏 316

从零开始学习信号完整性(SIPI)--1 简介

信号完整性就是研究如何让驱动芯片发出的信号经过传输通道被接收芯片正确接收的学问。 信号完整性包含了三个要素: 信号:是被传输的主体,我们首先要了解、熟悉信号的特性。 芯片:分为驱动芯片和接收芯片,信号完整性工程师就是要实现信号在驱动芯片和接收芯片之间的正确传输。 传输通道:是传输信号的介质,是信号所走的“路”。如何实现信号的正确传输呢?那就要信号完整性工程师为信号“修路”、“搭桥”。

qq_29476769的博客 4万+

Redis 定长队列,实现消息分组、按批次消费

Redis 定长队列,实现消息分组、按批次消费

技术改变世界 1513

实验五 循环结构第1关:斐波那契数列第2关:统计一段英文语句中的单词数和句子数第3关:密码判断第4关:通过数列求自然常数e第5关:双倍余额递减法计算固定资产折旧第6关:销售统计第7关:投资年限计算

第1关:斐波那契数列第2关:统计一段英文语句中的单词数和句子数第3关:密码判断 第4关:通过数列求自然常数e 第5关:双倍余额递减法计算固定资产折旧

pro_daily的博客 8171

告别AT串口线!用STM32F407的USB FS口直连EC800M进行物联网通信

本文介绍了一种创新的物联网通信方案,利用STM32F407的USB FS接口直连EC800M模块,替代传统的AT串口线连接。通过详细的硬件对比、STM32CubeMX配置和USB驱动调试步骤,展示了如何实现更高效的AT指令通信,同时降低硬件复杂度和功耗。

weixin_29189987的博客 707

《Redis应用实例》Java实现(27):定长队列和淘汰队列

不同之处是定长队列超过定长后后面的元素不添加了,而淘汰队列超过定长后面添加的元素添加后最前面的元素会删掉。定长队列和淘汰队列都是固定长度的队列。

foxbillcsdn的专栏 202

手把手教你学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真

本文详细介绍了四开关Buck-Boost(FSBB)变换器的Simulink仿真方法,重点解决模式切换时的直通风险和输出电压波动问题。通过统一电压PI控制、迟滞比较模式仲裁(Buck/Boost/Pass-Through)和200ns死区设计,实现了Vin从26V到22V变化时Vout稳定在12V±0.15V。关键步骤包括:搭建功率级电路、Stateflow模式判断、PI控制器输出占空比映射(Buck模式D≈Vo/Vin,Boost模式D≈1-Vo/Vin),以及带死区的PWM信号分配。仿真验证了切换过程中

MHD0815的博客 118

利用redis实现定长的线程队列

纯手打,转载务请附上本文网址!!!Redis -- 首先就不做简介啦,直接上代码和功能实习需要做到一个功能:利用Redis控制线程个数,包括人工起的线程和自动运行的线程;公司代码不能上,就上自己写的一个小例子吧,附上github地址:https://github.com/xianzhixianzhixian/RedisDemo.git首先我们有一个长度不定的队列takslist用于接收所有的任务,...

樊先知樊先知的博客 5125

高数15种常见特殊曲线:星形线、心形线、摆线、对数螺线、双曲螺线、阿基米德螺线、伯努利双纽线、三叶玫瑰线、四叶玫瑰线、六叶玫瑰线、三次抛物线、半立方抛物线、箕舌线、蔓叶线、笛卡儿叶形线、概率曲线

4.1 对数螺线(等角螺线、生长螺线)三叶玫瑰线、四叶玫瑰线、六叶玫瑰线。​7.2 半立方抛物线(尼尔曲线)10.笛卡儿叶形线(茉莉花瓣曲线)常考选择题、填空题,大题也涉及。​4.2 双曲螺线(倒数螺线)11.阿基米德螺线(等速螺线)3.摆线(圆滚线、旋轮线)5.双纽线(伯努利双纽线)1.星形线(四尖瓣线)2.心形线(心脏线)..................

刘鑫磊 1万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Redis 定长队列(支持redis集群)

前言 某些业务场景,需要实现原子性的,性能可靠的分布式定长队列,它必须具备以下功能: 队列具备失效期。 队列最大长度为n,并且当元素满了时,拒绝添加新数据。 队列最大长度为n,当元素满时,弹出最早的数据,接受新的数据。 分布式api可以低成本接入和使用。 实现 考虑使用redis来实现 源码 package redistool import ( "github.com/fwhezfwhez/errorx" "github.com/garyburd/redigo/redis" ) // 定长lis

fwhezfwhez的博客 4302

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

队列、堆栈和优先队列介绍及Redis实现

Redis丰富的数据类型,如list和zset,可以用来实现队列。已实现了以下几种队列。 普通队列 队列:FIFO 双向队列:两个方向均可以PUSH、POP 堆栈:LIFO 优先队列:POP按优先级从高到低先后弹出元素 其中,队列、双向队列和堆栈用list存储,优先队列用zset存储。 增强特性 支持容量固定,向一个满的队列PUSH会失败,向一个容量不足的队列PUSH也会失败 支持可溢出(堆...

Mengxiang's Blog 4383

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

redis队列优先级java实现_队列、堆栈和优先队列介绍及Redis实现

前言队列、堆栈和优先队列是编程中常见的数据结构。本文首先简单介绍一下这几种数据结构,然后介绍如何用Redis实现这些数据结构。数据结构简介队列普通队列有以下几个特性先进先出(FIFO)支持PUSH/POP,PUSH从尾端增加元素,POP从前端弹出元素容量不受限制从普通队列可以衍生出定长队列,它比普通队列多出以下特性有固定的容量(最大长度)向满载的队列PUSH会失败从定长队列可以衍生出可溢出的定长队...

weixin_42503069的博客 1166

java固定大小队列的几种实现方式

最近团队有同学在开发中,遇到一个需求,统计最近10次的异常次数,咨询有没有类似的list。针对这个问题,记录一下几种处理方式。以上三种方式均可实现固定长度的list。FixedLinkedHashMap和EvictingQueue是基于内存的,所以仅支持节点情况。而基于Redis的list除了单节点情况,同样可以在分布式情况使用。

MayMatrix 的博客 3072

redis列表键(数据结构篇)

列表(list) 以有序的方式储存多个可重复的值。 一个列表可以包含一个或以上数量的 项(item),每个项按照它们被推入到列表的位置来排列。每个列表项所处的位置决定了这个项的索引值(index),索引以 0 为开始,从列表的左端到右端依次 递增,位于列表最左端(表 头)的项的索引为 0 ,而位于列表最右端(表尾)的 项的索引为 N-1 ,其中 N 为列表的长度。 列表包含的项可以出现重复,它们不...

昔拉的博客 2776

09. Redis 五种数据类型-列表List

Redis 里面的List 既是一个列表也是一个双向链表, 除了可以通过序号进行元素操作之外, 还可以对其进行push/pop操作, 以实现栈和队列的功能.list 中的元素是可以重复的.redis 的列表是非常强大的,可以实现列表,栈,固定长度列表,环形列表等结构. 1. 常用命令 以下API 只适用于结构为List的key, 否则会报错. 1.1 非阻塞式命令 Redis 的list 不...

Java 程序源 1万+

Redis精进:List的使用和应用场景

点击上方蓝色字体,选择“置顶公众号”技术文章第一时间送达!作者:锐玩道juejin.im/post/5df77d8bf265da33f718b654最近在精进学习Redis,边学边写一、...

JAVA葵花宝典 280

Redis系列学习笔记4 列表

列表以有序的方式储存多个可重复的值LPUSH key value [value …]将一个或以上数量的值依次推入到列表的左端,命令返回新值被推入之后,列表目前包含的项数量。RPUSH key value [value …]将一个或以上数量的值依次推入到列表的右端,命令返回新值被推入之后,列表目前包含的项数量。LPOP key移除并返回列表最左端的项RPOP移除并返回列表最右端的项LLEN key返回

ECHO_FOLLOW_HEART的专栏 538
上一篇: 跨域问题解决方法
下一篇: python字符串切片
hit、run
博客等级 码龄10年 163粉丝 157原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值