分布式锁

redis基础一

早过忘川 提交于 2020-02-16 18:25:20
1、redis是什么? Redis是一个高性能的key/value 非关系型的 内存 数据库,基于C语言编写。 1)、单进程、线程的工作机制; 2)、采用Reactor模式,基于事件驱动(文件事件和时间事件),使用I/O的多路复用程序来同时监听多个套接字; 3)、支持主从复制 or 集群; 4)、满足CPA(C:强一致性、P:分区容错、A:高可用)理论中的 CP理论。像zk也是满足CAP中的CP(分布式系统中A和C几乎不能共存)。 2、redis功能 1)、Redis支持数据的持久化,可以把数据保存到磁盘上,重启的时候可以再次加载数据进行使用,也可以数据缓存下来并设置缓存的时间; 2)、支持多种数据类型,String,List,Set,hash,Zset 3)、支持发布/订阅模式(不建议使用,建议使用rabbitMQ、RocketMQ); 4)、服务注册中心(dubbo ,不建议使用,建议使用zk); 5)、支持分布式锁。 3、 linux环境下如何启动redis呢? 启动服务端: 1)、修改配置文件redis.conf; 2)、进入redis安装目录下的bin目录下; 3)、 ./redis-server /path/redis.conf (path为自定义redis.conf文件存放目录); 启动对应的客户端: 1)、进入redis安装目录下的bin目录下; 2)、redis

Redis面试

二次信任 提交于 2020-02-15 05:19:41
原理 Redis数据类型及实现 过期时间实现 跳表 Redis直接操作是什么??? 持久化 事务 Redis为什么这么快 直接操作内存 底层使用C语言并重写了一些C语言数据结构,如String,使得一些API比原生的C要快,如获得String长度 https://www.cnblogs.com/AshOfTime/p/10616044.html 单线程,避免了线程切换的代价 单线程,没有并发问题,避免了锁带来的性能开销 IO多路复用,单线程可以监控多个IO https://zhuanlan.zhihu.com/p/24252862 应用 保证Redis缓存和数据库一致性 路由 单线程 集群 (哈希槽,主从复制,节点选举,MOVE和ASK等等) 主从复制 2.8之前,断线出发全量复制 2.8后,命令传播阶段增量复制 主从节点 从从节点 异步性 如何保证高可用性 分布式锁 来源: https://www.cnblogs.com/AshOfTime/p/10779478.html

Redis使用

僤鯓⒐⒋嵵緔 提交于 2020-02-14 05:53:05
存储用户信息时 方案一:key-value形式存储,key为用户id,value为用户结构信息序列化后的字符串内容 方案二:hash存储,子key为用户id,value为用户结构信息,无需序列化 方案一在存取时需要序列化与反序列化;且key可不唯一,用户id存储可能重复;并发操作时需要将整个对象取回并对修改操作作并发保护。 方案二可防重,且不存在序列化开销,没有并发修改控制问题 TODO 这里有个问题,网上说hash可以避免cas问题,怎么体现的 分布式锁 用于控制并发流程,如多个线程需要频繁对某个数据进行读取和修改引起的并发问题,使用分布式锁可保证原子操作即执行某一过程不会因线程切换而打断。 实现:setnx(set if not exits)一个时间只允许设置一个锁,用完了del指令释放 setnx lockKey true del lockKey 问题一:如果在获得锁后发生事故导致del指令没能执行,那么会引起死锁问题,锁不能被释放,下一个线程永远拿不到 解决一:在获取锁的同时设置一个过期时间expire lockKey seconds,保证发生异常不能主动释放锁也能自动释放 问题二:虽然设置了过期时间保证自动释放锁,但如果在exprie前服务进程挂了,也是会引起死锁的,因为expire和setnx指令不是原子指令不能一起执行 (TODO 不使用Redis事务的原因) 解决二

java详细面试题

