jedis

jedis实现分布式锁

自作多情 提交于 2020-03-07 14:15:00
jedis分布式锁实现的4个要点 1.互斥性。在任意时刻,只有一个客户端能持有锁。 2.不会发生死锁。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 3.具有容错性。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 4.解铃还须系铃人。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 代码的实现 //加锁 public class RedisTool { private static final String LOCK_SUCCESS = "OK" ; private static final String SET_IF_NOT_EXIST = "NX" ; private static final String SET_WITH_EXPIRE_TIME = "PX" ; /** * 尝试获取分布式锁 * @param jedis Redis客户端 * @param lockKey 锁 * @param requestId 请求标识 * @param expireTime 超期时间 * @return 是否获取成功 */ public static boolean tryGetDistributedLock ( Jedis jedis , String lockKey , String requestId , int

Redis管道之Java与Go代码示例

半城伤御伤魂 提交于 2020-03-06 22:23:34
最近读了Redis官网一篇关于使用管道加速Redis查询 的文章,原文: Using pipelining to speedup Redis queries ,中文翻译可参考: 管道(Pipelining) 一个请求/响应服务器能处理新的请求即使客户端还未读取旧的响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。 管道不仅仅是为了减少往返时间(Round Trip Time,简称RTT)引起的延迟成本,它实际上大大提高了给定 Redis 服务器中每秒可执行的操作总量。 这是因为在不使用管道的情况下,从访问数据结构和生成应答的角度来看,为每个命令提供服务非常廉价,但从执行套接字I/O的角度来看,这是非常昂贵的。 这涉及到调用 read() 和 write()系统调用,这意味着从用户区到内核区。 上下文切换是一个巨大的速度损失。 原文给的代码示例是基于ruby语言,下面我分别展示Java语言和Go语言的Redis管道示例。 Redis管道Java示例 语言版本是: JDK:13.0.2 Redis客户端:Jedis 3.2.0 pom.xml(Maven包依赖) <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.2.0<

redis面试题

懵懂的女人 提交于 2020-03-05 00:53:06
什么是redis? Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-value数据库。 Redis的数据类型? Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 Redis相比Memcached有哪些优势? (1) Memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 (2) Redis的速度比Memcached快很多 (3) Redis可以持久化其数据 Redis是单进程单线程的? Redis是单进程单线程的,redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。 一个字符串类型的值能存储最大容量是多少? 512M MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据? redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。 Redis 有哪几种数据淘汰策略? volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰 volatile-ttl:从已设置过期时间的数据集(server.db[i].expires

maven 命令备忘

邮差的信 提交于 2020-03-02 09:03:08
maven编译缺少依赖,本地安装依赖: mvn install:install-file -DgroupId=redis.clients -DartifactId=jedis -Dversion=2.6.3 -Dpackaging=jar -Dfile=./lib/jedis-2.6.3.jar 报错信息通常为 Could not resolve dependencies for project 。。。 Could not find artifacf 如果是因为pom文件未指定依赖,报错通常为: error: package xxx类 does not exist 来源: oschina 链接: https://my.oschina.net/u/1428530/blog/536115

redis常用命令

一世执手 提交于 2020-03-02 08:27:39
1.1 Redis命令 ps -ef |grep redis 指定端口:bind 127.0.0.1 我们要注释掉,让所有端口都能进入。 1.1.1 redis-cli的使用之发送命令 默认连接:IP 127.0.0.1 端口 6379 redis-cli 指定IP端口: redis-cli –h 127.0.0.1 –p 6379 1.1.2 redis-cli的使用之命令返回值 状态回复(最简单的回复-redis提供的测试命令) redis>PING PONG 127.0.0.1:6379>INCR test_incr (integer) 1 字符串回复(最长久的一种回复,双引号包裹) 127.0.0.1:6379>get test “123” 多行字符串回复 127.0.0.1:6379>KEYS * 1) "test_incr" 2) "test" 1.1.3 redis数据库切换SELECT redis默认支持16个数据库,对外都是以一个从0开始的递增数字命名,可以通过参数database来修改默认数据库个数。客户端连接redis服务后会自动选择0号数据库,可以通过select命令更换数据库,例如选择1号数据库: 127.0.0.1:6379>SELECT 1 OK 127.0.0.1:6379>GET test (nil) 说明: Redis不支持自定义数据库名称。

