Redis Keyspace Notifications

作者:Rui 发布时间:June 12, 2016 分类:JAVA,BIGDATA,Redis 浏览:3,801 No Comments

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,Redis,BIGDATA 浏览:1,193 No Comments

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,Redis,BIGDATA 浏览:795 No Comments

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的延迟,使查询,写入,计算更加高效。

Redis 基本数据类型及其使用

作者:Rui 发布时间:June 7, 2016 分类:BIGDATA,Redis 浏览:790 No Comments

Redis 提供丰富的数据类型,方便了开发者使用,它的数据类型包括strings,hashs,lists,sets,sort sets,以及bitmaps,hyperloglogs,Redis 3.2 之后,又添加了Geo Index的数据类型,专门存储地理坐标信息,并提供了相关的命令来检索地理坐标。

Redis Keys

Redis的key 是一个二进制安全的字符串,也就是你可以使用二进制串当做key,空字符串也可以当做key。
设置key值时,需要注意一下几点:

  1. Key不易过长,最好不要超过1024 bytes,因为当检索key是需要对key进行比对,如果key较大,比对就相对比较耗时,带来性能问题
  2. Key 也不易过短,简单易读最好,例如:user:1000:flowers
  3. Key 取值最好有一个模式,例如:object-type:id
  4. Redis 允许的最大key值为512MB

因为Redis是单线程模式,所有命令都是按队列顺序执行,所以每个命令的执行速度对Redis的性能影响也是比较明显的,所以建议大家在使用时,尽可能使用简洁明了的key

阅读剩余部分...

Redis protected-mode

作者:Rui 发布时间:June 6, 2016 分类:BIGDATA,Redis 浏览:10,642 1 Comment

Redis protected-mode 是3.2 之后加入的新特性,在Redis.conf的注释中,我们可以了解到,他的具体作用和启用条件

# Protected mode is a layer of security protection, in order to avoid that
# Redis instances left open on the internet are accessed and exploited.
#
# When protected mode is on and if:
#
# 1) The server is not binding explicitly to a set of addresses using the
#    "bind" directive.
# 2) No password is configured.
#
# The server only accepts connections from clients connecting from the
# IPv4 and IPv6 loopback addresses 127.0.0.1 and ::1, and from Unix domain
# sockets.
#
# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured, nor a specific set of interfaces
# are explicitly listed using the "bind" directive.
protected-mode yes

可以看到 Protected-mode 是为了禁止公网访问redis cache,加强redis安全的。

它启用的条件,有两个:
1) 没有bind IP
2) 没有设置访问密码

如果启用了,则只能够通过lookback ip(127.0.0.1)访问Redis cache,如果从外网访问,则会返回相应的错误信息:

(error) DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the lookback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the --portected-mode no option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside.