分布式锁

zookeeper如何实现分布式锁

半世苍凉 提交于 2019-12-14 05:54:11
1.利用zk的特性 利用zookeeper的节点特性实现独占锁,就是同级节点的唯一性,多个进程往zookeeper的指定节点中创建一个节点名称相同的节点,只有一个成功,另一个创建失败;创建失败的节点通过zookeeper的watcher机制来监听这个子节点的变化,一旦子节点发生删除事件,则再次触发进程区写锁 这种实现方式简单,但是会产生"惊群效应",如果存在许多客户端在等待获取锁,当成功获取到锁的节点释放锁后,所有处于等待的客户端都会被唤醒,这个时候 zookeeper 在短时间内发送大量子节点变更事件给所有待获取锁的客户端,然后实际情况是只会有一个客户端获得锁。如果在集群规模比较大的情况下,会对 zookeeper 服务器的性能产生比较的影响。 2.利用有序节点实现分布式锁 我们可以通过有序节点来实现分布式锁,每个客户端都往指定的节点下注册一个临时有序节点,越早创建的节点,节点的顺序编号就越小,那么我们可以判断子节点中最小的节点设置为获得锁。如果自己的节点不是所有子节点中最小的,意味着还没有获得锁。这个的实现和前面单节点实现的差异性在于,每个节点只需要监听比自己小的节点,当比自己小的节点删除以后,客户端会收到 watcher 事件,此时再次判断自己的节点是不是所有子节点中最小的,如果是则获得锁,否则就不断重复这个过程,这样就不会导致羊群效应,因为每个客户端只需要监控一个节点。 3

从零开始学Redis之半步神游

巧了我就是萌 提交于 2019-12-13 15:01:59
前言 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/bin392328206/six-finger 种一棵树最好的时间是十年前,其次是现在 我知道很多人不玩 qq 了,但是怀旧一下,欢迎加入六脉神剑Java菜鸟学习群,群聊号码: 549684836 鼓励大家在技术的路上写博客 絮叨 半步神游,神游之下,天下无敌。一梦一游 便是天下。 Redis前面几篇的文章链接: 🔥从零开始学Redis之金刚凡境 🔥从零开始学Redis之自在地境 🔥从零开始学Redis之逍遥天境 上一篇的逍遥天境 讲的是Redis的内存淘汰策略 和持久化方式。那这半步神游就是带你们遨游Redis的主从HA,哨兵,和Lua脚本 Redis主从和哨兵模式 Redis 主从搭建(有兴趣的小伙伴自己用虚拟机搭一个玩玩) 1、环境说明 主机名称 IP地址 redis版本和角色说明 redis-master 192.168.56.11 redis 5.0.3(主) redis-slave01 192.168.56.12 redis 5.0.3(从) redis-slave02 192.168.56.13 redis 5.0.3(从) 2、修改主从的redis配置文件 [root@redis-master ~]# grep -Ev "^$|#" /usr/local/redis

【转载】基于redis的分布式锁

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

Redis中的Java分布式缓存

邮差的信 提交于 2019-12-12 16:58:35
为什么在分布式Java应用程序中使用缓存?今天学习了两节优锐课讲解分布式缓存的内容,收获颇多,分享给大家。 在提高应用程序的速度和性能时,每毫秒都是至关重要的。例如,根据Google的一项研究,如果网站在3秒或更短时间内无法加载,则有53%的移动用户会离开该网站。 缓存是使你的分布式应用程序更快的最重要的技术之一。你可以将信息存储到计算机的CPU中越近,访问信息的速度就越快。从CPU缓存中加载数据要比从RAM中加载数据快得多,这也比从硬盘或通过网络加载数据快得多。 为了存储经常访问的数据,分布式应用程序在多台计算机上维护高速缓存。分布式缓存通常是减少分布式应用程序的延迟并提高其并发性和可伸缩性的基本策略。 Redis是一种流行的开源内存中数据结构存储,可以用作数据库,缓存或消息代理。因为Redis从内存而不是从磁盘加载数据,所以Redis比许多传统的数据库解决方案要快。 但是,使分布式缓存在Redis中正常工作对于开发人员可能是一个挑战。例如,本地缓存失效是替换或删除缓存条目的过程,必须谨慎处理。每次更新或删除一台计算机上本地缓存中存储的信息时,都必须更新作为分布式缓存一部分的所有计算机上的内存中缓存。 好消息是,有Redis框架(例如Redisson)可以帮助你构建应用程序所需的分布式缓存。在下一部分中,我们将讨论Redisson中三种重要的分布式缓存实现:Maps,Spring

