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