Redis发布订阅
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。 Redis客户端可以订阅任意数量的频道。 下图展示了频道channel1,以及订阅这个频道的三个客户端——client1,client2,client5之间的关系。 当有新消息通过PUBLISH命令发送给频道channel1时,这个消息就会被发送给订阅它的三个客户端:
相关操作命令如下:
命令 | 描述 |
---|---|
PSUBSCRIBE pattern [pattern …] | 订阅一个或多个符合给定模式的频道 |
PUSBSUB subcommand [argument [argument…]] | 查看订阅与发布系统状态 |
PUBLISH channel message | 将消息发送到指定的频道 |
PUNSUBSCRIBE [ pattern [pattern …]] | 退订所有给定模式的频道 |
SUBSCRIBE channel [channel …] | 订阅给定的一个或多个频道的信息 |
UNSUBSCRIBE [channel [channel …]] | 指退订给定的频道 |
举例如下:
创建的订阅频道名为redisChat
localhost:6379> SUBSCRIBE redisChat 1) "subscribe" 2) "redisChat 重新打开一个新的redis客户端,然后在同一个频道redisChat发布两次消息,订阅者就能接收到相关消息。 127.0.0.1:6379> PUBLISH redisChat "jack is handsome boy" 这时在订阅端中很快就可以看到该消息。
Redis事务
Redis事务可以一次执行多个命令,并且带有以下两个重要的保证:
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。 事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。 一个事务从开始到执行会经历三个阶段: 开始事务。 命令入队。 执行事务。
其相关操作命令如下:
命令 | 描述 |
---|---|
DISCARD | 取消事务,放弃执行事务块内的所有命令 |
EXEC | 执行所有事务块内的命令 |
MULTI | 标记一个事务块的开始 |
UNWATCH | 取消WATCH命令对所有key的监视 |
WATCH key [key …] | 监视一个或多个key,如果在事务执行之前这些key被其它命令所改动,那么事务将被打断 |
举例如下:
uplooking01:7001> get name "xpleaf" uplooking01:7001> MULTI OK uplooking01:7001> get name QUEUED uplooking01:7001> set name yyh QUEUED uplooking01:7001> get name QUEUED uplooking01:7001> EXEC 1) "xpleaf" 2) OK 3) "yyh"
Redis命令总结
Redis的常用命令主要分为两个方面、一个是键值相关命令、一个是服务器相关命令
1、键值相关命令 keys * 取出当前所有的key exists name 查看redis是否有name这个key del name 删除key name expire confirm 100 设置confirm这个key100秒过期 ttl confirm 获取confirm 这个key的有效时长 select 0 选择到0数据库 redis默认的数据库是0~15一共16个数据库 move confirm 1 将当前数据库中的key移动到其他的数据库中, persist confirm 移除confirm这个key的过期时间 randomkey 随机返回数据库里面的一个key rename key2 key3 重命名key2 为key3 type key2 返回key的数据类型 2、服务器相关命令 ping PONG返回响应是否连接成功 echo 在命令行打印一些内容 select 0~15 编号的数据库 quit /exit 退出客户端 dbsize 返回当前数据库中所有key的数量 info 返回redis的相关信息 config get dir/* 实时传储收到的请求 flushdb 删除当前选择数据库中的所有key flushall 删除所有数据库中的数据库
Redis安全
我们可以通过redis的配置文件设置密码参数,这样客户端连接到redis服务就需要密码验证,这样可以让你的redis服务更安全。
我们可以通过以下命令查看是否设置了密码验证:
uplooking01:7001> config get requirepass 1) "requirepass" 2) ""
默认情况下requirepass参数是空的,这就意味着无需密码验证就可以连接到redis服务。如果设置密码,客户端连接redis服务就需要密码验证。否则无法执行命令,有两方式完成认证:
可以在连接时就指定密码:redis-cli -h uplooking03 -a uplooking 也可以先连接,到终端后再认证:auth uplooking
Redis管道与性能测试
Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤: 客户端向服务端发送一个查询请求,并监听scoket返回,通常是以阻塞模式,等待服务端响应。 服务端处理命令,并将结果返回给客户端。 Redis管道技术可以在服务端末响应时,客户端可以继续想服务端发送请求,并最终一次性读取所有服务端的相应。
下面使用Java代码来进行测试:
package com.uplooking.bigdata; import com.uplooking.bigdata.common.util.redis.JedisUtil; import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.Pipeline; /** * 使用管道和不使用管道的性能测试对比 */ public class PipelineTest { @Test public void testPipeline() { int count = 10000; // 标记不使用管道操作时的开始时间 long start = System.currentTimeMillis(); // 不使用管道执行操作 withoutPipeline(count); // 标记不使用管道操作时的结束时间 long end = System.currentTimeMillis(); // 输出不使用管道进行操作时所消耗的时间 System.out.println("withoutPipeline: " + (end-start)); // 标记使用管道操作时的开始时间 start = System.currentTimeMillis(); // 使用管道执行操作 usePipeline(count); // 标记使用管道操作时的结束时间 end = System.currentTimeMillis(); // 输出使用管道进行操作时所消耗的时间 System.out.println("usePipeline: " + (end-start)); } private void withoutPipeline(int count) { JedisUtil.getJedis(); Jedis jedis = JedisUtil.getJedis(); for(int i =0; i < count; i++) { jedis.incr("testKey1"); } cleanUp(jedis); } private void usePipeline(int count) { Jedis jedis = JedisUtil.getJedis();