博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
lua + redis 的去重队列
阅读量:7223 次
发布时间:2019-06-29

本文共 1434 字,大约阅读时间需要 4 分钟。

hot3.png

    背景是任务派发系统,我们我们的任务落地在mysql, 然后有通过redis 的list 做队列,因为任务是幂等的,所以,超时任务和失败重试任务会重新入队。这里出现了一个情况,就是我们的任务,比如,视频转码,是极其耗时的,任务出现重复入队的情况,这不是我们所期望的,所以我们需要对任务进行去重。

该文章后续仍在不断的更新修改中, 请移步到原文地址

    因为redis 对lua 脚本是执行的,所以我们的思路是 list + set ,来保证队列去重。lua 脚本如下:

SCRIPT_PUSH = `local q = KEYS[1]local q_set = KEYS[1] .. "_set"local v = redis.call("SADD", q_set, ARGV[1])if v == 1then	return redis.call("RPUSH", q, ARGV[1]) and 1else	return 0end`	SCRIPT_POP = `local q = KEYS[1]local q_set = KEYS[1] .. "_set"local v = redis.call("LPOP", q)if v ~= ""then	redis.call("SREM", q_set, v)endreturn v`

    在push 任务之前,先看任务是否在set 中,在pop之后,立刻从set中删除,因为lua 脚本的原子性,所以,能起到去重的作用。

    在python 中调用的方式如下:    

import redis SCRIPT_PUSH = '''local q = KEYS[1]local q_set = KEYS[1] .. "_set"local v = redis.call("SADD", q_set, ARGV[1])if v == 1then	return redis.call("RPUSH", q, ARGV[1]) and 1else	return 0end'''	SCRIPT_POP = '''local q = KEYS[1]local q_set = KEYS[1] .. "_set"local v = redis.call("LPOP", q)if v ~= ""then	redis.call("SREM", q_set, v)endreturn v'''pool = redis.ConnectionPool(host='localhost', port=6379, db=0)r = redis.Redis(connection_pool=pool) script1 = r.register_script(SCRIPT_PUSH) script2 = r.register_script(SCRIPT_POP) print r.get("mykey")print script1( keys=["mykey"], args = [1,0] )print r.get("mykey"), "ok"print r.get("mykey")print script2( keys=["mykey"], args = [1] )print r.get("mykey")

    golang 等其他语言,使用方式一样,没什么好说的。

转载于:https://my.oschina.net/u/2950272/blog/1637779

你可能感兴趣的文章
第十篇、自定义UIBarButtonItem和UIButton block回调
查看>>
复分析学习1
查看>>
Java虚拟机笔记(四):垃圾收集器
查看>>
计算机运行命令全集
查看>>
WebSocket 实战
查看>>
二次排序
查看>>
CSS:如何清除a标签之间的默认留白间距
查看>>
selenium随笔
查看>>
leetcode599
查看>>
String类中“==”和“equals()”的区别
查看>>
leetcode--883
查看>>
the application could not be verified
查看>>
[转]Centos配置国内yum源
查看>>
redis数据类型和应用场景
查看>>
Spring IOC
查看>>
Fragment的onCreateView和onActivityCreate之间的区别(转)
查看>>
AC日记——统计难题 hdu 1251
查看>>
在仿真器中运行时跳过Windows Azure Startup任务
查看>>
android 获取路径目录方法以及判断目录是否存在,创建目录
查看>>
数列问题[HAOI2004模拟]
查看>>