时间秒杀一切 提交于 2020-02-13 06:00:23
struts和springMVC区别? stringbuffer和stringbuilder区别? mybatis原理? soa原理? dubbo的原理? solr怎么搭建,倒序索引? MQ消息队列? SQL语句? maven以及本地仓库? final关键字? 为什么使用ssm而不用ssh? struts2和springmvc区别? 开发工具,jvm,gc,设计模式,平时开发工程是你自己搭建吗? 项目中用到的技术dubbo,zookeeper,solr等? 这三年工作中你统计过自己的代码量大概有多少? redis是多例的还是单例的,在多线程时怎么使用? hashmap线程冲突怎么解决? 介绍一下spring,mybatis。aop用的是静态代理还是动态代理? 介绍电商项目,开发周期多长?技术人员有多少?任务怎么分配什么时候上线?项目模块? 说说你负责的模块的具体代码? 数据库表熟悉吗?有哪些字段? 为什么不使用HttpApi进行项目通信而使用dubbo? TCP和UDP的区别? http,https,ftp,sftp分别使用哪个协议? 给你一个mysql数据库,不使用硬件也不使用软件如何优化? SQL语句的执行顺序? 给你两个表写出笛卡尔积的结果? redis的list数据类型是双向队列,完全可替代MQ,为何还要使用MQ,dubbo的底层原理和实现?

Redisson

放肆的年华 提交于 2020-02-12 18:48:01
Redisson 是一种操作redis的框架,类似于jedis,是一个redis客户端,支持分布式锁等,底层用lua脚本实现 Redisson 分布式锁原理: 分布式是锁? 是将同步请求转换为了串行执行,队列里面 redis 主从架构,由于同步问题导致锁失效问题? redis 会将多个节点加锁,比如有5个节点加锁,一般有一半加锁成功才算成功,redis采用RedisLock算法 来源: https://www.cnblogs.com/fanBlog/p/12291248.html

缓存技术-Redis

时光毁灭记忆、已成空白 提交于 2020-02-12 12:29:58
1. Redis的了解 1.1 NoSQL 答:NoSQL(Not Only SQL),泛指非关系型的数据库,目的是解决高并发、高拓展和大数据储存问题。细分为:键值型(Redis),列存储(HBase),文档型(MongoDB),图形(Neo4j)。 1.2 Redis 答:Redis(Remote Dictionary Server远程字典服务)是一款 高性能、高并发 的key-value型分布式内存数据库,基于内存运行且支持 持久化 的NoSQL数据库。常被用于缓存和消息队列。 高性能:用户第一次访问数据后,数据存储在缓存中,之后再访问直接从缓存中获得,相当于直接操作内存。数据库数据改变后,同步改变缓存数据。 高并发:直接操作缓存能承受的请求远大于直接访问数据库,将部分数据放在33 redis中,让用户请求直接到缓存中寻找,不用访问数据库。 1.3 Redis和map区别 答:缓存分为本地缓存和分布式缓存。map是本地缓存,优点是轻量快速,缺点是多实例情况下,每个实例都有一个缓存。Redis是分布式缓存,多实例情况下,每个实例共用一个缓存,具有一致性,缺点是架构复杂。 1.4 Redis和memcached区别 答:主要是四点: Redis有更丰富的类型,memcached只支持String类型; Redis支持数据持久化,将内存数据保存到磁盘,memcached全部存在内存;

Lua语言模型 与 Redis应用

走远了吗. 提交于 2020-02-12 05:48:08
参考:https://blog.csdn.net/zjf280441589/article/details/52716720 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis. 本篇博客主要介绍了 Lua 语言不一样的设计模型(相比于Java/C/C++、JS、PHP), 以及 Redis 对 Lua 的扩展, 最后结合 Lua 与 Redis 实现了一个支持过期时间的分布式锁. 我们希望这篇博客的读者朋友可以在读完这篇文字之后, 体会到 Lua 这门语言不一样的设计哲学 , 以及 更加得心应手的使用/扩展 Redis . 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚本实现 private boolean accessLimit(String ip, int limit, int time, Jedis jedis) { boolean result = true; String key = "rate.limit:" + ip; if (jedis.exists(key)) { long afterValue = jedis.incr(key); if (afterValue > limit) { result = false; } } else { Transaction

