原文地址:http://blog.csdn.net/freebird_lb/article/details/7778999
Redis-2.4.15目前没有提供集群的功能,Redis作者在博客中说将在3.0中实现集群机制。目前Redis实现集群的方法主要是采用一致性哈稀分片(Shard),将不同的key分配到不同的redis server上,达到横向扩展的目的。下面来介绍一种比较常用的分布式场景:
在读写操作比较均匀且实时性要求较高,可以用下图的分布式模式:
在读操作远远多于写操作时,可以用下图的分布式模式:
对于一致性哈稀分片的算法,Jedis-2.0.0已经提供了,下面是使用示例代码(以ShardedJedisPool为例):
package com.jd.redis.client;
import java.util.ArrayList;
import java.util.List;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.util.Hashing;
import redis.clients.util.Sharded;
publicclass RedisShardPoolTest {
static ShardedJedisPoolpool;
static{
JedisPoolConfig config =new JedisPoolConfig();//Jedis池配置
config.setMaxActive(500);//最大活动的对象个数
config.setMaxIdle(1000 * 60);//对象最大空闲时间
config.setMaxWait(1000 * 10);//获取对象时最大等待时间
config.setTestOnBorrow(true);
String hostA = "10.10.224.44";
int portA = 6379;
String hostB = "10.10.224.48";
int portB = 6379;
List<JedisShardInfo> jdsInfoList =new ArrayList<JedisShardInfo>(2);
JedisShardInfo infoA = new JedisShardInfo(hostA, portA);
infoA.setPassword("redis.360buy");
JedisShardInfo infoB = new JedisShardInfo(hostB, portB);
infoB.setPassword("redis.360buy");
jdsInfoList.add(infoA);
jdsInfoList.add(infoB);
pool =new ShardedJedisPool(config, jdsInfoList, Hashing.MURMUR_HASH,
Sharded.DEFAULT_KEY_TAG_PATTERN);
}
/**
* @param args
*/
publicstaticvoid main(String[] args) {
for(int i=0; i<100; i++){
String key = generateKey();
//key += "{aaa}";
ShardedJedis jds = null;
try {
jds = pool.getResource();
System.out.println(key+":"+jds.getShard(key).getClient().getHost());
System.out.println(jds.set(key,"1111111111111111111111111111111"));
} catch (Exception e) {
e.printStackTrace();
}
finally{
pool.returnResource(jds);
}
}
}
privatestaticintindex = 1;
publicstatic String generateKey(){
return String.valueOf(Thread.currentThread().getId())+"_"+(index++);
}
}
从运行结果中可以看到,不同的key被分配到不同的Redis-Server上去了。
实际上,上面的集群模式还存在两个问题:
1. 扩容问题:
因为使用了一致性哈稀进行分片,那么不同的key分布到不同的Redis-Server上,当我们需要扩容时,需要增加机器到分片列表中,这时候会使得同样的key算出来落到跟原来不同的机器上,这样如果要取某一个值,会出现取不到的情况,对于这种情况,Redis的作者提出了一种名为Pre-Sharding的方式:
Pre-Sharding方法是将每一个台物理机上,运行多个不同断口的Redis实例,假如有三个物理机,每个物理机运行三个Redis实际,那么我们的分片列表中实际有9个Redis实例,当我们需要扩容时,增加一台物理机,步骤如下:
A. 在新的物理机上运行Redis-Server;
B. 该Redis-Server从属于(slaveof)分片列表中的某一Redis-Server(假设叫RedisA);
C. 等主从复制(Replication)完成后,将客户端分片列表中RedisA的IP和端口改为新物理机上Redis-Server的IP和端口;
D. 停止RedisA。
这样相当于将某一Redis-Server转移到了一台新机器上。Prd-Sharding实际上是一种在线扩容的办法,但还是很依赖Redis本身的复制功能的,如果主库快照数据文件过大,这个复制的过程也会很久,同时会给主库带来压力。所以做这个拆分的过程最好选择为业务访问低峰时段进行。
http://blog.nosqlfan.com/html/3153.html
2. 单点故障问题:
还是用到Redis主从复制的功能,两台物理主机上分别都运行有Redis-Server,其中一个Redis-Server是另一个的从库,采用双机热备技术,客户端通过虚拟IP访问主库的物理IP,当主库宕机时,切换到从库的物理IP。只是事后修复主库时,应该将之前的从库改为主库(使用命令slaveof no one),主库变为其从库(使命令slaveof IP PORT),这样才能保证修复期间新增数据的一致性。
分享到:
相关推荐
在本“Redis学习笔记-包括周阳和狂神说”中,我们将深入探讨Redis的核心概念、功能特性以及实际应用。 1. Redis基本概念 - 键值对:Redis的核心数据结构,键是唯一的标识,值可以是多种类型,如字符串、哈希、列表...
一级分类:基础知识- Redis 数据类型- Redis 命令- Redis 过期策略- Redis 事务- Redis 持久化- Redis 发布订阅- Redis Lua 脚本- Redis 位图操作- Redis 分布式锁- Redis 主从复制- Redis 集群- Redis Sentinel- ...
Redis的源码清晰易读,学习源码可以帮助理解其内部工作原理,比如内存管理、命令解析、网络通信等。同时,了解源码对于优化Redis性能、定制功能或者排查问题非常有帮助。 6. 工具应用 - Redis Commander:图形化...
01 Redis快速入门 - Redis教程 02-Redis环境安装 - Redis教程 03-Redis 的安装配置介绍 04-Redis数据类型 - Redis教程 05-Redis命令 - Redis教程 06-Redis键 - Redis教程。。。 13-Redis发布订阅 - Redis教程 。。。...
"深入redis学习(十一)--redis cluster.doc"虽然未在文件列表中,但通常会讲述Redis Cluster的分布式集群方案,包括槽分配、数据迁移、故障检测等。 "深入redis学习(十二)--redis limitations.doc"可能会讨论...
在分布式系统中,Redis可用于实现分布式Session管理,提高系统的可扩展性和灵活性。通过合理的配置和使用Redis的特性,可以有效地解决Session存储问题,使得Web应用能够更好地处理用户的请求。 综上所述,Redis作为...
这个“redis学习笔记.zip”压缩包很可能是包含了关于Redis的学习资料,可能包括概念解释、操作教程、实践案例等内容,适合初学者和有一定基础的学习者参考。 Redis的学习可以分为以下几个主要部分: 1. **基础知识...
通过这份Java Redis学习笔记,开发者可以深入了解如何在Springboot项目中高效地利用Redis进行数据存储和处理,提升系统的响应速度和稳定性。同时,配合Markdown格式,便于阅读和整理笔记,而PDF格式则方便离线查阅和...
Redis 广泛应用于缓存、计数系统、实时消息、限流系统、分布式锁、排行榜等功能。 总之,Redis 以其高性能、易用性和丰富的数据结构,成为了现代Web开发中不可或缺的工具,开发者应深入理解其原理和使用方法,以便...
本资源包包含了关于Redis的学习笔记以及一个基于SpringBoot整合Redis的实战项目——"springboot-redisdemo",旨在帮助你深入理解和应用Redis。 首先,让我们详细探讨Redis的核心知识点: 1. **Redis的数据类型**:...
这份"redis笔记.rar"包含的"redis笔记.pdf"应该是一份详细的学习指南,非常适合初学者了解和掌握Redis的基本概念、操作命令以及实战技巧。 1. Redis基本概念: - Redis是一个开源的、基于内存的数据存储系统,支持...
【Redis简介】 Redis,全名Remote Dictionary Server,是一款开源、高性能、支持网络、基于内存、键值对存储...这个笔记资源对于学习和理解Redis的使用具有很大的帮助,特别是对于需要掌握Redis实际应用的开发者来说。
这只是 Redis 学习的基础,深入使用还需要掌握更多的高级特性和最佳实践,例如集群搭建、主从复制、Lua 脚本、Pipeline 使用等。随着对 Redis 的了解加深,你可以将其应用到更复杂的系统设计中,优化性能和提高系统...
《Redis 深度历险》学习笔记与实践(Java) 基础和应用 1-2.Redis应用 — Redis基本数据结构 1-3.Redis应用 — 分布式锁 1-4.Redis应用 — 延时队列 1-5.Redis应用 — 位图 1-6.Redis应用 — HyperLogLog 1-7.Redis...
《狂神说Redis笔记》是针对Redis这一高性能的键值数据库进行深入讲解的资料,它涵盖了Redis的基础概念、核心功能以及在实际应用中的各种策略。Redis作为一款内存数据存储系统,广泛应用于缓存、消息队列、分布式锁等...
这份2022年的Redis学习笔记涵盖了Redis的基础概念、核心特性、使用场景以及最佳实践。 一、Redis简介 Redis是一个开源(BSD许可)的,非关系型、内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。它...
Redis 学习笔记 本资源摘要信息主要讲解了 Redis 的基本概念、特点、优点和应用场景。Redis 是一个开源的高性能键值对数据库,支持多种键值数据类型,适合处理海量数据,效率高,但不一定安全。 一、Redis 简介 ...
redis安装包 1.NOSQL数据库入门 ...6.Redis学习笔记 7.redis项目实战 8.Redis 多机特性工作原理简介 9.redis深入研究及大集群实战经验 10.Redis 的安装配置介绍 12.Redis 的安装配置 等等 helloredis 例子源码
【Redis学习笔记】 Redis是一个基于键值对的高性能NoSql数据库,特别适合处理高并发读写和海量数据的高效存储和访问。Redis以其丰富的数据类型和出色的速度在各种应用场景中得到了广泛的应用。 **NoSql简介** ...