• 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

  • 相关阅读:
    javascript实现非递归--归并排序
    javascript实现二分查找
    深入javascript作用域链到闭包
    c++学习笔记2--constexpr,类型别名,auto
    用 Numba 加速 Python 代码
    Django1和2的区别
    Git的使用
    文件锁fcntl
    Https原理
    Flask-Login
  • 原文地址:https://www.cnblogs.com/rgcLOVEyaya/p/RGC_LOVE_YAYA_692days.html
Copyright © 2020-2023  润新知