分布式锁

一世执手 提交于 2019-12-12 12:44:24
什么是分布式锁 线程锁 主要用来给方法、代码块加锁。当某个方法或代码使用锁,在同一时刻仅有一个线程执行该方法或该代码段。线程锁只在同一JVM中有效果,因为线程锁的实现在根本上是依靠线程之间共享内存实现的,比如synchronized是共享对象头,显示锁Lock是共享某个变量(state)。 进程锁 为了控制同一操作系统中多个进程访问某个共享资源,因为进程具有独立性,各个进程无法访问其他进程的资源,因此无法通过synchronized等线程锁实现进程锁。 分布式锁 当多个进程不在同一个系统中,用分布式锁控制多个进程对资源的访问。 使用场景 线程间并发问题和进程间并发问题都是可以通过分布式锁解决的,但是强烈不建议这样做!因为采用分布式锁解决这些小问题是非常消耗资源的!分布式锁应该用来解决分布式情况下的多进程并发问题才是最合适的。 有这样一个情境,线程A和线程B都共享某个变量X。 如果是单机情况下(单JVM),线程之间共享内存,只要使用线程锁就可以解决并发问题。 如果是分布式情况下(多JVM),线程A和线程B很可能不是在同一JVM中,这样线程锁就无法起到作用了,这时候就要用到分布式锁来解决。 分布式锁的实现(Redis) 分布式锁实现的关键是在分布式的应用服务器外,搭建一个存储服务器,存储锁信息,这时候我们很容易就想到了Redis。首先我们要搭建一个Redis服务器

学了这篇redis从入门到精通,redis笔记全收录,必须收藏

别来无恙 提交于 2019-12-12 10:17:57
一、概述 二、数据类型 STRING LIST SET HASH ZSET 三、数据结构 字典 跳跃表 四、使用场景 计数器 缓存 查找表 消息队列 会话缓存 分布式锁实现 其它 五、Redis 与 Memcached 数据类型 数据持久化 分布式 内存管理机制 六、键的过期时间 七、数据淘汰策略 八、持久化 RDB 持久化 AOF 持久化 九、事务 十、事件 文件事件 时间事件 事件的调度与执行 十一、复制 连接过程 主从链 十二、Sentinel 十三、分片 十四、一个简单的论坛系统分析 文章信息 点赞功能 对文章进行排序 参考资料 一、概述 Redis 是速度非常快的非关系型(NoSQL)内存键值数据库,可以存储键和五种不同类型的值之间的映射。 键的类型只能为字符串,值支持五种数据类型:字符串、列表、集合、散列表、有序集合。 Redis 支持很多特性,例如将内存中的数据持久化到硬盘中,使用复制来扩展读性能,使用分片来扩展写性能。 二、数据类型 数据类型 可以存储的值 操作 STRING 字符串、整数或者浮点数 对整个字符串或者字符串的其中一部分执行操作 对整数和浮点数执行自增或者自减操作 LIST 列表 从两端压入或者弹出元素 对单个或者多个元素进行修剪, 只保留一个范围内的元素 SET 无序集合 添加、获取、移除单个元素 检查一个元素是否存在于集合中 计算交集、并集、差集

