KeySpaceNotification 键空间通知

1、Redis键淘汰机制简介

在Redis中,内存的大小是有限的,所以为了防止内存饱和,需要实现某种键淘汰策略。主要有两种方法,一种是当Redis内存不足时所采用的内存释放策略。第二种是对过期键进行删除的策略,也可以在某种程度上释放内存。

1.1 Redis键过期淘汰的策略

当需要进行内存释放的时候,需要用某种策略对保存的的对象进行删除。Redis有六种策略:

volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

2、KeySpaceNotification功能

2.1 开启KeySpaceNotification功能

默认情况下,该功能是关闭的,因为该功能消耗部分CPU。开启该功能需要修改redis的配置文件。

当前需要修改的配置的机器有两台:Redis1、Redis2

配置文件的路径均为: /etc/redis

图1 Redis1中需要修改的配置文件

图2 Redis2中需要修改的配置文件

2.2 修改配置文件

1. 使用vi 6379.conf 进入文件;

图3 使用vi指令进入配置文件

2. 输入/keyspace,回车后定位到该功能开启部分;

图4 定位keyspace

图4 查看通知功能介绍

3. 修改配置文件为下图所示 KEA表示所有的操作都会向相应的频道中发布通知信息;

图5 修改后的配置文件

4. 按下Esc,输入:wq! 回车保存文件;

5. 按照上述过程将所有的配置文件。

6. 重启Redis1、Redis2,使键空间通知功能开启。

3、使用键空间通知功能

3.1 实现频道的订阅

public class jedisSubscribe {

public static void main(String[] args) {

  Set<HostAndPort> jedisClusterNodes=new HashSet<HostAndPort>();

  JedisCluster cluster;

  cluster = new JedisCluster(RedisPool.loadServers());

  String host1 = "192.168.1.34";

  JedisPubSub jedisPubSub = null;

  jedisPubSub = new JedisPubSub() {

  /*

  * 常规模式:关闭订阅时触发arg0 key值 arg1 订阅数量

  */

  public void onUnsubscribe(String arg0, int arg1) {

  }

  /*

  * 常规模式:启动订阅时触发arg0 key值 arg1 订阅数量

  */

  public void onSubscribe(String arg0, int arg1) {

    System.out.println("Success onSubscribe "+arg0);

  }

  /*

  * 常规模式:收到匹配key值的消息时触发arg0 key值arg1 收到的消息值

  */

  public void onMessage(String arg0, String arg1) {

    System.out.println("Get Message "+arg1);

    System.out.println("Get "+arg0);

    String key = cluster.get(arg0);

    System.out.println("Success "+key);

  }

  /*

  * 正则模式:关闭正则类型订阅时触发

  * arg0 key的正则表达式arg1 订阅数量

  */

  public void onPUnsubscribe(String arg0, int arg1) {
  
  }   /*   * 正则模式:启动正则类型订阅时触发   * arg0 key的正则表达式   * arg1 订阅数量   */   public void onPSubscribe(String arg0, int arg1) {
  
  }   /*   * 正则模式:收到匹配key值的消息时触发   * arg0订阅的key正则表达式   * arg1匹配上该正则key值   * arg2收到的消息值   */   public void onPMessage(String arg0, String arg1, String arg2) {
  
  } };   String channel4 = "__keyevent@0__:expire";//设置订阅的频道channels   JedisPool jedisPool1 = new JedisPool(host1);   jedisPool1.getResource().subscribe(jedisPubSub, channel4);   }

}

3.2 对Redis中的键进行操作

public static void main(String[] args) throws InterruptedException {

  Set<HostAndPort> jedisClusterNodes=new HashSet<HostAndPort>();

  JedisCluster cluster;

  cluster = new JedisCluster(RedisPool.loadServers());

  String key = "name";//设置一个key

  String value = "zpf";//设置该key的value

  cluster.set(key, value);//向redis中写入该(key,value)

  cluster.expire(key, 2);//设置key过期时间为2秒

  cluster.del(key);

}
3.3 运行结果

4.车辆信息的实时性维护

4.1利用键空间通知的方法

Redis会在设置过期时间的键集合中随机抽选进行键的判断,如果过期则进行删除操作,同时会向频道 __keyevent@0__:expire中过期消息,并且监听这个频道的程序会得到过期的键是哪一个键。也会向频道 __keyspace@0__:key中发布该键过期的消息,其中这里的频道根据过期的键key不同发布的频道也不同。进行删除操作时,Redis也会向频道__keyevent@0__:del和 __keyspace@0__:key中分别发布消息。

为了维护车辆信息的实时性,需要对过期的车辆数据进行相应的删除操作,但是Redis中的删除操作只能将对应的key删除掉,这里的需求是进行网格以及其他相应的维护操作,删除操作是不相同的。因此需要再删除之前得到过期的key的值value。

根据上面的描述,无法再订阅频道__keyevent@0__:expire接收到通知的时候得到过期键的值value。为了实现借助Redis的删除功能需要在该频道接收到信息之前得到要过期的key的值value。但是这样的话又成了对redis的判断操作。为了实现得到过期键的value,可以通过在得到该数据并进行设置过期时间的时候提前构造一个map<key,value>其中key为车牌,value为车牌+原始信息的value。这样在频道__keyevent@0__:expire接收到通知时,就可以使用map得到相应的value值。

4.2 使用该方法造成的问题

构造map时,需要对每一辆车进行判断,如果车牌key不在此map中时,需要将该信息放入map中;如果车牌key存在此map中,需要更新map。那么存储该map需要占用额外的存储空间。

5.参考资料

http://redis.io/topics/notifications

https://cnodejs.org/topic/5577b493c4e7fbea6e9a33c9#5577e266c4e7fbea6e9a3449

http://redisdoc.com/topic/notification.html#id1

http://blog.csdn.net/caishenfans/article/details/44902651

https://github.com/antirez/redis/issues/594

KeySpaceNotification 键空间通知的更多相关文章

