redis分布式锁

缓存数据库Redis

人盡茶涼 提交于 2019-12-02 06:19:50
NoSQL 入门与概述 为什么用 NoSQL? 什么是单机 MySQL? 在90年代,一个网站的访问量一般都不大,用单个数据库完全可以轻松应付。 Memcached(缓存)+MySQL+垂直拆分 MySQL 主从读写分离 由于数据库的写入压力增加,Memcached只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。MySQL 的 Master-Slave 模式成为这个时候的网站标配了。 分表分库+水平拆分+MySQL集群 在 Memcached 的高速缓存,MySQL 的主从复制,读写分离的基础之上,这时 MySQL 主库的写压力开始出现瓶颈,而数据量的持续猛增,由于 MyISAM 使用表锁,在高并发下会出现严重的锁问题,大量的高并发 MySQL 应用开始使用 InnoDB 引擎代替MyISAM。 同时,开始流行使用分表分库来缓解写压力和数据增长的扩展问题。这个时候,分表分库成了一个热门技术,是面试的热门问题也是业界讨论的热门技术问题。也就在这个时候,MySQL 推出了还不太稳定的表分区,这也给技术实力一般的公司带来了希望。虽然 MySQL 推出了 MySQL Cluster 集群,但性能也不能很好满足互联网的要求,只是在高可靠性上提供了非常大的保证。 MySQL 的扩展问题 MySQL

redis 单线程的理解

故事扮演 提交于 2019-12-02 06:08:36
1. redis单线程问题   单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一个线程处理所有网络请求,其他模块仍用了多个线程。 2. 为什么说redis能够快速执行 (1) 绝大部分请求是纯粹的内存操作(非常快速) (2) 采用单线程,避免了不必要的上下文切换和竞争条件 (3) 非阻塞IO - IO多路复用 3. redis的内部实现   内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间 这3个条件不是相互独立的,特别是第一条,如果请求都是耗时的,采用单线程吞吐量及性能可想而知了。应该说redis为特殊的场景选择了合适的技术方案。 4. Redis关于线程安全问题    redis实际上是采用了线程封闭的观念,把任务封闭在一个线程,自然避免了线程安全问题,不过对于需要依赖多个redis操作的复合操作来说,依然需要锁,而且有可能是分布式锁。 另一篇对redis单线程的理解: Redis单线程理解 个人理解 redis分客户端和服务端,一次完整的redis请求事件有多个阶段(客户端到服务器的网络连接-->redis读写事件发生--> redis服务端的数据处理(单线程) -->数据返回)。平时所说的redis单线程模型

Redis 分布式锁的正确实现方式(Java版)(抄)

