`

在多线程下使用Jedis-设置主/从分布

 
阅读更多

在多线程下使用Jedis

在不同的线程中使用相同的Jedis实例会发生奇怪的错误。但是创建太多的实现也不好因为这意味着会建立很多sokcet连接,也会导致奇怪的错误发生。单一Jedis实例不是线程安全的。为了避免这些问题,可以使用JedisPool, JedisPool是一个线程安全的网络连接池。可以用JedisPool创建一些可靠Jedis实例,可以从池中拿到Jedis的实例。这种方式可以解决那些问题并且会实现高效的性能.

初始化JedisPool 

 

[java] view plaincopy
 
  1. JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost");  

 

 

可以以静态的方式处理以上代码,它是线程安全的.

JedisPoolConfig包含了许多有用的redis指定的连接池的默认参数。比如,如果一个连接300秒内没有任何的返回Jedis将关闭这个连接.

可以这样使用

[java] view plaincopy
 
  1. Jedis jedis = pool.getResource();  
  2. try {  
  3.   //随便做一些对于redis的操作  
  4.   jedis.set("foo""bar");  
  5.   String foobar = jedis.get("foo");  
  6.   jedis.zadd("sose"0"car"); jedis.zadd("sose"0"bike");  
  7.   Set<String> sose = jedis.zrange("sose"0, -1);  
  8. finally {  
  9.   //这里很重要,一旦拿到的jedis实例使用完毕,必须要返还给池中  
  10.   pool.returnResource(jedis);  
  11. }  
  12. //程序关闭时,需要调用关闭方法  
  13. pool.destroy();  

 

设置主/从分布

启用同步复制

Redis主要为了主/从分布而构建。这意味着"write"请求必须要指向"master", "master"会同步复制改变的内容到"slave". "read"请求可以(不是必须的)被指向"slave",缓解"master"的读写压力.

可以按以下的步骤使用"master". 为了启用同步复制,有两个方式去告诉"slave"将"slaveOf"到一个给定的"master":

1.在redis server的config文件(redis.conf)指明

2.在拿到的jedis实例中调用"slaveOf"方法并指定IP和端口

[java] view plaincopy
 
  1. jedis.slaveOf("192.168.1.35"6379);  

 

意:"slave"也是一个redis server,也可以接收"write"请求并不会报错,但是改变不会被同步复制,所以如果弄反了jedis的实例则一些操作会被覆盖.

禁用同步复制/master失败后,提升slave

如果"master"down掉,可以提升"slave"成为新的"master".首先试着禁用同步复制离线的"master",如果有几个"slave",启用同步复制其余的"slave"到新的"master".

[java] view plaincopy
 
  1. slave1jedis.slaveofNoOne();  
  2. slave2jedis.slaveOf("192.168.1.36"6379);  
分享到:
评论

相关推荐

    jedis jedis.jar

    2. 分布式锁:通过设置和删除特定键来实现分布式锁,确保在多线程或多节点环境下对共享资源的安全访问。 3. 消息队列:使用发布/订阅模式实现消息传递,可以用于工作流调度、事件驱动架构等场景。 4. 缓存失效策略:...

    redis3.0+jedis

    5. **Connection Pooling**: 提供连接池管理,便于在多线程环境中高效地重用连接,减少资源消耗。 6. **Sentinel Support**: 能够与Redis Sentinel配合,实现主从切换和故障恢复。 7. **Cluster Support**: Jedis ...

    jedis共享接口+单机版集群版功能实现扩展

    在Redis集群中,数据分布在多个节点上,Jedis集群版需要处理槽(slot)的概念,通过槽映射确定数据存储在哪个节点,并能进行跨节点的操作。`JedisClientCluster`接口可能会包含集群节点的管理,如添加、删除节点,...

    2019年 Redis从入门到高可用 分布式实战教程

    Redis从入门到高可用 分布式实战教程,共140多节课程、 掌握redis主从、哨兵、集群 ,参数调优 目录: 9-9 原生安装-1.准备节点.mp4 9-8 原生安装.mp4 9-7 基本架构.mp4 9-6 虚拟槽哈希分布.mp4 9-5 一致性...

    redis-demo.zip

    - 在分布式系统中,Redis可以实现分布式锁,确保在多线程或多节点环境下的数据一致性。 - 使用`SETNX`(Set if Not Exist)命令或`lua`脚本来确保锁的安全获取和释放。 6. Redis事务: - Redis支持事务,用户...

    Redis面试题(含答案)_.zip

    - 复制是异步的,主节点无需等待从节点确认即可执行下一条命令。 - 支持全量复制和增量复制。 5. **Redis集群(Cluster)** - 通过一致性哈希实现数据分片,解决了单机容量限制问题。 - 每个节点负责一部分槽位...

    javamq源码-tanyunshou:java高并发自主学习代码,从基本多线程,回调出发,再到后续的多数据源、mq、redis以及最终的分布

    【标题】"javamq源码-tanyunshou"是一个关于Java高并发与消息队列(MQ)技术的学习项目,作者tanyunshou旨在通过这个项目分享他的自主学习成果,涵盖了从基础的多线程编程到更复杂的分布式技术。这个项目包括了对...

    23_怎么保证redis是高并发以及高可用的?.zip

    Redis本身不支持多线程,但在客户端层面,可以通过多线程或异步处理来提高并发性。例如,在Java中,Jedis客户端支持连接池和线程安全的命令执行。 九、监控与报警 实时监控Redis的性能指标,如CPU使用率、内存使用...

    Redis面试题.pdf

    - **避免锁的竞争**:避免了多线程环境中常见的锁竞争问题,提高了系统的整体性能。 - **易于保证数据一致性**:单线程环境自然地保证了数据的一致性。 #### 4. 如何在Redis中设置和获取键值对?请说明相关的命令...

    Redis面试知识点.pdf

    全量复制发生在新加入的从节点或主节点重启时,增量复制则是在全量复制完成后发生的更新同步。 #### 24、Redis集群最大节点个数是多少? Redis集群的最大节点数为16384个,每个哈希槽对应一个节点。 #### 25、...

    Redis面试题(2022最新版)-重点.docx

    哨兵模式是一种高可用解决方案,可以监控主从实例的状态,并在主实例出现故障时自动进行故障转移。 **7.2 官方Redis Cluster方案** 官方Redis Cluster方案通过服务端路由查询机制实现数据分片,支持自动故障转移和...

    并行计算课程作业,使用redis cluster实现铁路数据的内存化管理.zip

    此外,为了实现并行计算,可以利用Redis Cluster的并行查询能力,通过多线程或异步编程模型并行发送请求到不同节点。这样,对于大量铁路数据的分析和处理,性能可以显著提升。同时,由于Redis支持发布/订阅模式,还...

    redis百万并发访问数据库测试需要的jar包

    在处理高并发时,单线程避免了多线程的上下文切换开销,提高了效率。 3. **发布/订阅(Pub/Sub)模式**:Redis支持发布/订阅模式,可以用于实现消息的实时传递,构建消息队列,为并发访问提供异步处理机制。 4. **...

    BAT大厂高频面试题:Redis+JVM+微服务+并发+Spring+MyBatis.docx

    是的,Redis 默认是单进程单线程的,这样设计有利于简化内部实现并避免多线程环境下的复杂性问题。 #### 7. 一个字符串类型的值能存储最大容量是多少? Redis 中字符串类型的最大长度为 512MB。 #### 8. Redis 的...

    redis经典面试题详细

    其次,Redis采用单线程模型,避免了多线程间的上下文切换开销。此外,Redis使用高效的命令编码和网络协议,以及优秀的数据结构设计,都极大地提高了其性能。 数据类型:Redis支持五种数据类型,包括字符串(String...

    基于Redis分布式锁的实现代码

    在实际应用中,分布式锁的实现需要考虑更多复杂情况,比如锁的续期、公平性、死锁检测和处理、分布式环境下的线程安全等。例如,可以使用Redis的`PEXPIRE`命令在锁快要过期时自动续期,或者使用`BLPOP`或`BRPOP`命令...

    Redis实现分布式锁和等待序列的方法示例

    // 使用 SET 命令尝试获取锁,NX确保只在键不存在时设置,PX设置过期时间 String result = jedis.set(lockKey, requestId, SET_IF_NOT_EXIST, SET_WITH_EXPIRE_TIME, expireTime); return LOCK_SUCCESS.equals...

    flasher-master.zip

    4. **线程安全**:Flasher内部采用线程安全的机制,保证多线程环境下操作的正确性。 5. **丰富的API支持**:Flasher提供了丰富的Java API,涵盖了Redis Cluster的所有命令,包括基本的字符串操作、集合操作、有序...

    Redis分片池 代码

    5. **并发与事务支持**:在多线程环境下,需要处理并发访问和事务操作。Redis支持简单的单条命令事务,但在分布式环境中,可能需要结合分布式锁或其他机制来保证数据一致性。 6. **故障恢复与数据同步**:当某个...

Global site tag (gtag.js) - Google Analytics