jedis

springBoot集成Redis遇到的坑(择库)源码分析为什么择库失败

僤鯓⒐⒋嵵緔 提交于 2020-05-03 20:41:27
提示: springboot提供了一套链接redis的api,也就是个jar包,用到的连接类叫做LettuceConnectionConfiguration,所以我们引入pom时是这样的 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 如果你想使用其他链接redis的api,最常用的基本上就是Jedis的JedisConnectionFactory那么你就需要引入jedis,然后exclusions掉springboot提供做Lettuce: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <exclusions> <exclusion> <groupId>io.lettuce</groupId> <artifactId>lettuce-core</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId

延时任务解决方案 — 转

大城市里の小女人 提交于 2020-05-01 11:59:15
在开发中,往往会遇到一些关于延时任务的需求。例如 生成订单30分钟未支付,则自动取消 生成订单60秒后,给用户发短信 对上述的任务,我们给一个专业的名字来形容,那就是 延时任务 。那么这里就会产生一个问题,这个 延时任务 和 定时任务 的区别究竟在哪里呢?一共有如下几点区别 定时任务有明确的触发时间,延时任务没有 定时任务有执行周期,而延时任务在某事件触发后一段时间内执行,没有执行周期 定时任务一般执行的是批处理操作是多个任务,而延时任务一般是单个任务 下面,我们以判断订单是否超时为例,进行方案分析 定时任务扫库 思路   该方案通常是在小型项目中使用,即通过一个线程定时的去扫描数据库,通过订单时间来判断是否有超时的订单,然后进行update或delete等操作 例子实现: 使用 quartz 来实现 < dependency > < groupId > org.quartz-scheduler </ groupId > < artifactId > quartz </ artifactId > < version > 2.2.2 </ version > </ dependency > import org.quartz.Job; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org

SpringBoot使用Redis 数据访问解决方案(连接池、Pipleline及分布式)

笑着哭i 提交于 2020-04-30 12:46:11
Redis操作是单线程的,使用连接池可以减少连接的创建,redis连接池有两种方式:Jedis(JedisPool) 和 Lettuce(LettucePool)。 Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server。在Lettuce和Jedis之外还有Redission ,Redisson:实现了分布式和可扩展的Java数据结构。 Redis 客户端Jedis和Lettuce的区别 Jedis Jedis在实现上是直接连接的Redis Server,如果在多线程环境下是非线程安全的。每个线程都去拿自己的 Jedis 实例,当连接数量增多时,资源消耗阶梯式增大,连接成本就较高了。这个时候只有使用连接池,为每个Jedis实例增加物理连接。 Lettuce Lettuce的连接是基于Netty的,Netty 是一个多线程、事件驱动的 I/O 框架。连接实例可以在多个线程间共享,当多线程使用同一连接实例时,是线程安全的。Lettuce连接实例(StatefulRedisConnection)可以在多个线程间并发访问,应为StatefulRedisConnection是线程安全的,所以一个连接实例(StatefulRedisConnection)就可以满足多线程环境下的并发访问,当然这个也是可伸缩的设计

分布式-技术专区-Redis并发竞争key的解决方案详解

丶灬走出姿态 提交于 2020-04-29 16:27:38
  Redis缓存的高性能有目共睹,应用的场景也是非常广泛,但是在高并发的场景下,也会出现问题:缓存击穿、缓存雪崩、缓存和数据一致性,以及今天要谈到的缓存并发竞争。这里的并发指的是多个redis的client同时set key引起的并发问题。 出现并发设置Key的原因   Redis是一种单线程机制的nosql数据库,基于key-value,数据可持久化落盘。由于单线程所以Redis本身并没有锁的概念,多个客户端连接并不存在竞争关系,但是利用jedis等客户端对Redis进行并发访问时会出现问题。   比如:同时有多个子系统去set一个key。这个时候要注意什么呢? 举一个例子   多客户端同时并发写一个key,一个key的值是1,本来按顺序修改为2,3,4,最后是4,但是顺序变成了4,3,2,最后变成了2。 如何解决redis的并发竞争key问题呢? 第一种方案:分布式锁+时间戳 1.整体技术方案 这种情况,主要是准备一个分布式锁,大家去抢锁,抢到锁就做set操作。 加锁的目的实际上就是把并行读写改成串行读写的方式,从而来避免资源竞争。 2.Redis分布式锁的实现 主要用到的redis函数是setnx() 用SETNX实现分布式锁 利用SETNX非常简单地实现分布式锁。例如:某客户端要获得一个名字youzhi的锁,客户端使用下面的命令进行获取: SETNX lock

菜鸟刷面试题(三、Redis篇)