  1. 利用Redis keyspace notification(键空间通知)实现过期提醒

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

  2. redis中键空间通知

    通过redis的键空间通知,当redis删除过期key的时候,及时更新mongodb数据库中user的状态 var Redis = require('ioredis'); var redis = ne ...

  3. redis过期回调以及键空间通知

    背景 最近需要涉及一个定时通知的业务,之前的办法是采用定时任务,每秒查询一次.后来了解到Redis的键空间通知机制,其中的过期通知,和业务非常贴合. 键空间通知 下面是Redis中文文档的介绍 键空间 ...

  4. python中的Redis键空间通知(过期回调)

    介绍 Redis是一个内存数据结构存储库,用于缓存,高速数据摄取,处理消息队列,分布式锁定等等. 使用Redis优于其他内存存储的优点是Redis提供持久性和数据结构,如列表,集合,有序集和散列. 在 ...

  5. Redis 键空间通知

    [Redis 键空间通知] 键空间通知使得客户端可以通过订阅频道或模式, 来接收那些以某种方式改动了 Redis 数据集的事件. 以下是一些键空间通知发送的事件的例子: 所有修改键的命令. 所有接收到 ...

  6. redis键空间通知(keyspace notification)

    一.需求 在redis中,设置好key和生存时间之后,希望key过期被删除时能够及时的发送一个通知告诉我key,以便我做后续的一些操作. 二.环境 系统:windows10 php:7.1 redis ...

  7. Redis源码解析:09redis数据库实现(键值对操作、键超时功能、键空间通知)

    本章对Redis服务器的数据库实现进行介绍,说明Redis数据库相关操作的实现,包括数据库中键值对的添加.删除.查看.更新等操作的实现:客户端切换数据库的实现:键超时相关功能的实现.键空间事件通知等. ...

  8. 10Redis键空间通知(keyspace notifications)

    Redis的键空间通知(keyspace notifications)功能是自2.8.0版本开始加入的,客户端可以通过订阅/发布(Pub/Sub)机制,接收那些以某种方式改变了Redis数据空间的事件 ...

  9. Redis键空间通知(keyspace notification),事件订阅

      Redis键空间通知(keyspace notification),事件订阅   应用场景:有效期优惠券.24小时内支付.下单有效事件等等. 功能概览 键空间通知使得客户端可以通过订阅频道或模式, ...

随机推荐

  1. RavenDB官网文档翻译系列第一

    本系列文章主要翻译自RavenDB官方文档,有些地方做了删减,有些内容整合在一起.欢迎有需要的朋友阅读.毕竟还是中文读起来更亲切吗.下面进入正题. 起航 获取RavenDB RavenDB可以通过Nu ...

  2. 【转】 C#中Finally的一个不太常见的用法

    原文地址:http://www.cnblogs.com/listhome/p/3664300.html 最近在看.net BCL 传送门 的源码. 在 System.Collections.Concu ...

  3. C#的泛型的类型参数可以有带参数的构造函数的约束方式吗?

    Review后看到标题让我十分羞愧自己语文功底太差,估计...请见谅......我还特地把这句写回开头了...... 问题 前天遇到的一个问题,所以在MSDN发了个问,刚也丰富了下问题,关于泛型的. ...

  4. ABP框架 - 日志

    文档目录 本节内容: 服务端 获取Logger(记录器) Logger的基类 配置 Abp.Castle.Log4Net 包 客户端 服务端 ABP使用Castle Windsor的日志记录工具,它可 ...

  5. JS设计模式(二)

    5.迭代器模式 先实现一个简单的迭代器,类似于JQ里的$.each方法. var each = function (arr, callback) { for (var i = 0, l = arr.l ...

  6. Android之自定义View的实现

    对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上 ...

  7. ASP.NET MVC5+EF6+EasyUI 后台管理系统(40)-精准在线人数统计实现-【过滤器+Cache】

    系列目录 上次的探讨没有任何结果,我浏览了大量的文章和个别系统的参考!决定用Cache来做,这可能有点难以接受但是配合mvc过滤器来做效果非常好! 由于之前的过滤器我们用过了OnActionExecu ...

  8. 搞定.NET MVC IOC控制反转,依赖注入

    一直听说IOC,但是一直没接触过,只看例子好像很高达上的样子,今天抽了点时间实现了下,当然也是借助博客园里面很多前辈的文章来搞的!现在做个笔记,防止自己以后忘记! 1.首先创建MVC项目 2.然后新建 ...

  9. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对“公平锁”的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括:基本概念ReentrantLock数据结构参考代码获取公平锁(基于JDK1.7.0_40)一. tryAcqu ...

  10. Scrapy:为spider指定pipeline

    当一个Scrapy项目中有多个spider去爬取多个网站时,往往需要多个pipeline,这时就需要为每个spider指定其对应的pipeline. [通过程序来运行spider],可以通过修改配置s ...