Redis Expires 简介和使用

作者:Rui 发布时间:June 24, 2016 分类:Redis,BIGDATA 浏览:3,979

Redis提供了为key设置生存时间的功能,当给指定的key的生存时间过期时,redis将会自动删除该Key. 在Redis术语中,也通常将设置过生存时间的Key称为易失的Key(volatile)

使用示例:
redis-expire.png

阅读剩余部分...

Github fork项目后同步源的更新

作者:Rui 发布时间:June 15, 2016 分类:JAVA 浏览:3,737

首先要先确定一下是否建立了主repo的远程源:

git remote -v

如果里面只能看到你自己的两个源(fetch 和 push),那就需要添加主repo的源:

git remote add upstream https://github.com/rapid-develop/octo.git
git remote -v

然后你就能看到upstream了。
如果想与主repo合并:

git fetch upstream
git merge upstream/master

Redis Keyspace Notifications

作者:Rui 发布时间:June 12, 2016 分类:JAVA,BIGDATA,Redis 浏览:1,360

Keyspace Notifiations 允许客户端通过Pub/Sub订阅所有影响Redis key的操作通知事件。
以下是可以接受的事件类型:

  1. 所有影响key的操作
  2. LPUSH操作
  3. Redis expire 操作

操作事件 依赖于Redis Pub/Sub 机制,所以客户端只需要订阅keySpace相关的channel即可实现订阅通知事件

因为Redis Pub/Sub 是一种并不可靠地消息机制,所以Keyspace Notification 也不是可靠地通知系统,如果你的系统需要很好的可靠性,那么Keyspace Notification可能并不是一种很好的选择。在将来,作者也表示希望实现可靠的Notification功能。

事件类型
Redis Keyspace Notification 会对每一个影响key的操作都会发出两种类型的事件,例如,删除一个key,会触发两个事件:

PUBLISH __keyspace@0__:mykey del
PUBLISH __keyevent@0__:del mykey

阅读剩余部分...

Redis Pub/Sub 使用

作者:Rui 发布时间:June 12, 2016 分类:JAVA,BIGDATA,Redis 浏览:968

Redis 提供消息发布订阅的功能,区别于我们经常使用消息服务,Redis是将消息发布到指定的channel,而无需关心有多少订阅者,订阅者只需要订阅关心的一个或者多个channel即可,只接受关心的数据,而不用关心消息的发布者。解耦消息发布者和订阅者,为应用带了更好的灵活性和可扩展性。

例如:如果我们想要订阅某一频道的消息,可以使用以下命令:

SUBSCRIBE channel1 channel2

其他redis客户端发布到channel1,channel2的消息,就会被redis推送所有的订阅的客户端

消息数据库和范围
Redis 消息与key space是没有关系的。redis消息订阅发布不会受Redis 数据库的影响。
例如:一个客户端将消息发布到redis的数据库10,在数据库1注册的订阅者也可以接收到数据库10的消息
如果你想要控制消息的范围,可以将channel的前缀定义为不同的字符,例如测试和生产环境分别用test 和production

阅读剩余部分...

Redis Pipelining 使用

作者:Rui 发布时间:June 7, 2016 分类:JAVA,BIGDATA,Redis 浏览:612

Redis Pipelining 可以让客户端将多个命令一起发送给服务端顺序执行,而不是像之前每个命令,都请求一次服务端。这样可以减少网络往返的时间(RTT),适于用对Redis server有大批量的操作场景。

Redis Server在接收到客户发送来的命令列表后,会按顺序执行这些命令,然后将每个命令的执行结果缓存到一个临时队列中,当所有的命令执行完成,就会将所有结果发送给客户端。所以在使用Pipelining时,会有额外的内存占用。所以如果你有大量的命令执行时,每次批处理的命令个数也不要非常大,可以分批次的发送命令,例如:先发送10K的命令,执行完成后,在发送另外10K的命令。

Redis Pipelining 一般用来处理到大批量数据导入和导出数据的操作,以下使用示例:

JedisShardInfo shardInfo = new JedisShardInfo("kevincache.redis.cache.chinacloudapi.cn", 6379);
Jedis jedis = new Jedis(shardInfo);

long begin = System.currentTimeMillis();
for(int i = 0; i < 50000; i++) {
    jedis.set(UUID.randomUUID().toString(), UUID.randomUUID().toString());
}
long end = System.currentTimeMillis();
System.out.println("5W sets without pipelining,using time " + (end-begin)/1000 + " sec");

Pipeline pipeline = jedis.pipelined();
begin = System.currentTimeMillis();
for(int i = 0; i < 50000; i++) {
    pipeline.set(UUID.randomUUID().toString(), UUID.randomUUID().toString());
}
pipeline.sync();
end = System.currentTimeMillis();
System.out.println("5W sets with pipelining,using time " + (end-begin)/1000 + " sec");

jedis.close();

本示例使用Azure Redis测试Pipeline效率,5W次set操作
不使用Pipeline,总共花费大概230 sec,平均每次请求花费4.6ms
使用Pipeline,单次请求5W次set操作,花费 10 sec

Redis Pipelining VS Scripting
redis在2.6版本后添加了Scripting功能,可以在redis server添加脚本,类似数据库的存储过程,大部分Pipeline的使用场景,都可以使用Scripting替换,而且这样就能最大化减少redis的延迟,使查询,写入,计算更加高效。