zoukankan      html  css  js  c++  java
  • keyspace notification(键空间通知)-待验证

    一、需求分析:

    1. 设置了生存时间的Key,在过期时能不能有所提示?
    2. 如果能对过期Key有个监听,如何对过期Key进行一个回调处理?
    3. 如何使用 Redis 来实现定时任务?

    二、序言:

           本文所说的定时任务或者说计划任务并不是很多人想象中的那样,比如说每天凌晨三点自动运行起来跑一个脚本。这种都已经烂大街了,随便一个 Crontab 就能搞定了。

           这里所说的定时任务可以说是计时器任务,比如说用户触发了某个动作,那么从这个点开始过二十四小时我们要对这个动作做点什么。那么如果有 1000 个用户触发了这个动作,就会有 1000 个定时任务。于是这就不是 Cron 范畴里面的内容了。

           举个最简单的例子,一个用户推荐了另一个用户,我们定一个二十四小时之后的任务,看看被推荐的用户有没有来注册,如果没注册就给他搞一条短信过去。

    三、Redis介绍

           在 Redis 的 2.8.0 版本之后,其推出了一个新的特性——键空间消息(Redis Keyspace Notifications),它配合 2.0.0 版本之后的 SUBSCRIBE 就能完成这个定时任务

    的操作了,不过定时的单位是秒。

    (1)Publish / Subscribe 

         Redis 在 2.0.0 之后推出了 Pub / Sub 的指令,大致就是说一边给 Redis 的特定频道发送消息,另一边从 Redis 的特定频道取值——形成了一个简易的消息队列。

    (2)Redis Keyspace Notifications

          在 Redis 里面有一些事件,比如键到期、键被删除等。然后我们可以通过配置一些东西来让 Redis 一旦触发这些事件的时候就往特定的 Channel 推一条消息。

         大致的流程就是我们给 Redis 的某一个 db 设置过期事件,使其键一旦过期就会往特定频道推消息,我在自己的客户端这边就一直消费这个频道就好了。

         以后一来一条定时任务,我们就把这个任务状态压缩成一个键,并且过期时间为距这个任务执行的时间差。那么当键一旦到期,就到了任务该执行的时间,Redis 自然会把过期消息推去,我们的客户端就能接收到了。这样一来就起到了定时任务的作用。

     四、Key过期事件的Redis配置

          这里需要配置 notify-keyspace-events 的参数为 “Ex”。x 代表了过期事件。notify-keyspace-events "Ex" 保存配置后,重启Redis服务,使配置生效。
    重启Reids服务器:

    root@iZ23s8agtagZ:/etc/redis# service redis-server restart redis.conf
    Stopping redis-server: redis-server.
    Starting redis-server: redis-server.

    添加过期事件订阅 开启一个终端,redis-cli 进入 redis 。开始订阅所有操作,等待接收消息。

    tinywan@iZ23a7607jaZ:~$ redis-cli -h 127.0.01.4 -p 63789
    127.0.0.1:63789> psubscribe __keyevent@0__:expired
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "__keyevent@0__:expired"
    3) (integer) 1

    再开启一个终端,redis-cli 进入 redis,新增一个 123秒过期的键:

    1270.01.1.1:63789> SETEX coolName 123 20
    OK
    121.41.188.109:63789> get coolName
    "20"
    121.41.188.109:63789> ttl coolName
    (integer) 104

    另外一边执行了阻塞订阅操作后的终端,123秒过期后有如下信息输出:

    复制代码
    121.141.188.209:63789> psubscribe __keyevent@0__:expired
    Reading messages... (press Ctrl-C to quit)
    1) "psubscribe"
    2) "__keyevent@0__:expired"
    3) (integer) 1
    1) "pmessage"
    2) "__keyevent@0__:expired"
    3) "__keyevent@0__:expired"
    4) "coolName"
    复制代码

    说明:说明对过期Key信息的订阅是成功的。

  • 相关阅读:
    php的函数
    php字符串
    PDA触屏的终极解决办法
    数字万用表 选购指南
    WindowsXp Sp2 英文版
    访问局域网某台电脑时提示:无法访问,你可能没有权限使用网络资源.的解决办法
    中华人民共和国国家标准职工工伤与职业病致残程度鉴定
    删除所有设备驱动的批处理
    如何制作Win XP操作系统映像文件
    使用批处理和devcon.exe来控制 Windows 的设备
  • 原文地址:https://www.cnblogs.com/xingzc/p/7678540.html
Copyright © 2011-2022 走看看