Redis之集群高可用与安全控制

别来无恙 提交于 2019-12-11 14:58:26
Redis 之集群高可用和安全控制 一、 Redis 的主从复制 1.1. 为什么使用主从 单个 Redis 如果因为某种原因宕机的话,可能会导致 Redis 服务不可用,可以使用主从复制实现一主多从,主节点负责写的操作,从节点负责读的操作,主节点会定期将数据同步到从节点中,保证数据一致性的问题。 1.2. 主从的方式 最少需要3个节点。 第一种: 第二种: 优先选择第二种,第一种方式主节点向从节点同步数据压力大。 1.3. 主从复制配置: 将编译之后的 Redis 中的 bin 目录中全部内容 角色 端口 配置文件 主节点 6379 redis_6379.conf 从节点 6380 redis_6380.conf 从节点 6381 redis_6381.conf 从节点 6382 redis_6382.conf 相关目录结构 内存有限,我们只模拟不同端口下的 Redis 主从复制。我模拟了一主三从,采用树状结构: 核心配置:主节点 # ip监控 bind 0.0.0.0 protected-mode no # requirepass 123456 # 端口 port 6379 # 后台运行 daemonize yes # 工作目录 dir ./ # pid pidfile "/var/run/redis_6379.pid" # 日志名 logfile "redis_6379

redis面试题

本秂侑毒 提交于 2019-12-11 14:55:57
1、使用redis有哪些好处? 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) 支持丰富数据类型,支持string,list,set,sorted set,hash 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除 2、redis相比memcached有哪些优势? memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 redis的速度比memcached快很多 redis可以持久化其数据 3、redis常见性能问题和解决方案: Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 尽量避免在压力很大的主库上增加从库 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3... 这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。 4、redis

Redis面试

烂漫一生 提交于 2019-12-11 13:50:16
1、redis简介 简单来说 redis 就是一个数据库,不过与传统数据库不同的是 redis 的数据是存在内存中的,所以读写速度非常快,因此 redis 被广泛应用于缓存方向。另外,redis 也经常用来做分布式锁。redis 提供了多种数据类型来支持不同的业务场景。除此之外,redis 支持事务 、持久化、LUA脚本、LRU驱动事件、多种集群方案 2、为什么要用 redis/为什么要用缓存 主要从“高性能”和“高并发”这两点来看待这个问题。 高性能: 假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可! 高并发: redis 和 memcached 的区别 redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用,而Memecache把数据全部存在内存之中。 集群模式:memcached没有原生的集群模式

redis 的数据类型

拜拜、爱过 提交于 2019-12-11 13:16:47
redis支持丰富的数据类型,从最基础的string到复杂的常用到的数据结构都有支持: string:最基本的数据类型,二进制安全的字符串,最大512M。 list:按照添加顺序保持顺序的字符串列表。 set:无序的字符串集合,不存在重复的元素。 sorted set:已排序的字符串集合。 hash:key-value对的一种集合。 bitmap:更细化的一种操作,以bit为单位。 hyperloglog:基于概率的数据结构。 2、集群(Cluster) 单台服务器资源的总是有上限的,CPU资源和IO资源我们可以通过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上。但是内存资源怎么办,主从模式做到的只是相同数据的备份,并不能横向扩充内存;单台机器的内存也只能进行加大处理,但是总有上限的。所以我们就需要一种解决方案,可以让我们横向扩展。最终的目的既是把每台服务器只负责其中的一部分,让这些所有的服务器构成一个整体,对外界的消费者而言,这一组分布式的服务器就像是一个集中式的服务器一样(之前在解读REST的博客中解释过分布式于基于网络的差异:基于网络应用的架构)。 在Redis官方的分布式方案出来之前,有twemproxy和codis两种方案,这两个方案总体上来说都是依赖proxy来进行分布式的,也就是说redis本身并不关心分布式的事情