redisson

【每日3分钟技术干货 | 面试题+答案 | Redis篇(一)】

巧了我就是萌 提交于 2020-01-06 21:42:01
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> **1. Redis 是什么?** 都有哪些使用场景? 我们先来理解经典的CAP理论 : 一致性:是指从数据层面来看的一致性。 可用性:是指从系统层面的可用性。 容错性:是指从网络层面的的容错性。 数据库逐渐从关系数据库向不同领域不同层次分化。随着读多写少场景的出现,导致需要读取数据的时间变慢,为了提升性能,出现了数据库缓存技术,对数据库的读取进行分离。web2.0时代,网民的生产力大增,存储总量也在增加,目前还是读多写少模式,原有的缓存技术显然不能满足写的压力,所以,出现了分库分表,实现读写分离。其中比较常用的一种缓存技术是用Redis做缓存。 Redis是什么? Redis是一个基于内存且支持持久化的key-value的NoSQL数据库,其中每个key和value都是使用对象表示的,具有以以下特征:多样数据类型、持久化、主从同步。 和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。 在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中

redisson client 介绍及优缺点

删除回忆录丶 提交于 2019-12-30 01:21:53
  由于redisson是2014年1月份才发布的开源项目,对于很多使用redis的用户来说,还是个新东西,关于redisson的文档除了github上边有简单介绍之外,其它网站还没有,所以我基于对源码的理解还有github介绍,简单介绍下redisson。   redisson实现了分布式和可扩展的java数据结构,支持的数据结构有:List, Set, Map, Queue, SortedSet, ConcureentMap, Lock, AtomicLong, CountDownLatch。并且是线程安全的,底层使用Netty 4实现网络通信。和jedis相比,功能比较简单,不支持排序,事务,管道,分区等redis特性,可以认为是jedis的补充,不能替换jedis。 优点: 1.可以使用熟悉的java数据结构,比如要往List中存储1,2,3,4,代码是这样的: List<Integer> list = redisson.getList("list"); list.add(1); list.add(2); list.add(3); list.add(4); 2.支持存储pojo对象,比如要存储一个TestObject,代码是这样的: List<TestObject> list = redisson.getList("list"); list.add(new

Redis之上的分布式Java队列

我的梦境 提交于 2019-12-29 00:19:21
通过优锐课的java架构学习分享中,讨论了让我们使用Redisson Java框架讨论六种不同类型的基于Redis的分布式队列。 在Redis中使用队列 Redis是一个功能强大的工具,支持从字符串和列表到映射和流的许多不同类型的数据结构。 开发人员将Redis用于多种目的,包括用于数据库,缓存和消息代理。 像任何消息代理一样,Redis需要以正确的顺序发送消息。 可以根据消息的年龄或某些其他预定义的优先级等级发送消息。 为了存储这些未决消息,Redis开发人员需要队列数据结构。 Redisson是使用Redis和Java进行分布式编程的框架,它提供了许多分布式数据结构(包括队列)的实现。 Redisson通过提供Java API使Redis开发更加容易。 Redisson不需要开发人员学习Redis命令,而是包括所有众所周知的Java接口,例如Queue和BlockingQueue。 Redisson还处理Redis中繁琐的幕后工作,例如连接管理,故障转移处理和数据序列化。 基于Redis的分布式Java队列 Redisson提供了Java中基本队列数据结构的多个基于Redis的实现,每种实现都有不同的功能。 这使你可以选择最适合你目的的队列类型。 下面,我们将使用Redisson Java框架讨论六种不同类型的基于Redis的分布式队列。 队列

使用Redis的分布式Java锁

こ雲淡風輕ζ 提交于 2019-12-29 00:11:20
通过优锐课的java学习分享中,了解有关分布式锁定以及如何在项目中实现它的更多信息! 什么是分布式锁定? 在多线程程序中,不同的线程可能需要访问相同的资源。但是,允许所有线程同时访问资源可能导致争用情况,错误和其他意外行为。 为了确保没有两个线程可以同时访问同一资源,并确保以可预测的顺序对资源进行操作,程序员使用一种称为锁的机制。每个线程首先获取锁,然后对资源进行操作,最后将锁释放给其他线程。 在Java中,由于多种原因,锁定对象通常比使用同步块更灵活。首先,Lock API可以以不同的方法运行,而同步块完全包含在一个方法中。 另外,如果线程被阻止,则无法访问同步的块。使用Lock,该线程将仅在可用时获取锁。这大大减少了线程等待的时间。另外,当线程正在等待时,可以调用一种方法来中断线程,而当线程正在等待获取同步块时,这是不可能的。 分布式锁定意味着你不仅需要考虑多个线程或进程,还需要考虑在不同计算机上运行的不同客户端。这些单独的服务器必须进行协调,以确保它们中的任何一个在任何给定时间都在使用资源。 基于Redis的分布式Java锁定工具 Redisson框架是用于Java的基于Redis的内存数据网格,可为需要执行分布式锁定的程序员提供多个对象。 下面,我们将讨论每个选项及其之间的区别。 1.锁 RLock接口在Java中实现java.util.concurrent.locks

使用Redisson实现分布式锁,Spring AOP简化之

断了今生、忘了曾经 提交于 2019-12-20 02:59:06
Redisson概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid)。它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, SortedSet, Map, List, Queue, BlockingQueue, Deque, BlockingDeque, Semaphore, Lock, AtomicLong, CountDownLatch, Publish / Subscribe, Bloom filter, Remote service, Spring cache, Executor service, Live Object service, Scheduler service) Redisson提供了使用Redis的最简单和最便捷的方法。Redisson的宗旨是促进使用者对Redis的关注分离(Separation of Concern),从而让使用者能够将精力更集中地放在处理业务逻辑上。 Redisson底层采用的是Netty 框架。支持Redis 2.8以上版本,支持Java1.6+以上版本。 关于Redisson更多详细介绍,可参考 Redssion概述 Redisson提供的分布式锁 可重入锁

