GolangStudy Online Courses
GolangStudy Online Courses
Home
课程
Golang
Kubernetes
算法/数据结构
Leetcode
面试真题
redis
redis 实现分布式锁
在许多场景下,分布式锁是非常有用的原语,在这些场景下,不同的进程必须以互斥的方式使用共享的资源执行逻辑。 有许多库和博客文章描述了如何使用 Redis 实现 DLM(Distributed Lock Manager),但每个库都使用不同的方法,许多库使用简单的实现,和稍微复杂一点的设计相比,简答的实现的稳定性会更低点。 本问提供了一种更加规范算法,用 Redis 实现分布式锁。本文提出了一种名为 Redlock 的算法,它实现了一种我们认为比普通的单实例方法更安全的 DLM。 安全和可靠保证 我们将用三个属性来建模我们的设计,这是有效使用分布式锁所需的最低保证: 安全属性:互斥。在任何时刻,只有一个客户端可以持有锁。 可靠保证 1:无死锁。始终可以获取锁,即使锁定资源的客户端崩溃或被分离。 可靠保证 2:容错。只要大部分 Redis节点处于运行状态,客户端就能够获取和释放锁。 基于故障切换(failover-based)的实现存在的问题 使用 Redis 锁定资源的最简单方法是在实例中创建 key。key 通常是使用 Redis expires 功能在有限的生存时间内创建的,因此最终锁将被释放(满足列表中的可靠保证 2)。当客户端需要释放资源时,会删除 key。
Jan 20, 2023
📊 Redis
通过该课程可以快速的学习 redis 操作,底层实现等。
Last updated on Dec 5, 2022
redis 面试题
数据结构 列举 redis 数据结构 TODO zset zset 特点 TODO zset 底层实现 TODO other 介绍一下 redis 长短连接 TODO
Last updated on Jan 1, 2023
redis 面试题:redis 为什么执行速度这么快
纯内存操作 避免大量访问数据库,减少直接读取磁盘数据 redis 将数据储存在内存里面,读写数据的时候都不会受到硬盘 I/O 速度的限制。 单线程操作 避免了不必要的上下文切换和竞争条件 不存在多进程或者多线程导致的切换而消耗CPU 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗 采用了非阻塞I/O多路复用机制 采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗)。 多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力。 在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作,从而提高效率。 灵活多样的数据结构 redis 内部使用一个 redisObject 对象来表示所有的 key 和 value。 redisObject 主要的信息包括数据类型、编码方式、数据指针、虚拟内存等。它包含 String,Hash,List,Set,Sorted Set 五种数据类型,针对不同的场景使用对应的数据类型,减少内存使用的同时,节省网络流量传输。 持久化 由于 redis 的数据都存放在内存中,如果没有配置持久化,redis 重启后数据就全丢失了,于是需要开启 redis 的持久化功能,将数据保存到磁盘上,当 redis 重启后,可以从磁盘中恢复数据。
Jan 1, 0001