redis中key过期事件

刚到新公司一个月左右,有个新需求,想做定时任务,比如在用户注册时间的3天后推送用户一条消息。

从刚开始脑子里面闪现的数据库轮询,立马否定掉(浪费资源),再到linux系统的定时任务,但是当用户量过大时,肯定不行。

最后想着redis如果key过期了,能不能监听触发一个事件,这样便可以不用时刻的查询是否到了发送消息的时间,从而节省资源。

最终找到了 redis的key过期事件。通过监听redis的过期时间,在过期时触发一个事件,从而通过这个事件做其他事情。

操作步骤(liunx系统):

1.找到redis.conf配置文件,可以通过命令  find / | grep redis.conf

2.修改配置文件,找到 notify-keyspace-events,默认是被注释的,改为   notify-keyspace-events Ex

# K    键空间通知,以__keyspace@<db>__为前缀
# E    键事件通知,以__keysevent@<db>__为前缀
# g    del , expipre , rename 等类型无关的通用命令的通知, ...
# $    String命令
# l    List命令
# s    Set命令
# h    Hash命令
# z    有序集合命令
# x    过期事件(每次key过期时生成)
# e    驱逐事件(当key在内存满了被清除时生成)
# A    g$lshzxe的别名,因此”AKE”意味着所有的事件

3.重启redis; 输入命令:service redis-server restart 

4.编写python代码:

redis_fabu.py

import redis
import time
r = redis.Redis(host='127.0.0.1', port=6379, db=0)
r.setex(name='test-name',value='val',time=1)

redis_dingyue.py

import redis

r = redis.Redis(host='127.0.0.1', port=6379, db=0)
sub_expire = r.pubsub()
# 事件通过 Redis 的订阅与发布功能(pub/sub)来进行分发,故需要订阅 __keyevent@0__:expired,其中0表示dbindex
sub_expire.subscribe('__keyevent@0__:expired')

while True:
    ex_pire=sub_expire.parse_response()
    print(ex_pire[0],ex_pire[1],ex_pire[2])

输出结果为:

b'subscribe' b'__keyevent@0__:expired' 1
b'message' b'__keyevent@0__:expired' b'test-name'

Notice:

1.redis的key过期事件在获返回结果时是 key的值,所以在做相关任务时,可以把key名写成需要执行的函数名等等。

2.redis的key过期事件是通过发布订阅机制,如果在key过期发布触发事件时,没有订阅服务的话,此过期事件会被舍弃掉,也就是发布过期事件,但是无法判断是否被订阅到,并且不会保存此次过期事件。所以要时刻确保 订阅机制完好。

3.  sub_expire.subscribe('__keyevent@0__:expired') 中 __keyevent@0__:expired 的 0 表示数据库index,表示只触发本数据库的过期事件。

4.由于redis放在内存中,所以做好备份到硬盘的工作,尽量减少数据损失。

相关连接:

https://www.jianshu.com/p/eb27967739cd

https://www.jianshu.com/p/eb27967739cd

http://www.cnblogs.com/wujf/p/8080109.html

https://www.cnblogs.com/chen-lhx/p/6626371.html

https://blog.csdn.net/qq744746842/article/details/70195945

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏峰会SaaS大佬云集

解析JS绑定事件重复触发问题 第一步

当前端开发过程中,经常用到事件,随着业务代码这一块的复杂化,在事件和多次注册和调用时,如果处理不好就会出现同一事件触发多次的问题。今天我们就聊一聊这个问题

1283
来自专栏张伟博客

ubuntu安装软件和查看已安装软件

1.9K4
来自专栏武军超python专栏

2018年7月31日学习ubuntu的基础操作命令和打包压缩解压缩

今天遇到的新单词: faith n 信用,信任 usage n 用法 upload n上传

1524
来自专栏linux驱动个人学习

Linux内核线程kernel thread详解--Linux进程的管理与调度(十)

Linux内核可以看作一个服务进程(管理软硬件资源,响应用户进程的种种合理以及不合理的请求)。

3205
来自专栏电光石火

使用Maven创建web项目

使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 ? 我们勾选上Create a simple ...

25510
来自专栏xingoo, 一个梦想做发明家的程序员

Oozie分布式工作流——Action节点

前篇讲述了下什么是流控制节点,本篇继续来说一下什么是 Action Nodes操作节点。Action节点有一些比较通用的特性: Action节点是远程的 ...

2196
来自专栏黑白安全

缓冲区溢出说明:基础知识

软件中最常见和最古老的安全漏洞之一是缓冲区溢出漏洞。从操作系统到客户端/服务器应用程序和桌面软件的各种软件都会出现缓冲区溢出漏洞。这通常是由于编程错误以及应用程...

1211
来自专栏抠抠空间

python并发编程之多进程(理论)

一、什么是进程 进程:正在进行的一个过程或者说一个任务。而负责执行任务则是cpu。 二、进程与程序的区别 程序:仅仅是一堆代 进程:是指打开程序运行的过程 三、...

4007
来自专栏小樱的经验随笔

LINUX中常用操作命令

LINUX中常用操作命令 Linux简介及Ubuntu安装 常见指令 系统管理命令 打包压缩相关命令 关机/重启机器 Linux...

4116
来自专栏腾讯云TStack专栏

一个集技术与才华于一身的95后小鲜肉,为你分享rabbitmq集群操作手法

关于作者 ? ? 在rabbitmq集群操作或者搭建的时候,常常会因为对于集群的不熟练而导致各种异常错误,常见的有绑定了浮动ip没有绑定实体ip导致,页面...

1091

扫码关注云+社区

领取腾讯云代金券