江枫思渺然 提交于 2019-12-02 04:43:59
前言 分布式锁一般有三种实现方式: 数据库乐观锁; 基于Redis的分布式锁; 基于ZooKeeper的分布式锁 本篇博客将介绍第二种方式,基于Redis实现分布式锁。 虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。 可靠性 首先,为了确保分布式锁可用,我们至少要确保锁的实现同时满足以下四个条件: 互斥性 。在任意时刻,只有一个客户端能持有锁。 不会发生死锁 。即使有一个客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。 具有容错性 。只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人 。加锁和解锁必须是同一个客户端,客户端自己不能把别人加的锁给解了。 代码实现 组件依赖 首先我们要通过Maven引入Jedis开源组件,在pom.xml文件加入下面的代码: <dependency> <groupId>redis.clientsgroupId> <artifactId>jedisartifactId> <version>2.9.0version> > 加锁代码 正确姿势 Talk is cheap, show me the code。先展示代码,再带大家慢慢解释为什么这样实现: public class RedisTool {

OPPO-Java面试-社招-一面(2019/07)

倖福魔咒の 提交于 2019-12-02 03:37:31
个人情况   2017年毕业,普通本科,计算机科学与技术专业,毕业后在一个二三线小城市从事Java开发,2年Java开发经验。做过分布式开发,没有高并发的处理经验,平时做To G的项目居多。写下面经是希望给各位有相同面试公司的小伙伴做个参考,同时也希望记下自己的一些收获和踩下的坑。 简历投递   拉勾上投的简历,HR打电话了解个人情况后,约了某个星期周二的晚上七点。当时看了简历投递的部门,是金融项目组,岗位:Java开发工程师。 一面   来电的并不是座机号码,而是个人电话,还是第一次见。听声音很沉稳,我猜电话的另一头应该是个挺有资历的负责人或者组长。   简单的自我介绍,聊了聊为什么打算到深圳发展,然后从项目开始问起,先简单问了做过什么项目。   用什么解析的Excel?   POI解析Excel会存在什么问题?   当时为什么考虑用POI?   写过JVM调参,问了下当时调参的情况。   MQ怎样保证消息的可靠性以及当时如何做消息幂等处理的。   sql如何优化?   事务的隔离级别及解决的问题?   知道范围锁吗?(第一次听,就说不知道)   redis常用的数据类型?   redis为什么快?   都用过redis做过什么?   redis的持久化机制?   redis的集群?   redis怎么实现分布式锁?   平时用过什么设计模式(平时开发中没怎么用,如实说。。)  

Redis从生米煮成熟饭

半城伤御伤魂 提交于 2019-12-02 02:24:31
Redis为何选用单线程 单线程减少线程上下文切换和锁竞争。 网络IO模型采用IO多路复用,使用EPOLL注册读写事件通知,同步非阻塞。 Redis单线程如何发挥多核CPU优势 在单台服务器上运行多个redis实例。 使用taskset命令,将每个redis实例和cpu核心进行绑定 Redis分布式锁实现 setnx key value 如果key不存在,则创建并赋值。成功返回1 失败返回0。 同时设置过期时间: expire key seconds 也可使用set命令配合NX EX选项一次性设置 SET key value EX 10086 NX 缓存雪崩、缓存击穿、缓存穿透 缓存雪崩 : 大量的KEY过期时间过于集中,导致瞬时很多缓存失效,由此可能导致数据库压力陡然升高。 解决方案 : 将失效时间随机打乱,如在系统启动预热时设定一定程度上离散的过期时间。 缓存击穿 : 缓存中某一个KEY过期失效,如果此时有大量请求过来无法命中缓存的KEY,缓存层像被凿开了一个口子一样流入大量数据库查询请求 解决方案 :双重校验方式从数据库中读取数据到缓存。双重校验:第一层查询缓存失败后,进入临界区,保证同时只有一个请求线程读取数据库,进入临界区后再次尝试缓存,仍然没有命中则查询数据库。 缓存穿透 : 外部请求不断查询一个系统中不存在的数据,服务无法命中缓存转而每次尝试从数据库中查询。 解决方案

python基于redis实现分布式锁

自闭症网瘾萝莉.ら 提交于 2019-12-01 23:55:15
阅读目录    什么事分布式锁   基于redis实现分布式锁   一、什么是分布式锁 我们在开发应用的时候,如果需要对某一个共享变量进行多线程同步访问的时候,可以使用我们学到的锁进行处理,并且可以完美的运行,毫无Bug! 注意这是单机应用,后来业务发展,需要做集群,一个应用需要部署到几台机器上然后做负载均衡,大致如下图: 上图可以看到,变量A存在三个服务器内存中(这个变量A主要体现是在一个类中的一个成员变量,是一个有状态的对象),如果不加任何控制的话,变量A同时都会在分配一块内存,三个请求发过来同时对这个变量操作,显然结果是不对的!即使不是同时发过来,三个请求分别操作三个不同内存区域的数据,变量A之间不存在共享,也不具有可见性,处理的结果也是不对的! 如果我们业务中确实存在这个场景的话,我们就需要一种方法解决这个问题! 为了保证一个方法或属性在高并发情况下的同一时间只能被同一个线程执行,在传统单体应用单机部署的情况下,可以使用并发处理相关的功能进行互斥控制。但是,随着业务发展的需要,原单体单机部署的系统被演化成分布式集群系统后,由于分布式系统多线程、多进程并且分布在不同机器上,这将使原单机部署情况下的并发控制锁策略失效,单纯的应用并不能提供分布式锁的能力。为了解决这个问题就需要一种跨机器的互斥机制来控制共享资源的访问,这就是分布式锁要解决的问题! 分布式锁应该具备哪些条件:  

redis 分布式锁

╄→尐↘猪︶ㄣ 提交于 2019-12-01 23:11:25
出处: https://www.cnblogs.com/fixzd/p/9479970.html 一、介绍 这篇博文讲介绍如何一步步构建一个基于Redis的分布式锁。会从最原始的版本开始,然后根据问题进行调整,最后完成一个较为合理的分布式锁。 本篇文章会将分布式锁的实现分为两部分,一个是单机环境,另一个是集群环境下的Redis锁实现。在介绍分布式锁的实现之前,先来了解下分布式锁的一些信息。 二、分布式锁 2.1 什么是分布式锁? 分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性。 2.2 分布式锁需要具备哪些条件 互斥性:在任意一个时刻,只有一个客户端持有锁。 无死锁:即便持有锁的客户端崩溃或者其他意外事件,锁仍然可以被获取。 容错:只要大部分Redis节点都活着,客户端就可以获取和释放锁 2.4 分布式锁的实现有哪些? 数据库 Memcached(add命令) Redis(setnx命令) Zookeeper(临时节点) 等等 三、单机Redis的分布式锁 3.1 准备工作 定义常量类 public class LockConstants { public static final String OK = "OK"; /** NX|XX, NX -- Only

spring cloud 用redis做分布式锁(解决分布式多节点情况下,定时任务多次执行)

∥☆過路亽.° 提交于 2019-12-01 22:58:03
我们知道现在微服务很流行,为此,许多中小型企业都将自己以前的框架加以改造,其中以SpringCloud为最多,但是SpringCloud如果要加定时任务的话,在单台服务器上很好支持, 但是涉及到集群服务(多台服务的话)就要用到分布式锁了,最简单的方案是用Redis,好了废话不多说,直接上代码. 1、分布式锁 /** * 分布式锁 * * */ @Component public class DistributedLockHandler { private static final Logger logger = LoggerFactory.getLogger(DistributedLockHandler.class); /** * 最大持有锁的时间(毫秒) */ private final static long LOCK_EXPIRE = 30 * 1000L; /** * 尝试获取锁的时间间隔(毫秒) */ private final static long LOCK_TRY_INTERVAL = 30L; /** * 获取锁最大等待时间( 毫秒 ) */ private final static long LOCK_TRY_TIMEOUT = 20 * 1000L; @Resource(name = "customRedisTemplate") private

Redis问题汇总

喜夏-厌秋 提交于 2019-12-01 22:09:48
1. 什么是Redis Redis是由意大利人Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server(远程数据服务),该软件使用C语言编写,Redis是一个key-value存储系统,它支持丰富的数据类型,如:string、list、set、zset(sorted set)、hash。 2. Redis特点 以内存作为数据存储介质,读写数据的效率极高,远远超过数据库。以设置和获取一个256字节字符串为例,它的读取速度可高达110000次/s,写速度高达81000次/s。 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 支持多种数据类型String、List、Hash、Set、zset 支持数据的备份,即master-slave模式的数据备份 3.Redis有哪些数据类型,以及每种数据类型使用的场景 Redis支持多种数据类型,有String、List、Hash、Set、zset String(字符串) String类型是二进制安全的,意思是Redis的String可以包含任何数据,比如图片或者序列化的对象等。一个Redis中字符串的value最多可以是512M。一般做一些复杂的计数功能的缓存。 List(列表)

Python服务端工程师就业面试指导 网盘下载

北战南征 提交于 2019-12-01 20:24:47
Python后端技术栈(六)--数据库 每日分享 What makes you different or weird—that’s your strength. 那些让你与众不同或怪异的,就是你的力量所在。 1.6数据库 上篇文章对网络编程中的一些经典问题做了总结,比如各种网络协议、IO 多路复用模型、并发库等等。 本篇文章将开始数据库的相关内容,开始咯~ 1.6.1 MySQL 1.6.1.1 MySQL 基础知识点 1.事务的原理,特性,事务并发控制 2.常用的字段、含义和区别 3.常用数据库引擎之间区别 1.6.1.2事务 Transaction 1.事务是数据库并发控制的基本单位 2.事务可以看做是一系列 SQL 语句的集合 3.事务的特性就是要么全部执行成功,要么全部执行失败(回滚) 我们最常见的就是转账操作这样一个使用案例。比如 A 给 B 转账,第一步是从 A 的账户查询一下余额还够不够,然后扣款。第二步是 B 的账户里面增加对应的金额。 从代码的层面来说,下面举一个 SQLAlchemy 框架执行回滚操作的例子: session.begin() try: item1 = session.query(Item).get(1) item2 = session.query(Item).get(2) item1.foo = 'bar' item2.bar = 'foo'