Redlock:Redis分布式锁最牛逼的实现

心已入冬 提交于 2019-12-20 00:34:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 普通实现 说道Redis分布式锁大部分人都会想到: setnx+lua ,或者知道 set key value px milliseconds nx 。后一种方式的核心实现命令如下: - 获取锁(unique_value可以是UUID等) SET resource_name unique_value NX PX 30000 - 释放锁(lua脚本中,一定要比较value,防止误解锁) if redis.call("get",KEYS[1]) == ARGV[1] then return redis.call("del",KEYS[1]) else return 0 end 这种实现方式有3大要点(也是面试概率非常高的地方): set命令要用 set key value px milliseconds nx ; value要具有唯一性; 释放锁时要验证value值,不能误解锁; 事实上这类琐最大的缺点就是它加锁时只作用在一个Redis节点上,即使Redis通过sentinel保证高可用,如果这个master节点由于某些原因发生了主从切换,那么就会出现锁丢失的情况: 在Redis的master节点上拿到了锁; 但是这个加锁的key还没有同步到slave节点; master故障,发生故障转移

关于redis-Redisson 锁的手记

≡放荡痞女 提交于 2019-12-18 22:33:47
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 后期出, springboot2 整合redis-此次仅记录redis的坑; 代码: 测试锁的自动释放与延迟间隔 public void t0() throws InterruptedException { String key = "seckill-order-submit-lock-1"; int i= 0; while(true){ i++; System.out.println(i+"--------------------------,每一次的执行都说明获取锁失败"); Boolean flag = RedisLockUtil.tryLock(key,3,2); if(flag){ System.out.println(i+"执行业务逻辑----------------"); System.out.println("获取锁成功, 但故意不释放, 后面的人是否可以获得锁"); Thread.sleep(6000); } } } package org.linlinjava.litemall.db.util; /** * @Description: * @Auther: wuxw * @Date: 2019/12/18 18:10 */ import org.linlinjava.litemall.db

分布式锁之redisson

心已入冬 提交于 2019-12-17 20:12:23
  redisson是redis官网推荐的java语言实现分布式锁的项目。当然,redisson远不止分布式锁,还包括其他一些分布式结构。详情请移步:https://github.com/mrniko/redisson/wiki   redisson支持4种链接redis的方式:    Cluster (集群)    Sentinel servers (哨兵)    Master/Slave servers (主从)    Single server (单机)   下面通过简单的案例使用redisson的lock。   1、RedissonManager类,管理redisson的初始化等操作。 public class RedissonManager { private static final String RAtomicName = "genId_"; private static Config config = new Config(); private static Redisson redisson = null; public static void init(){ try { config.useClusterServers() //这是用的集群server .setScanInterval(2000) //设置集群状态扫描时间

关于“分布式锁”

爷,独闯天下 提交于 2019-12-16 23:27:11
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 为什么需要分布式锁 直接作用是保证同一时刻同一代码不被重复执行, 更深一层目的其实是为了保证“功效性”和“正确性”. 功效性(Efficiency) 即节省计算机资源, 减少不必要的重复执行. 如果只是单纯地保证功效性, 一般可以容忍锁出现失误, 因为不会对执行结果造成影响. 准确性(Correctness) 即程序执行结果不会出现错误, 数据不会出现不一致. 这种场景下, 一般不可容忍锁出现失误. 如何实现分布式锁 可以看到网上有很多民众给出了自己的demo, 但仔细研究发现demo离“工业级”还是有一定差距. 如果要使用分布式锁, 我们最好去参考或直接使用一些比较成熟的框架. 分布式环境下, 实现锁机制, 需要基于一个集中式存储, 比如: mysql(或其他数据库)、redis、zookeeper, 简单对比如下: 中间件 原理 特点 参考框架 mysql InnoDB事务引擎的行级锁 性能差 Quartz redis 原子命令setNX 性能高 单点实现简单 集群实现稍复杂 Redisson zookeeper 临时顺序节点 实现复杂 Curator 来源: oschina 链接: https://my.oschina.net/wangxu3655/blog/3143778

分佈式锁的Redisson实现

丶灬走出姿态 提交于 2019-12-16 11:35:02
Redis 官方推荐使用Redisson实现分布式锁 import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.TimeUnit; import org.redisson.Redisson; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.redisson.config.Config; public class RedissonLockTest { static int fixNum=5; public static void main(String []args) throws InterruptedException { CountDownLatch latch = new CountDownLatch(fixNum); // 默认连接 127.0.0.1:6379 RedissonClient redisson = Redisson.create(); ExecutorService exec =