廉价感情. 提交于 2020-04-28 23:18:34
目录: redis是什么?都有哪些使用场景? redis有哪些功能? redis和memecache有什么区别? redis为什么是单线程的? 什么是缓存穿透?怎么解决? redis支持的数据类型有哪些? redis支持的java客户端都有哪些? jedis和 redisson 有哪些区别? 怎么保证缓存和数据库数据的一致性? redis持久化有几种方式? redis怎么实现分布式锁? redis分布式锁有什么缺陷? redis如何做内存优化? redis淘汰策略有哪些? redis是什么?都有哪些使用场景? 1、Redis是一款开源的、基于C语言编写的key value数据库,其数据读写基于内存,性能高。 2、Redis使用场景很多: 可作用于底层DB的缓存层 分布式锁 使用list做热点数据排行 GEO做地理位置统计 等等。。。。。。 redis有哪些功能? 数据持久化、事务、发布订阅消息、主从复制、集群、哨兵等等。 redis和memecache有什么区别? memecache目前 仅支持k/v类型 的数据存储,而redis支持的 存储方式更加丰富 。 memecache 挂掉了数据就没了 ,redis有 持久化 策略。 。。。。。。 redis为什么是单线程的? 我们首先要知道Redis是一个高效的key/value数据库,且 采用内存读写数据 。 那么既然是

【面试突击】-Redis常见面试题(二)

别来无恙 提交于 2020-04-28 23:18:19
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

来了解一下Redis的分布式锁

不想你离开。 提交于 2020-04-27 22:37:30
分布式锁本质上要实现的目标就是在 Redis 里面占一个“茅坑”,当别的进程也要来占 时,发现已经有人蹲在那里了,就只好放弃或者稍后再试。 占坑一般是使用 setnx(set if not exists) 指令,只允许被一个客户端占坑。先来先占, 用 完了,再调用 del 指令释放茅坑。 // 这里的冒号:就是一个普通的字符,没特别含义,它可以是任意其它字符,不要误解 > setnx lock :codehole true OK ... do something critical ... > del lock :codehole (integer) 1 但是有个问题,如果逻辑执行到中间出现异常了,可能会导致 del 指令没有被调用,这样 就会陷入死锁,锁永远得不到释放。 于是我们在拿到锁之后,再给锁加上一个过期时间,比如 5s,这样即使中间出现异常也 可以保证 5 秒之后锁会自动释放。 > setnx lock :codehole true OK > expire lock :codehole 5 ... do something critical ... > del lock :codehole (integer) 1 但是以上逻辑还有问题。如果在 setnx 和 expire 之间服务器进程突然挂掉了,可能是因 为机器掉电或者是被人为杀掉的,就会导致 expire 得不到执行

那些年踩过的坑之Redis报错:All sentinels down, cannot determine where is mymaster master is running...

痞子三分冷 提交于 2020-04-26 22:38:14
1. 异常信息: All sentinels down, cannot determine where is mymaster master is running... 通过测试:    @Test public void testSentinel(){ HashSet <String> sentinels = new HashSet<> (); sentinels.add( "192.168.72.129:26379" ); JedisSentinelPool pool = new JedisSentinelPool("mymaster" , sentinels); Jedis jedis = pool.getResource(); jedis.set( "hello", "world" ); System.out.println(jedis.get( "hello" )); } 报出错误: 警告: Cannot get master address from sentinel running @ 192.168.72.129:26379. Reason: redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host 192.168.72.129:26379. Trying

分布式锁的三种实现方式

為{幸葍}努か 提交于 2020-04-26 14:07:19
分布式锁三种实现方式: 1. 基于数据库实现分布式锁; 2. 基于缓存(Redis等)实现分布式锁; 3. 基于Zookeeper实现分布式锁; 一, 基于数据库实现分布式锁 1. 悲观锁 利用select … where … for update 排他锁 注意: 其他附加功能与实现一基本一致,这里需要注意的是“where name=lock ”,name字段必须要走索引,否则会锁表。有些情况下,比如表不大,mysql优化器会不走这个索引,导致锁表问题。 2. 乐观锁 所谓乐观锁与前边最大区别在于基于CAS思想,是不具有互斥性,不会产生锁等待而消耗资源,操作过程中认为不存在并发冲突,只有update version失败后才能觉察到。我们的抢购、秒杀就是用了这种实现以防止超卖。 通过增加递增的版本号字段实现乐观锁 二, 基于缓存(Redis等)实现分布式锁 1. 使用命令介绍: (1)SETNX SETNX key val:当且仅当key不存在时,set一个key为val的字符串,返回1;若key存在,则什么都不做,返回0。 (2)expire expire key timeout:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。 (3)delete delete key:删除key 在使用Redis实现分布式锁的时候,主要就会使用到这三个命令。 2

[Redis] 手动搭建标准6节点Redis集群(docker)

老子叫甜甜 提交于 2020-04-25 17:51:27
准备 环境配置 docker redis镜像 # docker 拉取redis镜像 docker pull redis # redis 镜像详情 docker inspect redis redis版本为 5.0.4 docker 集群网络 # 创建属于redis的集群网络 docker network create redis-cluster-net 网关Gateway: 172.18.0.1 集群挂载目录 打算开启6个节点, 3对主从节点搭建集群 开放7000~7005端口, 即根据端口号创建6个目录, 每个目录下建立data目录和配置文件redis-{port}.conf # 主目录 dir_redis_cluster='/home/lingsh/study/redis/redis-cluster' # docker redis集群网关 gateway='172.18.0.1' # 节点地址号 从2开始 idx=1 # 逐个创建各节点目录和配置文件 for port in `seq 7000 7005`; do # 创建存放redis数据路径 mkdir -p ${dir_redis_cluster}/${port}/data; # 通过模板个性化各个节点的配置文件 idx=$(($idx+1)); port=${port} ip=`echo ${gateway} | sed