如何基于Redis实现分布式锁?

天涯浪子 提交于 2020-03-02 05:44:09
选用Redis实现分布式锁原因 Redis有很高的性能 Redis命令对此支持较好,实现起来比较方便 使用命令介绍 SETNX SETNX key val 当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。 expire expire key timeout 为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。 delete delete key 删除key 在使用Redis实现分布式锁的时候,主要就会使用到这三个命令。 实现 使用的是jedis来连接Redis。 实现思想 获取锁的时候,使用setnx加锁,并使用expire命令为锁添加一个超时时间,超过该时间则自动释放锁,锁的value值为一个随机生成的UUID,通过此在释放锁的时候进行判断。 获取锁的时候还设置一个获取的超时时间,若超过这个时间则放弃获取锁。 释放锁的时候,通过UUID判断是不是该锁,若是该锁,则执行delete进行锁释放。 分布式锁的核心代码如下: import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.Transaction; import redis.clients.jedis

Redis分布式锁的实现(Jedis和Redisson两个方案)

做~自己de王妃 提交于 2020-03-02 00:56:20
应用场景 分布式锁主要用于解决,公司中不同业务系统对同一功能的数据产生脏读或重复插入。 比如公司现有三个小组分别开发WAP站、小程序、APP客户端,而这三个系统都存在领红包功能。 业务要求每人每日只能领取一个红包,如果有人同时登陆三个系统那么就能够同一时间领取到三个红包。 分布式锁的要求 分布式锁要满足以下基本要求: 共享锁。 多系统能够共享同一个锁机制。 互斥性。 在任意时刻,只有一个请求能持有锁。 无死锁。 在程序崩溃时能够,自动释放锁。 持有者解锁。 锁只能被加锁的请求解锁,其他请求无法解锁。 Jedis实现分布式锁 本例参考了博文:https://wudashan.cn/2017/10/23/Redis-Distributed-Lock-Implement/ 例子已上传码云:https://gitee.com/imlichao/jedis-distributed-lock-example 添加依赖 本例使用spring boot提供的redis实现,并没有直接引入jedis依赖。这样做的好处是,可以在项目中同时使用Jedis和RedisTemplate实例。 pom.xml文件 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis<

分享30道Redis面试题,面试官能问到的我都找到了

情到浓时终转凉″ 提交于 2020-03-01 12:40:41
1、什么是Redis?简述它的优缺点? Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。 因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能。 比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。 另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 2、Redis相比memcached有哪些优势? (1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 (2) redis的速度比memcached快很多 (3) redis可以持久化其数据 3

Spring中static变量不能@value注入的原因

牧云@^-^@ 提交于 2020-02-29 17:05:33
今天本想使用@Value的方式使类中的变量获得yml文件中的配置值,然而一直失败,获得的一直为null。 类似于这样写的。 public class RedisShardedPool { private static ShardedJedisPool pool;//sharded jedis连接池 @Value("redis.max.total") private static Integer maxTotal; …… } 后来发现是因为这个变量是static的,而spring不支持依赖注入值到静态变量。 然后看到有人通过setter注入实现,如下 @Component public class TestValue { public static String maxTotal; @Value("${redis.max.total}") public void setDatabase(String maxTotal) { TestValue.maxTotal= maxTotal; } } 于是我也改成这种样子的,但是还是获得不到值,因为我没在类上加@Component注解(或者类似的注解),所以spring扫描不到,也就识别不出,@Value还是会得到null。由于我这个是工具类,里面都是static方法,调用时也都是调用类方法,所以也不需要申明为component,也不需要通过

redis cluster jedis client 示例

霸气de小男生 提交于 2020-02-28 15:57:51
redis cluster 基本的redis操作示例: JedisCluster jc = null; @Before public void before(){ Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>(); //Jedis Cluster will attempt to discover cluster nodes automatically jedisClusterNodes.add(new HostAndPort("127.0.0.1", 7000)); jc = new JedisCluster(jedisClusterNodes); } @Test public void test_incr(){ String key = "page_view"; jc.del(key); jc.incr(key); String result = jc.get(key); System.out.println(result); Assertions.assertThat(result).isEqualTo(1+""); } @Test public void test_setAndGetStringVal(){ String key = "foo"; String value = "bar"; jc