redis分布式锁

【Redis】1. redission分布式锁

ε祈祈猫儿з 提交于 2020-04-07 21:48:18
模拟扣库存服务,不加任何锁: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> package com.hknetty.redis; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class IndexContrpller { @Autowired private StringRedisTemplate stringRedisTemplate; @GetMapping("/deduct_stock") public String deductStock() { //商品ID String

Redis 系列 -- SpringBoot中 基于 Redis 实现分布式锁

非 Y 不嫁゛ 提交于 2020-04-06 19:01:11
分布式锁应用场景 锁的应用常出现在一些多线程、高并发的场景中,如秒杀、抢购、12306抢票,还有一些商品库存管理等。在一般的单体应用中,我们通常使用 synchronized、ReentrantLock 等来进行共享变量的管理,从而实现线程锁功能。但随着互联网发展、用户的剧增,单体应用已无法满足需求,多服务器部署、分布式应用越来越被广泛使用。但问题也出现了,对于之前的基于本地变量锁的形式,在不同服务器间无法共享。所以分布式锁应运而生,如基于中间件 redis 、zookeeper等实现的分布式锁。 为什么使用redis 分布式锁 1、redis 读写快 与mysql等传统数据库进行内存、磁盘I\O 流操作过程相比,redis 基于内存操作和I\O多路复用具有更快的读写效率。 2、redis 单线程 操作简单 基于单线程设计,所以redis在处理一些并发问题上具有天生的优势。 使用命令 SETNX命令 SETNX key value 当且仅当 key 不存在,将 key 的值设为 value ,并返回1;若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。 GETSET命令 GETSET key value 将给定 key 的值设为 value ,并返回 key 的旧值 (old value),当 key 存在但不是字符串类型时,返回一个错误,当key不存在时

关于Redis RedLock算法的争论

我怕爱的太早我们不能终老 提交于 2020-04-06 11:44:38
内容简介:Martin上来就问,我们要锁来干啥呢?2个原因:对于第1种原因,我们对锁是有一定宽容度的,就算发生了两个节点同时工作,对系统的影响也仅仅是多付出了一些计算的成本,没什么额外的影响。这个时候 使用对于第2种原因,对正确性严格要求的场景(比如订单,或者消费),就算使用了 RedLock 算法仍然 Martin上来就问,我们要锁来干啥呢?2个原因: 提升效率,用锁来保证一个任务没有必要被执行两次。比如(很昂贵的计算) 保证正确,使用锁来保证任务按照正常的步骤执行,防止两个节点同时操作一份数据,造成文件冲突,数据丢失。 对于第1种原因,我们对锁是有一定宽容度的,就算发生了两个节点同时工作,对系统的影响也仅仅是多付出了一些计算的成本,没什么额外的影响。这个时候 使用 单点的 Redis 就能很好的解决问题,没有必要使用RedLock,维护那么多的 Redis 实例,提升系统的维护成本。 对于第2种原因,对正确性严格要求的场景(比如订单,或者消费),就算使用了 RedLock 算法仍然 不能保证锁的正确性 。 我们分析一下 RedLock 的有啥缺陷吧: 作者 Martin 给出这张图,首先我们上一讲说过,RedLock中,为了防止死锁,锁是具有过期时间的。这个过期时间被 Martin 抓住了小辫子。 如果 Client 1 在持有锁的时候,发生了一次很长时间的 FGC

Spring优雅整合Redis缓存

99封情书 提交于 2020-04-06 06:06:00
“小明,多系统的session共享,怎么处理?”“Redis缓存啊!” “小明,我想实现一个简单的消息队列?”“Redis缓存啊!” “小明,分布式锁这玩意有什么方案?”“Redis缓存啊!” “小明,公司系统响应如蜗牛,咋整?”“Redis缓存啊!” 本着研究的精神,我们来分析下小明的第四个问题。 准备: Idea2019.03/Gradle6.0.1/Maven3.6.3/JDK11.0.4/Lombok0.28/SpringBoot2.2.4RELEASE/mybatisPlus3.3.0/Soul2.1.2/ Dubbo2.7.5/Druid1.2.21/Zookeeper3.5.5/Mysql8.0.11/Vue2.5/Redis3.2 难度:新手-- 战士 --老兵--大师 目标: Spring优雅整合Redis做数据库缓存 步骤: 为了遇见各种问题,同时保持时效性,我尽量使用最新的软件版本。源码地址: https://github.com/xiexiaobiao/vehicle-shop-admin 1 先说结论 Redis缓存不是金弹,若系统DB毫无压力,系统性能瓶颈不在DB上,不建议强加缓存层! 增加业务复杂度:同一缓存必须被全部相关方法所覆盖,如订单缓存,只要涉及到订单数据更新的方法都要进行缓存逻辑处理。 同时,KV存储时,因各方法返回的类型不同

【Redis】入门

て烟熏妆下的殇ゞ 提交于 2020-04-05 16:44:14
Redis概述 Redis常用数据结构 Redis删除过期数据策略 Redis内存淘汰机制 Redis持久化机制 缓存问题及解决方案 Redis概述 Redis是一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存和消息中间件 Redis最常用的功能 缓存 分布式锁 本文介绍使用环境 Windows 10 Redis 3.0.504 如何安装Redis就不做介绍,若不想安装Redis环境,可以使用 try redis 尝试Redis功能 CMD 启动 Redis,打开Reids目录,执行下面命令,出现下面图片代表启动成功 redis-server redis.windows.conf Redis常用数据结构 字符串(String) 用途 存放字符串/数字 常规key-value缓存应用 常规计数:订单数,商品数 常用命令 用途 set key value 设置指定 key 的值 get key 获取指定key的值 decr key 将指定的key的值递减1,若设置的值不是数字,报错 incr key 将指定的key的值递增1,若设置的值不是数字,报错 mget key1 [key2] 获取指定的key,返回多个值 哈希(Hash) 用途 hash 特别适合用于存储对象(用户信息,商品信息) 可以修改/读取对象某个值 常用命令 用途 hset key field value

Redis入门及锁和计数的实现

[亡魂溺海] 提交于 2020-04-02 15:59:04
一、Redis简介 Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 Redis支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。 二、Redis的命令 命令行进入客户端 $ redis-cli 进入远程客户端 $ redis-cli -h host -p port -a password 查看redis信息 127.0.0.1:6379> info all 1、String 增改 redis 127.0.0.1:6379> SET runoobkey redis OK 查 redis 127.0.0.1:6379> GET runoobkey

分布式系统---幂等性设计

 ̄綄美尐妖づ 提交于 2020-04-02 15:00:38
最近做的项目的性能调优中关于幂等设计的一些总结 场景:假设有这样一个方法,包含了一些DB操作,check if existing then update else save. 如果两个线程同时去执行这个方法,并且他们处理的是同一条数据,期望应该是其中一个线程是save,另外一个是update。但是有可能线程的处理时间相当重合,线程A在check的时候,线程B也在check,这时A和B都认为数据不存在,都去save,在 数据库 有unique 约束的情况下其中一个操作会失败,而我们期望的可能是后面一个操作应该update(取决于具体业务)。 这是很典型的多线程问题,check - then do something,在单系统环境中这很容易用线程同步来处理(syncronised). 但是如果是分布式系统,这两个线程在不同的server上面,syncronised 是不会起效的,而且同步往往降低效率,并不是我们想要的。 拥有相同参数的多次请求对系统造成的副作用应该是相同的,这就是幂等性。在这个例子里面就是说保证相同的ID组合只会插入一条数据到DB里面,如果一个请求是save,后续的都应该update这条。在单系统中也可以用幂等的设计来规避使用syncronized,因为那会降低效率。一般情况下数据库就能保证这种幂等性--用unique关键字,以上面的场景为例

详解:如何设计出健壮的秒杀系统?

白昼怎懂夜的黑 提交于 2020-03-31 10:30:51
前言: 秒杀系统相信很多人见过,比如京东或者淘宝的秒杀,小米手机的秒杀。 那么秒杀系统的后台是如何实现的呢? 我们如何设计一个秒杀系统呢? 对于秒杀系统应该考虑哪些问题? 如何设计出健壮的秒杀系统? 本期我们就来探讨一下这个问题: 一:秒杀应该考虑哪些问题 1.1: 超卖问题 分析秒杀的业务场景,最重要的有一点就是超卖问题,假如备货只有100个,但是最终超卖了200,一般来讲秒杀系统的价格都比较低,如果超卖将严重影响公司的财产利益,因此首当其冲的就是 解决商品的超卖问题 。 1.2: 高并发 秒杀具有时间短、并发量大的特点,秒杀持续时间只有几分钟,而一般公司都为了制造轰动效应,会以极低的价格来吸引用户,因此参与抢购的用户会非常的多。 短时间内会有大量请求涌进来,后端如何 防止并发过高造成缓存击穿或者失效 ,击垮数据库都是需要考虑的问题。 1.3: 接口防刷 现在的秒杀大多都会出来针对秒杀对应的软件,这类软件会模拟不断向后台服务器发起请求,一秒几百次都是很常见的,如何 防止 这类软件的 重复无效请求 ,防止不断发起的请求也是需要我们针对性考虑的 1.4: 秒杀url 对于普通用户来讲,看到的只是一个比较简单的秒杀页面,在未达到规定时间,秒杀按钮是灰色的,一旦到达规定时间,灰色按钮变成可点击状态。 这部分是针对小白用户的 如果是稍微有点电脑功底的用户

五分钟学后端技术:如何学习Redis、memcache等常用缓存技术

[亡魂溺海] 提交于 2020-03-27 19:08:54
原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类缓存组件,或者是本地缓存,来实现一些后端的应用。 那么,严格来说,到底什么才是缓存呢,先来看看百度百科的定义。 缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。 最早,“缓存”一词是用来指代计算机硬件中的高速缓存,因为CPU和内存的运算速度差距过大,如果CPU直接和内存交互的话,会浪费掉CPU的大量运算时间,于是有了高速缓存,来为这两个速度差距甚远的组件做中介。 具体的工作原理是,CPU要取数据的时候,先找高速缓存要,由于它们俩的速度差距并不大,所以CPU不会损失掉太多性能,如果数据就在缓存中,那么就直接在缓存里取,否则则到内存去取,取完之后还要留在高速缓存中,以便于下次CPU要使用时无需再到内存中去取。 其实,高速缓存还可以分为一级缓存,二级缓存和三级缓存等,每往下一级,速度也就越慢,价格也越低,毕竟,成本是我们不得不考虑的因素,要不然一切硬件都上顶配,就不需要讨论软件的优化了。 除了高速缓存外,其实还有硬盘缓存

五分钟学后端技术:如何学习Redis、memcache等常用缓存技术

喜欢而已 提交于 2020-03-27 19:00:34
3 月,跳不动了?>>> 原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者。 本文思维导图 什么是缓存 计算机中的缓存 做后端开发的同学,想必对缓存都不会陌生了,平时我们可能会使用Redis,MemCache这类缓存组件,或者是本地缓存,来实现一些后端的应用。 那么,严格来说,到底什么才是缓存呢,先来看看百度百科的定义。 缓存(cache),原始意义是指访问速度比一般随机存取存储器(RAM)快的一种高速存储器,通常它不像系统主存那样使用DRAM技术,而使用昂贵但较快速的SRAM技术。缓存的设置是所有现代计算机系统发挥高性能的重要因素之一。 最早,“缓存”一词是用来指代计算机硬件中的高速缓存,因为CPU和内存的运算速度差距过大,如果CPU直接和内存交互的话,会浪费掉CPU的大量运算时间,于是有了高速缓存,来为这两个速度差距甚远的组件做中介。 具体的工作原理是,CPU要取数据的时候,先找高速缓存要,由于它们俩的速度差距并不大,所以CPU不会损失掉太多性能,如果数据就在缓存中,那么就直接在缓存里取,否则则到内存去取,取完之后还要留在高速缓存中,以便于下次CPU要使用时无需再到内存中去取。 其实,高速缓存还可以分为一级缓存,二级缓存和三级缓存等,每往下一级,速度也就越慢,价格也越低,毕竟,成本是我们不得不考虑的因素,要不然一切硬件都上顶配,就不需要讨论软件的优化了。