jedis

Redis 分布式锁的正确实现方式(Java版)(抄)

江枫思渺然 提交于 2019-12-02 04:43:59
前言 分布式锁一般有三种实现方式: 数据库乐观锁; 基于Redis的分布式锁; 基于ZooKeeper的分布式锁 本篇博客将介绍第二种方式,基于Redis实现分布式锁。 虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性 。在任意时刻,只有一个客户端能持有锁。 不会发生死锁 。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性 。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人 。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 代码实现 组件依赖 首先我们要通过Maven引入Jedis开源组件,在pom.xml文件加入下面的代码: <dependency> <groupId>redis.clientsgroupId> <artifactId>jedisartifactId> <version>2.9.0version> > 加锁代码 正确姿势 Talk is cheap, show me the code。先展示代码,再带大家慢慢解释为什么这样实现: public class RedisTool {

jedis的连接池

↘锁芯ラ 提交于 2019-12-02 04:39:19
1、需要先打开虚拟机,并开启Linux系统的端口号:6379: 其中,第一行代码为修改字符编码格式,解决SSH中文乱码问题。 2、开启redis: 3、利用连接池实现数据的存取: (1)代码实现: import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisDemo { public void test(){ //对连接池进行配置 JedisPoolConfig jedisPoolConfig=new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(30);//最大闲置个数 jedisPoolConfig.setMinIdle(10);//最小闲置个数 jedisPoolConfig.setMaxTotal(50);//最大连接数 //创建一个redis连接池 JedisPool jedisPool=new JedisPool(jedisPoolConfig,"192.168.204.128",6379); //从连接池中获取redis的连接资源 Jedis jedis=jedisPool.getResource(); /

spring-data-redis中JedisCluster不支持pipelined问题解决

ぃ、小莉子 提交于 2019-12-02 02:52:28
摘要: 引言 了解Jedis的童鞋可能清楚,Jedis中JedisCluster是不支持pipeline操作的,如果使用了redis集群,在spring-boot-starter-data-redis中又正好用到的pipeline,那么会接收到Pipeline is currently not supported for JedisClusterConnection.这样的报错。 引言 了解Jedis的童鞋可能清楚,Jedis中 JedisCluster 是不支持pipeline操作的,如果使用了redis集群,在 spring-boot-starter-data-redis 中又正好用到的pipeline,那么会接收到 Pipeline is currently not supported for JedisClusterConnection. 这样的报错。错误来自于 org.springframework.data.redis.connection.jedis.JedisClusterConnection : /* * (non-Javadoc) * @see org.springframework.data.redis.connection.RedisConnection#openPipeline() */ @Override public void openPipeline

Redis cluster集群模式的原理

陌路散爱 提交于 2019-12-02 02:48:00
redis cluster   redis cluster是Redis的分布式解决方案,在3.0版本推出后有效地解决了redis分布式方面的需求   自动将数据进行分片,每个master上放一部分数据   提供内置的高可用支持,部分master不可用时,还是可以继续工作的   支撑N个redis master node,每个master node都可以挂载多个slave node   高可用,因为每个master都有salve节点,那么如果mater挂掉,redis cluster这套机制,就会自动将某个slave切换成master redis cluster vs. replication + sentinal   如果你的数据量很少,主要是承载高并发高性能的场景,比如你的缓存一般就几个G,单机足够了   replication,一个mater,多个slave,要几个slave跟你的要求的读吞吐量有关系,然后自己搭建一个sentinal集群,去保证redis主从架构的高可用性,就可以了   redis cluster,主要是针对海量数据+高并发+高可用的场景,海量数据,如果你的数据量很大,那么建议就用redis cluster 数据分布算法 hash算法   比如你有 N 个 redis实例,那么如何将一个key映射到redis上呢,你很可能会采用类似下面的通用方法计算 key的

jedis的使用

与世无争的帅哥 提交于 2019-12-02 02:22:19
1、需要先打开虚拟机,并开启Linux系统的端口号:6379: 其中,第一行代码为修改字符编码格式,解决SSH中文乱码问题。 2、开启redis: 3、创建java程序,通过程序实现存取操作: (1)导入jar包: (2)程序: import redis.clients.jedis.Jedis; public class JedisDemo { public void test(){ Jedis jedis=new Jedis("192.168.204.128",6379); jedis.set("河南","郑州"); String add=jedis.get("河南"); System.out.println(add); } public static void main(String[]args){ JedisDemo jedisDemo=new JedisDemo(); jedisDemo.test(); } } (3)运行结果: 来源: https://www.cnblogs.com/zhai1997/p/11725470.html

动态添加Redis密码认证的方法

我的未来我决定 提交于 2019-12-02 01:45:36
1.定制jedis 对redis返回的错误的处理,做两处修改: 忽略 (error) ERR Client sent AUTH, but no password is set。使配置了密码的jedis可以在没有配置密码redis上使用; 发生(error) NOAUTH Authentication required时,将当前connection置为broken,从而将连接踢出连接池。这样动态给redis添加上密码时,jedis会自动重新创建可用连接。 我已经对jedis 2.8.x版本做好了以上修改。可以直接下载使用 。如果使用了更高的版本jedis,可以参考我的代码自行修改;如果使用了更低版本的,建议升级到2.8.x。 2.在项目代码中使用定制的jedis 修改maven配置。将原来的jedis依赖注释掉,添加对本地的定制jedis的依赖: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.8.3</version> <scope>system</scope> <systemPath>${project.basedir}/../libs/jedis-2.8.3.jar</systemPath> <!-- 此处的systemPath是jedis-2.8

redis使用

巧了我就是萌 提交于 2019-12-02 00:21:32
在Java中的运用; 1)导包 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.0.0</version> </dependency> Java代码操作redis //连接本地的 Redis 服务 Jedis jedis = new Jedis("localhost"); System.out.println("Connection to server sucessfully"); //设置 redis 字符串数据 jedis.set("runoobkey", "Redis tutorial"); // 获取存储的数据并输出 System.out.println("Stored string in redis:: "+ jedis.get("runoobkey")); //存储数据到列表中 jedis.lpush("tutorial-list", "Redis"); jedis.lpush("tutorial-list", "Mongodb"); // 获取存储的数据并输出 List<String> list = jedis.lrange("tutorial-list", 0 ,5); // 删除key对应的记录 jedis.del("name");

jedis代码操作

谁说我不能喝 提交于 2019-12-01 23:23:03
一、jedis快速入门 * Jedis: 一款java操作redis数据库的工具. * 使用步骤: 1. 下载jedis的jar包 2. 使用 //1. 获取连接 Jedis jedis = new Jedis("localhost",6379); //2. 操作 jedis.set("username","zhangsan"); //3. 关闭连接 jedis.close(); --------------------- package cn.itcast.jedis.test; import org.junit.Test; import redis.clients.jedis.Jedis; public class JedisTest { @Test public void test1(){ Jedis jedis = new Jedis("localhost", 6379); jedis.set("username","zhangsan"); jedis.close(); } } 二、Jedis操作各种redis中的数据结构 1、字符串类型 string set get //1. 获取连接 Jedis jedis = new Jedis();//如果使用空参构造,默认值 "localhost",6379端口 //2. 操作 //存储 jedis.set("username",

redis It seems like server has closed the connection

柔情痞子 提交于 2019-12-01 23:14:11
问题 i want to use redis sub/pub, but when i subscribe one channel, 2 minutes after,console output Exception: It seems like server has closed the connection. redis version:redis-3.0.3 jedis version:2.3.0 os:OS X Yosemite 10.10.5 Subscribe.class JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); jedisPoolConfig.setMaxIdle(10); jedisPoolConfig.setMaxWait(4000); jedisPoolConfig.setTestOnBorrow(true); JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379); final Jedis jedis =

redis 分布式锁

╄→尐↘猪︶ㄣ 提交于 2019-12-01 23:11:25
出处: https://www.cnblogs.com/fixzd/p/9479970.html 一、介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁。会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁。 本篇文章会将分布式锁的实现分为两部分,一个是单机环境,另一个是集群环境下的Redis锁实现。在介绍分布式锁的实现之前,先来了解下分布式锁的一些信息。 二、分布式锁 2.1 什么是分布式锁? 分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性。 2.2 分布式锁需要具备哪些条件 互斥性:在任意一个时刻,只有一个客户端持有锁。 无死锁:即便持有锁的客户端崩溃或者其他意外事件,锁仍然可以被获取。 容错:只要大部分Redis节点都活着,客户端就可以获取和释放锁 2.4 分布式锁的实现有哪些? 数据库 Memcached(add命令) Redis(setnx命令) Zookeeper(临时节点) 等等 三、单机Redis的分布式锁 3.1 准备工作 定义常量类 public class LockConstants { public static final String OK = "OK"; /** NX|XX, NX -- Only