Redis是一个内存数据结构存储,用作数据库,缓存和消息代理。它支持数据结构,如字符串,散列,列表,集合,带有范围查询的排序集,位图,超级日志,具有半径查询和流的地理空间索引。本文介绍了集群,发布和订阅等高级概念,使用Jedis Java库管理Redis的概念。
Pipeling
Redis是一个TCP服务器,可以处理请求和响应模型。当需要执行连续的命令集时,在发送请求和接收响应的往返中将浪费更多时间。场景如大型物品列表,如果通过请求和响应模型发送,往返时间损失将更多。这可以避免使用流水线操作,我们可以将大量命令批处理到服务器,因此服务器批量处理命令并将响应排队并发送。
Jedis客户端创建管道,其中所有批处理命令集都排入其中。然后,sync将从1到10发送作业列表的批处理请求,每个作业都有5个taskid成员添加到服务器。同步将阻止客户端,直到服务器处理请求。然后可以检查jedis客户端以查找具有taskids的作业的列表。
Pipeline pipeline = jedis.pipelined();
for (int i=1; i<10; i++) {
for (int j=1; j<5; j++) {
pipeline.lpush("job" + i, "taskid" + j);
}
}
pipeline.sync();
for (int i=1; i<10; i++) {
System.out.println(jedis.lrange("job"+i, 0, -1));
}
消息经纪人
Redis是一个快速稳定的发布/订阅消息系统。发件人将消息发送到频道,订阅频道的订阅者可以接收消息。它是在两方之间共享消息的非阻塞方式。
Jedis客户端可以订阅该频道。需要提供消息处理程序以及订阅方法。它被动地听取频道的消息。
final Jedis subJedis = jedisPool.getResource();
subJedis.subscribe(new JedisPubSub() {
@Override
public void onMessage(String channel, String message) {
System.out.printf("Received msg: %s from channel %s", message, channel);
}
}, "channel1");
可以使用jedis客户端再次创建新连接以发布消息。它提供了发布方法,其中包含要在频道中发布的频道和消息。
Jedis pubJedis = jedisPool.getResource();
pubJedis.publish("channel1", "hello pubsub model");
Redis节点的聚类
Redis集群是redis的分布式实现,具有高达1000个节点的线性可扩展性,以及具有至少一个可到达从节点的每个主节点的最大可用性。集群节点与TCP总线和称为Redis集群总线的二进制协议连接。独立redis服务器支持的所有数据类型也可在群集中使用。它还标记了键标记到特定节点的标签。了解有关如何安装和设置Redis群集的详细信息
Redis服务器支持主从复制,其中master用于写入,slave用于读取。Master可以有很多从属,它是非阻塞异步复制。为了扩大写入,需要多个主设备和相应的从设备。redis中没有Peer-to-Peer类型的设置。
使用Redis群集
要连接到redis群集,必须将群集中的任一节点集创建为Set 或一个主节点。JedisCluster将集群节点设置为构造函数参数并创建集群客户端。
Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>();
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7001));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7002));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7003));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7004));
jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7005));
JedisCluster jedisCluster = new JedisCluster(jedisClusterNodes);
/* will print all the cluster nodes */
System.out.println(jedisCluster.getClusterNodes());
创建集群客户端后,它可以直接用于存储和检索数据类型,因为它管理所有redis节点资源。
jedisCluster.set("blog-summary/advanced-redis", "Advanced programming in Redis using Jedis");
System.out.println(jedisCluster.get("blog-summary/advanced-redis"));
同样,redis中支持的所有数据类型也可以在redis群集中使用。可以使用JedisCluster中提供的相同类型的方法存储和检索数据类型。