一.Redis的分布式
Redis本身不支持分布式,通过Jedis客户端可以实现使用Redis分布式。
package com.gqshao.redis.connection; import com.google.common.collect.Lists; import com.gqshao.redis.utils.JedisUtils; import org.junit.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.*; import java.util.Arrays; import java.util.List; /** * Jedis 独有的分布式 * 根据List<JedisShardInfo>中Redis顺序和key,指定固定的Redis * 扩容时使用 Pre-Sharding */ public class ShardedJedisTest { protected static Logger logger = LoggerFactory.getLogger(ShardedJedisTest.class); private static ShardedJedisPool pool = null; protected ShardedJedis jedis = null; @BeforeClass public static void createPool() { JedisPoolConfig poolConfig = JedisUtils.getMyDefaultJedisPoolConfig(); // List<JedisShardInfo> shards = Arrays.asList(new JedisShardInfo("192.168.3.98", 6379) // , new JedisShardInfo("192.168.3.98", 6380)); List<JedisShardInfo> shards = Lists.newArrayList(); JedisShardInfo info1 = new JedisShardInfo("192.168.3.98", 6379); JedisShardInfo info2 = new JedisShardInfo("192.168.3.98", 6380); // 添加的顺序有意义 shards.add(info1); shards.add(info2); pool = new ShardedJedisPool(poolConfig, shards); } @Before public void getResource() { jedis = pool.getResource(); } @After public void destroyJedis() { pool.returnResource(jedis); } @AfterClass public static void destroyPool() { pool.destroy(); } /** * 不同的key分配根据List<JedisShardInfo>中的顺序,分配不同的Redis连接 */ @Test public void testSet() { for (int i = 0; i < 20; i++) { try { logger.info(i + " - " + jedis.getShard("" + i).getClient().getHost() + " : " + jedis.getShard(i + "").getClient().getPort()); logger.info(jedis.set("" + i, "true")); } catch (Exception e) { e.printStackTrace(); } } } /** * 修改List<JedisShardInfo>中的顺序,无法得到结果,确定该顺序是有意义的 */ @Test public void testGet() { for (int i = 0; i < 20; i++) { try { logger.info(i + " - " + jedis.getShard(i + "").getClient().getHost() + ":" + jedis.getShard(i + "").getClient().getPort() + " ? " + jedis.get("" + i)); } catch (Exception e) { e.printStackTrace(); } } } }
二.Redis主从复制
redis的主重复制有两种方式,第一种是写在.conf配置文件中,第二种是通过命令slaveof ip port 或 slaveof no one
slaveof no one 之后,当前Redis节点提升为Master但之前数据不会丢失,所以通过程序动态的设置主从复制可以解决Redis单点故障的问题
package com.gqshao.redis.connection; import com.gqshao.redis.utils.JedisUtils; import org.junit.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * slaveof 和 slaveofNoOne方法可以在运行中动态设置服务器为Master或Slave */ public class SlaveofTest { protected static Logger logger = LoggerFactory.getLogger(SlaveofTest.class); private static JedisPool pool1 = null; protected Jedis jedis1 = null; private static JedisPool pool2 = null; protected Jedis jedis2 = null; @BeforeClass public static void init() { JedisPoolConfig poolConfig = JedisUtils.getMyDefaultJedisPoolConfig(); // timeout设置为0,解决JedisConnectionException pool1 = new JedisPool(poolConfig, "192.168.3.98", 6379, 0); pool2 = new JedisPool(poolConfig, "192.168.3.98", 6380, 0); logger.info("----------------------create resource----------------------"); } @AfterClass public static void destroy() { pool1.destroy(); pool2.destroy(); } @Before public void initJedis() { jedis1 = pool1.getResource(); jedis2 = pool2.getResource(); } @After public void destroyJedis() { pool1.returnResource(jedis1); pool2.returnResource(jedis2); } /** * 测试主从复制 注意设置Slave之后需要时间复制数据 */ @Test public void test() { // 设置 Redis2为Redis1的slave logger.info("jedis1 slaveof no one"); jedis1.slaveofNoOne(); logger.info("jedis2 slaveof 192.168.3.98 6379"); jedis2.slaveof("192.168.3.98", 6379); try { jedis2.set("key", "value"); } catch (Exception e) { logger.warn("由于设置的原因slave为read only"); } // 主从复制 Redis1中保存数据Redis2中可以读取 logger.info("jedis1.set mykey1 myvalue1 : " + jedis1.set("mykey1", "myvalue1")); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } logger.info("jedis2.get mykey1: " + jedis2.get("mykey1")); // 单点问题解决思路(思路启用Redis2为Master,Redis1为SlaveOf Redis1) // 提升Redis2为Master,读取刚才的数据,重启Redis1,将Redis2设置为Redis1的Master jedis2.slaveofNoOne(); // 测试值仍然存在 logger.info("jedis2.get again : " + jedis2.get("mykey1")); // Redis2中存入数据 logger.info("jedis2.set mykey2 myvalue2 : "+jedis2.set("mykey2", "myvalue2")); // Redis1设置为Redis2的slave jedis1.slaveof("192.168.3.98", 6380); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } // 测试jedis1中读取数据 logger.info("jedis1.get mykey2 : " + jedis1.get("mykey2")); logger.info("jedis1 slaveof no one"); jedis1.slaveofNoOne(); jedis1.del("mykey1", "mykey2"); jedis2.del("mykey1", "mykey2"); } }
相关推荐
4. Redis集群和主从复制: - Redis集群提供数据的高可用性和水平扩展,通过`redis-trib.rb`工具配置。 - 主从复制让数据备份,提高可用性,主节点写入,从节点同步。 5. Redis命令行工具: - `redis-cli`是官方...
- 配置复制和主从切换:确保高可用性,避免单点故障。 - 监控和调优:定期监控 Redis 性能,调整配置参数以应对负载变化。 6. Redis 在实际应用中的场景 - 缓存:加速网页渲染,减少数据库压力。 - 消息队列:...
此外,Redis 还支持集群模式(Cluster)、哨兵模式(Sentinel)和主从复制,以实现高可用性和数据冗余。哨兵模式可以监控 Redis 实例的状态,自动进行故障转移。集群模式则允许将数据分散在多个节点上,提高读写性能...
5. **持久化和主从复制** Redis支持RDB(快照)和AOF(追加日志)两种持久化方式,以及主从复制以实现高可用性。在C#应用中,通常由Redis服务器自身配置和管理这些特性。 6. **连接池管理** StackExchange.Redis...
Redis 以 BSD 许可证开源,提供多种数据结构,如字符串、列表、集合、有序集合和哈希表,且支持数据持久化和主从备份。 1.1 Redis 优势 - 性能:Redis 具有极高的读写速度,大约110000次/s的读取和81000次/s的写入...
8. **Redis的复制和主从模式**:通过主从复制,可以创建多个Redis实例作为从节点,分散读取压力,提高服务的可用性和并发处理能力。主从模式下,写操作在主节点执行,从节点同步数据并处理只读请求。 9. **Redis ...
Redis Cluster 是 Redis 提供的一种分布式数据库解决方案,它采用了无中心架构,每个节点都保存部分数据和整个集群的状态,并与其他所有节点保持连接,确保数据的实时性和一致性。 官方推荐的最小配置是使用六个...
Redis-4.0.2是Redis的稳定版本,提供了丰富的数据结构支持,如字符串、哈希、列表、集合和有序集合,以及发布/订阅、事务、持久化和主从复制等功能。 4. **搭建Redis集群**: Redis集群是Redis的一种分布式实现,...
通过这种方式,Session数据将被自动存储和检索自Redis,避免了网络调用的性能影响,同时也支持Redis的集群和主从配置。 在实际应用中,选择哪种分布式Session方案取决于具体的需求和资源限制。对于高并发、大规模的...
Redis的主从复制是分布式系统中常见的数据同步方式,它将数据的一份副本存放在不同的节点上,确保数据的安全性和高可用性。全量复制和部分复制是Redis中两种不同的复制策略,它们各自适用于不同的场景。 全量复制...
它的优势在于速度快、数据结构丰富、支持持久化和主从复制。本文将详细介绍 Redis 的使用、集成以及其核心特性。 ### 一、NoSQL 与 Redis NoSQL 数据库是相对于传统的 SQL 关系型数据库而言的,它不采用固定的表...
Redis提供丰富的数据结构,支持持久化和主从复制,拥有事务功能;而Memcached主要是简单的键值存储,无持久化和复制功能,但其性能更高。 6. **Redis如何实现主从复制?** Redis主从复制是异步的,从节点通过发送...
此外,Redis还提供了事务(Transaction)、发布/订阅(Pub/Sub)模式、持久化(Persistence)和主从复制(Replication)等高级特性。 在开发实例中,你可以找到如何在应用程序中集成Redis的示例。这通常包括以下...
它支持多种数据结构,如字符串、哈希、列表、集合、有序集合,还提供了发布/订阅、事务、持久化、备份和主从复制等特性。由于其在内存中存储数据,因此读写速度极快,特别适合于需要高并发读写操作的应用场景。 ...
7. **Redis的持久化和主从复制** Redis提供了多种持久化选项,如RDB快照和AOF日志,确保数据安全。同时,主从复制功能可实现数据的高可用性。 8. **Redis事务** 尽管Redis本身不支持复杂的ACID事务,但Spring ...
Redis的数据持久化和主从复制功能使其在生产环境中广泛应用。 2. **安装与启动** Redis的安装过程通常包括下载源码、编译和启动服务。在Linux环境下,可以通过编译安装并使用`redis-server`命令启动服务。Windows...
5. **主从同步**:在Redis集群中,数据复制是自动进行的,由主节点负责写操作,从节点负责读操作。当一个主节点的数据发生变化时,它会将变更广播给其他节点,实现数据的一致性。在故障恢复时,从节点可以晋升为主...
`replication.c`包含了复制和主从同步的逻辑。 五、事务 Redis支持简单的事务,通过`MULTI`、`EXEC`命令组合实现。`transaction.c`是事务处理的主要实现。 六、lua脚本支持 Redis 2.6开始支持内嵌的lua脚本执行,...
3. **Redis**:内存数据结构存储系统,支持字符串、哈希、列表、集合和有序集合等多种数据类型,提供丰富的操作命令,并且支持持久化和主从复制。 4. **Session共享**:在分布式环境中,session共享是解决用户会话在...