jedis

redis分布式锁

依然范特西╮ 提交于 2019-12-18 16:03:33
第一、分布式锁解决方案 分布式锁一般有三种实现方式 1.数据库乐观锁 采用数据库 不建议 性能不好 jdbc 2.基于redis分布式锁 基于Redis实现分布式锁(setnx)setnx也可以存入key,如果存入key成功返回1,如果存入的key已经存在了,返回0. 多个客户端(jvm),使用setnx命令方式,同时在redis上创建相关的一个key,因为redis key不能够允许重复的看,只有谁能够创建key成功,谁就能够获取到锁,没有创建key成功jvm,就会等待。 3. 基于ZooKeeper的分布式锁 基于Zookeeper实现分布式锁 Zookeeper是一个分布式协调工具,在分布式解决方案中, 多个客户端(jvm),同时在zk上创建相同的一个临时节点,因为临时节点路径是保证唯一, 只要谁能够创建节点成功,谁就能够获取到锁,没有创建成功节点,就会进行等待,当释放锁的时候,采用事件通知给客户端重新获取锁的资源。 最终核心思路,保证只能够有一个jvm进行做操作 第二、分析Redis实现分布式锁 多个客户端(jvm),使用setnx命令方式,同时在redis上创建相同的一个key,因为redis key不会允许重复的,只要能够创建key成功,谁就能够获取到锁,没有创建key成功jvm,就会进行等待。 如何释放锁? 在执行操作的时候,删除对应的key

池技术之common-pool2

自古美人都是妖i 提交于 2019-12-17 20:27:52
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 是什么 apache commons-pool 是apache基金会的一个开源对象池组件,我们常用的数据库连接池dpcp和redis的java客户端jedis都使用commons-pool来管理连接 优化对象的创建,和设计模式中的享元模式思路一样 类解析 PooledObject 池化后的对象 ObjectPool 对象池, PooledObjectFactory 池对象工厂 GenericObjectPool 实现了对对象池的管理,是一个基本的对象池实现 borrowObject 从对象池中获取一个对象 returnObject 对象使用完之后,归还到对象池 PooledObjectFactory 根据自己的业务创建和管理要对象池化的对象 makeObject 创建对象 destroyObject 销毁对象 对象的空闲时间(idle)超时 使用完被检测到对象已经无效时 当调用这个方法之后,对象的生命周期必须结束。如果是对象是线程,线程必须已结束,如果是socket,socket必须已close,如果是文件操作,文件数据必须已flush,且文件正常关闭. validateObject 检测一个对象是否有效,无效会被销毁 activateObject 激活一个对象或者说启动对象的某些操作 检测空闲对象的时候

JedisPool异常Jedis链接处理

僤鯓⒐⒋嵵緔 提交于 2019-12-17 16:46:13
问题现象(jedis-2.1.0.jar) 基于JedisPool管理Jedis对象,通过get方法获取值,出现key对应的value值错误,例如: K V a a b b Jedis.get(“a”)==’b’; 通过获取key为a的值,但获取了值b来。 同一套代码的项目,分别部署在两个不同的应用集群,其中一个集群出现这种问题,而另一个集群却没有出现。 问题分析 通过表象可以看出,应该是链接池的Jedis对象链接出现错乱而导致的。而两个集群中的其中一个集群出现,这两个集群的唯一区别就是网络环境不一样,所以连接Redis服务器的网络是有差别的。 问题思考 根据以上信息,可以大致判断出应该跟网速和JedisPool链接池的超时时间(500毫秒)设置有关。那接下来的问题是,如果网络差的集群,出现redis连接超时,那么Jedis为什么会错误呢?是否在连接池的配置不当知道呢? 问题发现 带着以上的疑问,继续Google和百度相关资料,结果发现returnBrokenResource这个方法。通过资料查找和对JedisPool的源码分析,此方法是销毁异常Jedis连接的。如果Jedis链接发现异常(如连接超时),不对异常连接销毁的话,会有数据缓存问题。 异常流程: 重现问题测试代码(设置1ms的readTimeOut时间,以便问题重现): 1 package test; 2 3

redis 运维异常文件解决

家住魔仙堡 提交于 2019-12-17 12:22:03
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 问题1 2019-12-17 11:26:04.482 [http-nio-8183-exec-10] ERROR o.l.litemall.core.config.GlobalExceptionHandler -able to persist on disk. Commands that may modify the data set are disabled, because this instance is ctes-on-bgsave-error option). Please check the Redis logs for details about the RDB error. redis.clients.jedis.exceptions.JedisDataException: MISCONF Redis is configured to save RDB snapshots, b data set are disabled, because this instance is configured to report errors during writes if RDB snapsogs for details about the RDB error. at redis.clients

