分布式锁

Redis分布式锁中的问题

假如想象 提交于 2020-01-13 08:11:59
使用 使用 set key value ex 5 nx 命令设置key value 5秒过期 不存在才能设置成功,成功代表获取了分布式锁 随机值 在set时,key为固定,但value对不同线程应不同,如使用线程名。 如果使用的value相同会有什么问题?我们假设固定为 key=lock_key,value=lock_value 假设线程1获取到了分布式锁,超时30秒,但线程1的实际执行实际达到了40秒,在第30秒的时候锁被自动释放,线程2拿到了锁,线程2在继续自己的任务,假设是30秒。十秒后线程1结束,释放了锁,但这时候释放的是线程2设置的锁,从而导致同步出错。 若每个线程对应的value是不同的,在释放锁时只有value相同才会释放。但这个判断删除操作不是原子性的,可以使用lua脚本方式实现 if redis . call ( 'get' , KEYS [ 1 ] ) == ARGV [ 1 ] then return redis . call ( 'del' , KEYS [ 1 ] ) else return 0 end 锁超时 如上面所说的,如果获取锁设置了30秒超时,但实际任务执行时间超过了30秒怎么办? 可以使用守护线程的方式,在第29秒时给key续命10秒,然后十秒后守护线程继续执行。 主线程执行结束守护线程也会跟随销毁 单机故障引发并发问题 对于主从同步的情况

ZooKeeper的分布式锁实现

情到浓时终转凉″ 提交于 2020-01-13 05:48:10
分布式锁一般有三种实现方式: 1. 数据库乐观锁; 2. 基于Redis的分布式锁; 3. 基于ZooKeeper的分布式锁。 本篇博客将介绍第三种方式,基于Zookeeper实现分布式锁。虽然网上已经有各种介绍Zookeeper分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Zookeeper分布式锁。   现在模拟一个使用Zookeeper实现分布式锁,假设有A,B,C三台客户端去访问资源,调用zookeeper获得锁。客户端三个在zookeeper的 /locks节点下创建一个/lock节点,由于节点是唯一性的特性,只有一个人会创建成功,其余两个创建失败,会进入监听/locks节点的变化,如果/locks下子节点/lock节点发生变化,其余两个可以去拿锁,这样是否好呢? 这样子会导致惊群效应。就是一个触发使得在短时间呢会触发大量的watcher事件,但是只有一个客户端能拿到锁。所以这种方式不建议。   有一种比较好的方法就是利用 zookeeper 的有序节点的特性,基本思路: 1、在获取分布式锁的时候在locker节点下创建临时顺序节点,释放锁的时候删除该临时节点。 2、客户端调用createNode方法在locks下创建临时顺序节点,然后调用getChildren(“locks”)来获取locks下面的所有子节点

redis的特点以及搭建

杀马特。学长 韩版系。学妹 提交于 2020-01-13 04:09:12
Redis介绍 为了更好的了解Redis,我们不妨从以下几点来分析Redis: Redis是什么,有什么特点 我们使用Redis是为了解决什么样的问题 Redis有哪些特别棒的技术,这些技术又为了解决实际工作中的哪些问题 了解Redis,我们怎么去使用Redis,需要get哪些知识技能点 运用Redis来搭建高可用的环境 Redis是什么,有什么特点 官方的解释:Redis是使用C语言编写,支持网络、内存,亦可持久化的日志型、key-value数据库; 首先明确一点,Redis是一个数据库,不同于我们熟悉的关系型数据:Oracle和Mysql等; Redis是基于内存的key-value数据库。Redis跟Memcached比较像,不同的是Redis的value支持多种数据结构类型。 Redis有如下一些很棒的优点: Redis支持多种数据类型:String, hash, list, set以及zset(sorted set),这些数据类型能让我们很好的定义不同数据类型来满足我们的业务的需要。 Redis数据库支持事务,所有的操作都是原子性的 内存数据库,速度非常快,使用目前流行的SSD硬盘,性能得到更优 支持将内存中的数据库持久化硬盘上,并且支持在启动的时候恢复数据 Redis支持主从架构(复制) Redis可以配置高可用缓存架构(主备切换) Redis可以搭建分布式集群架构

Java开发连Redis都不会还想年后跳槽?先把Redis的知识点吃透再说

