zoukankan      html  css  js  c++  java
  • 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.publish('fm87.7', 'send msg') #可以发布固定的频道
    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.subscribe('fm87.7') #可以订阅固定的频道
    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

  • 相关阅读:
    How to function call using 'this' inside forEach loop
    jquery.validate.unobtrusive not working with dynamic injected elements
    Difference between jQuery.extend and jQuery.fn.extend?
    Methods, Computed, and Watchers in Vue.js
    Caution using watchers for objects in Vue
    How to Watch Deep Data Structures in Vue (Arrays and Objects)
    Page: DOMContentLoaded, load, beforeunload, unload
    linux bridge
    linux bridge
    EVE-NG网卡桥接
  • 原文地址:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_692days.html
Copyright © 2011-2022 走看看