Lua 与 Redis

江枫思渺然 提交于 2020-02-12 05:38:45
Lua 与 Redis 标签: Java与NoSQL 从 2.6版本 起, Redis 开始支持 Lua 脚本 让开发者自己扩展 Redis … 案例-实现访问频率限制: 实现访问者 $ip 在一定的时间 $time 内只能访问 $limit 次. 非脚本实现 private boolean accessLimit(String ip, int limit, int time, Jedis jedis) { boolean result = true; String key = "rate.limit:" + ip; if (jedis.exists(key)) { long afterValue = jedis.incr(key); if (afterValue > limit) { result = false; } } else { Transaction transaction = jedis.multi(); transaction.incr(key); transaction.expire(key, time); transaction.exec(); } return result; } 以上代码有两点缺陷 可能会出现竞态条件: 解决方法是用 WATCH 监控 rate.limit:$IP 的变动, 但较为麻烦; 以上代码在不使用 pipeline

分布式锁

懵懂的女人 提交于 2020-02-10 18:29:04
https://www.cnblogs.com/austinspark-jessylu/p/8043726.html 分布式锁的几种实现方式 目前几乎很多大型网站及应用都是分布式部署的,分布式场景中的数据一致性问题一直是一个比较重要的话题。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多系统在设计之初就要对这三者做出取舍。在互联网领域的绝大多数的场景中,都需要牺牲强一致性来换取系统的高可用性,系统往往只需要保证“最终一致性”,只要这个最终时间是在用户可以接受的范围内即可。 在很多场景中,我们为了保证数据的最终一致性,需要很多的技术方案来支持,比如分布式事务、分布式锁等。有的时候,我们需要保证一个方法在同一时间内只能被同一个线程执行。在单机环境中,Java中其实提供了很多并发处理相关的API,但是这些API在分布式场景中就无能为力了。也就是说单纯的Java Api并不能提供分布式锁的能力。所以针对分布式锁的实现目前有多种方案。 针对分布式锁的实现,目前比较常用的有以下几种方案: 基于数据库实现分布式锁 基于缓存(redis,memcached,tair)实现分布式锁 基于Zookeeper实现分布式锁

redis分布式锁递进方案

爱⌒轻易说出口 提交于 2020-02-09 23:26:37
什么是分布式锁 在学习Java多线程编程的时候,锁是一个很重要也很基础的概念,锁可以看成是多线程情况下访问共享资源的一种线程同步机制。这是对于单进程应用而言的,即所有线程都在同一个JVM进程里的时候,使用Java语言提供的锁机制可以起到对共享资源进行同步的作用。如果分布式环境下多个不同线程需要对共享资源进行同步,那么用Java的锁机制就无法实现了,这个时候就必须借助分布式锁来解决分布式环境下共享资源的同步问题。分布式锁有很多种解决方案,今天我们要讲的是怎么使用缓存数据库Redis来实现分布式锁。 Redis分布式锁方案一 使用Redis实现分布式锁最简单的方案是在获取锁之前先查询一下以该锁为key对应的value存不存在,如果存在,则说明该锁被其他客户端获取了,否则的话就尝试获取锁,获取锁的方法很简单,只要以该锁为key,设置一个随机的值就行了。比如,我们有一批任务需要由多个分布式线程处理,每个任务都有一个taskId,为了保证每个任务只被执行一次,在工作线程执行任务之前,先获取该任务的锁,锁的key可以为taskId。因此,获取锁的过程可以用如下伪代码实现: 上述就是最简单的获取锁的方案了,但是大家可以想想这个方案有什么问题呢?有没有什么潜在的坑?在分析这种方案的优缺点之前,先说一下获取锁后我们一般是怎么使用锁,并且又是如何释放锁的,以Java语言为例