大兔子大兔子 提交于 2020-01-13 03:23:37
写在前面 Redis 是如今互联网技术架构中,使用最广泛的缓存。支持 复杂的数据结构 ,支持 持久化 ,支持 主从集群 ,支持 高可用 ,支持 较大的value存储 ... 同时, Redis 也是中高级后端工程师技术面试中,面试官最喜欢问的问题之一。特别是那些优秀的、竞争激烈的大型互联网公司(比如 Twitter、新浪微博、阿里云、腾讯云、淘宝、知乎等),通常要求面试者不仅仅掌握 Redis 基础使用,更要求深层理解 Redis 内部实现的细节原理。毫不夸张地说,能把 Redis 的知识点全部吃透,你的半只脚就已经踏进心仪大公司的技术研发部。 然而,绝大部分开发者只会拿 Redis 做数据缓存,使用最简单的 get/set 方法,除此之外几乎一片茫然,对 Redis 内部实现的细节原理知之甚少。例如: 有同学知道 Redis 的分布式锁,但完全不清楚其内部实现机制 有同学知道 Redis 是单线程结构,但完全不理解 Redis 缘何单线程还可以支持高并发 有同学知道 Redis 支持主从,但完全不晓得内部的实现机制 于是,一位有着十年经验的互联网分布式高并发技术老兵,梳理自己多年 Redis 实践经验,写了这本书【Redis深度历险:核心原理与应用实战】,以帮助更多工程师更快,更深入的了解 Redis 。 作者在掌阅维护着上千个 Redis 实例的集群,他在 Redis 持久化

0109 redis数据库的配置与使用