Redis工具之Jedis

折月煮酒 提交于 2019-12-17 09:30:15
//jedis的连接池 1 public void test1(){ 2 //创建连接池配置对象 3 JedisPoolConfig poolConfig = new JedisPoolConfig(); 4 poolConfig.setMaxTotal(20); //最大资源个数 5 //创建连接池 6 //poolConfig 连接池的配置信息对象 7 JedisPool jedisPool = new JedisPool(poolConfig, "192.168.**.**", 6379); 8 //获得连接资源 9 Jedis jedis = jedisPool.getResource(); 10 jedis.set("name", "张三疯"); //set name 张三疯 11 jedis.hset("user", "username", "芷若"); // hset user username 芷若 12 //取出数据 13 String name = jedis.get("name"); 14 String hget = jedis.hget("user", "username"); 15 System.out.println(name); 16 System.out.println(hget); 17 //释放资源 18 jedis.close(); 19

Jedis连接池配置详解

蹲街弑〆低调 提交于 2019-12-16 13:38:49
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> Jedis连接池配置详解 写代码是日益精进的不是一蹴而就的,以前写代码就是各处借鉴,然后完成项目的需要就放在那里了,时间长了接触的多了,再来看之前代码总觉得哪里不太对劲(简直垃圾,这能是我写的?),觉得需要改变,这次顺便记录下来,也分享给大家,相当于优化轨迹、版本控制等等,以后还有可能改变,但是最终有迹可循~ 不会麻爪~ application.yml redis: host: 127.0.0.1 port: 6379 password: yourpassword database: 1 # 是否分布式 isSharded: false # 最大连接数 maxTotal: 5000 # 最大空闲连接数 maxIdle: 1000 # 建立连接时,最大等待时间 maxWaitMillis: 60000 # 建立连接时,是否进行有效性检查 testOnBorrow: true JedisPool.java import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans

Redis+Cookie+Jackson+Filter实现单点登陆

℡╲_俬逩灬. 提交于 2019-12-16 01:28:29
一、redis连接池的构建 第一步:打开pom.xml,依赖添加如下: <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> 第二步:在公共包里面创建一个连接池的类RedisPool,如下: package com.mmall.common; import com.mmall.util.PropertiesUtil; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class RedisPool<main> { //使用静态属性,表示加载这个类的时候就把属性加载了 //用配置文件实现动态获取 private static JedisPool pool;//jedis连接池 private static Integer maxTotal= Integer.parseInt(PropertiesUtil.getProperty("redis.max.total","20"));//最大连接数 private

SpringBoot学习 自定义Starter(十一)

别说谁变了你拦得住时间么 提交于 2019-12-14 22:22:12
在学习SpringBoot的过程中,不管是集成redis还是RabbitMQ,甚至是前面集成mybatis已经学习了很多starter,这些starter都是springboot为我们提供的一些封装,这些starter能非常方便快捷的增加功能,并不需要很多配置,即使需要配置也就在application.properties稍微配置下就可以了。 那么接下来就学习下怎么创建属于自己的starter redis-starter插件 前面已经使用过spring-boot-starter-data-redis,这个starter是用来集成redis的,那么接下来完成一个starter,这个starter也就集成下redis 新建一个项目,这个项目不需要web功能 pom文件如下: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4

征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)

末鹿安然 提交于 2019-12-13 21:48:04
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一、预期 接上一篇,扩充User属性: Java代码 public class User implements Serializable { private static final long serialVersionUID = -1267719235225203410L; private String uid; private String address; private String mobile; private String postCode; } 我期望的是: redis 127.0.0.1:6379> hmget uc.user.info.uid.u123456 address mobile postCode 1) "\xe4\xb8\x8a\xe6\xb5\xb7" 2) "13800138000" 3) "100859" 几乎就是一个对象了! 但是,接下来的代码实现,让我彻底崩溃了! 二、代码实现 1.保存——HMSET Java代码 @Override public void save( final User user) { redisTemplate.execute( new RedisCallback<Object>() { @Override public Object

ERR EXEC without MULTI - Jedis

懵懂的女人 提交于 2019-12-13 20:16:13
问题 I'm learning jedis, I couldn't exactly find out what is the problem in this code. Can anyone help me.The exception occurs at the statement tx.exec() public class JedisFactory { public static void main (String [] args){ JedisPool pool = new JedisPool(new JedisPoolConfig(), "127.0.0.1", 6379); Jedis jedis = pool.getResource(); Pipeline pipeline = jedis.pipelined(); for(int i=0; i < 1000 ; i++){ pipeline.hincrBy("Id", i+"", i); } pipeline.exec(); pool.returnResource(jedis); jedis = pool