痞子三分冷 提交于 2020-01-12 21:54:15
目录 昨日回顾 Redis 1. Redis简介 1.1 为什么要用 redis /为什么要用缓存 1.2 为什么要用 redis 而不用 map/guava 做缓存? 1.3 redis 和 memcached 的区别 2.Redis内存数据库 2.1 redis介绍 2.2 Redis操作 2.3 Redis数据类型 2.4 python使用redis 3.接口缓存 模式 轮播图接口缓存 4.celery异步服务框架 昨日回顾 1、接口编辑 1)设计数据库 2)分析业务逻辑 3)配置路由层 4)完成视图(简单逻辑,直接在视图中完成,复杂逻辑,交给序列化组件完成) 5)序列化组件(序列化与反序列化字段,是否要(重|自)定义字段,设置局部全局钩子,考虑是否重写create和update方法) 2、django缓存 from django.core.cache import cache (memcache|redis) cache.set(k, v, e) cache.get(k) 3、vue-cookies $cookies = vue-cookies $cookies.set(k, v, e) $cookies.get(k) $cookies.remove(k) -- 前台数据库:cookie、sessionStorage、localStorage 4、前后台交互 $axios(

学习笔记 -redis

巧了我就是萌 提交于 2020-01-12 13:59:32
启动服务 在家目录下: redis-server /opt/myRedis/redis.conf 查看是否启动: ps -ef | grep redis 客户端启动 使用redis-cli 如果有多个Redis同时启动,则需指定端口号访问 redis-cli -p 端口号 测试验证,通过 ping 命令 查看是否 返回 PONG 常用命令 登录 redis-cli -p 5566 -a password 检查key是否存在 EXISTS key 搜索某关键字 KSYS *4 返回一个Key所影响的vsl的类型 TYPE key String 单条操作 增:set key value 查:get key 删:del key 多条操作 增:mset key value [key1 value1] 查:mget key [key1] 扩展操作 1.数字增加减少命令 incr key //自增 1 incrby key num //给key的值增加num(int 类型),num 正数则为加,num 为负数 则为减 incrbyfloat key num //给key的值增加num(float 类型) decr key //自减 1 decrby key num //给key的值减num 按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。 应用:

redis整合springboot的helloworld

蹲街弑〆低调 提交于 2020-01-11 10:08:51
引入依赖 compile 'org.springframework.boot:spring-boot-starter-data-redis' 使用redis有两种方法 1.Jedis Jedis jedis = new Jedis("localhost"); 2.RedisTemplate @Autowired private RedisTemplate redisTemplate; 如果使用RedisTemplate的话,要在application.properties中配置信息,这里我使用Jedis比较简单 redis的自动配置 在application.properties文件下 #redis的springboot的自动配置 # Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=127.0.0.1 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=8 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 #

ZooKeeper 分布式锁实现

一个人想着一个人 提交于 2020-01-11 05:35:59
1 场景描述 在分布式应用, 往往存在多个进程提供同一服务. 这些进程有可能在相同的机器上, 也有可能分布在不同的机器上. 如果这些进程共享了一些资源, 可能就需要分布式锁来锁定对这些资源的访问 。 2 思路 进程需要访问共享数据时, 就在"/locks"节点下创建一个sequence类型的子节点, 称为thisPath . 当thisPath在所有子节点中最小时, 说明该进程获得了锁. 进程获得锁之后, 就可以访问共享资源了. 访问完成后, 需要将thisPath删除. 锁由新的最小的子节点获得. 有了清晰的思路之后, 还需要补充一些细节. 进程如何知道thisPath是所有子节点中最小的呢? 可以在创建的时候, 通过getChildren方法获取子节点列表, 然后在列表中找到排名比thisPath前1位的节点, 称为waitPath, 然后在waitPath上注册监听, 当waitPath被删除后, 进程获得通知, 此时说明该进程获得了锁. 3 算法 lock操作过程: 首先为一个lock场景,在zookeeper中指定对应的一个根节点,用于记录资源竞争的内容; 每个lock创建后,会lazy在zookeeper中创建一个node节点,表明对应的资源竞争标识。 (小技巧: node节点为EPHEMERAL_SEQUENTIAL,自增长的临时节点 ); 进行lock操作时

redis笔记

試著忘記壹切 提交于 2020-01-11 01:10:49
redis笔记 redis 是什么? 能干嘛? 去哪下? 怎么玩? redis的安装 redis设置外网访问 redis数据类型及api操作(http://redisdoc.com/) key 1.string 2.list 3.set 4.hash 5.zset redis的持久化机制 1.RDB 是什么? 1.这个持久化文件在哪里 2.他什么时候fork子进程,或者什么时候触发rdb持久化机制 2.aof(--fix) ls -l --block-size=M 是什么? 1.这个持久化文件在哪里 2.触发机制(根据配置文件配置项) 3.aof重写机制 4.redis4.0后混合持久化机制 开启混合持久化 小总结: 1.redis提供了rdb持久化方案,为什么还要aof? 2.如果aof和rdb同时存在,听谁的? 3.rdb和aof优势劣势 性能建议(这里只针对单机版redis持久化做性能建议): redis集群专题 Redis主从复制 1.是什么 2.能干嘛 3.怎么玩 4.全量复制消耗 5.缺点 redis哨兵模式 1.是什么,能干嘛? 2.哨兵主要功能(做了哪些事) 3.架构 4.怎么玩(实战)? 1.部署主从节点 2.部署哨兵节点 哨兵节点的启动有两种方式,二者作用是完全相同的: 5.故障转移演示(哨兵的监控和自动故障转移功能) 6.客户端(jedis)访问哨兵系统

(77)一文了解Redis

这一生的挚爱 提交于 2020-01-10 03:24:36
为什么我们做分布式使用Redis? 绝大部分写业务的程序员,在实际开发中使用 Redis 的时候,只会 Set Value 和 Get Value 两个操作,对 Redis 整体缺乏一个认知。这里对 Redis 常见问题做一个总结,解决大家的知识盲点。 1、 为什么使用 Redis 在项目中使用 Redis,主要考虑两个角度:性能和并发。 如果只是为了分布式锁这些其他功能,还有其他中间件 Zookpeer 等代替,并非一定要使用 Redis。 性能: 如下图所示,我们在碰到需要执行耗时特别久,且结果不频繁变动的 SQL,就特别适合将运行结果放入缓存。这样,后面的请求就去缓存中读取,使得请求能够迅速响应。 特别是在秒杀系统,在同一时间,几乎所有人都在点,都在下单。。。执行的是同一操作———向数据库查数据。 根据交互效果的不同,响应时间没有固定标准。在理想状态下,我们的页面跳转需要在瞬间解决,对于页内操作则需要在刹那间解决。 并发: 如下图所示,在大并发的情况下,所有的请求直接访问数据库,数据库会出现连接异常。这个时候,就需要使用 Redis 做一个缓冲操作,让请求先访问到 Redis,而不是直接访问数据库。 使用 Redis 的常见问题 缓存和数据库双写一致性问题 缓存雪崩问题 缓存击穿问题 缓存的并发竞争问题 2、 单线程的 Redis 为什么这么快 这个问题是对 Redis