redis分布式锁

Redis相关面试题

你。 提交于 2019-11-26 18:17:05
1 、 Redis 和 memched 有什么区别?为什么单线程的 Redis 比多线程的 Memched 效率要高? 区别: 数据支持类型: Redis: String(字符串):key-value 类型 Hash(哈希):字典(hashmap) Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值 List(列表):实现消息队列 Set(集合):利用唯一性 Sorted Set(有序集合):可以进行排序 可以实现数据持久化 Bitmaps(位图) HyperLogLog、Geo(地理信息定位) Memched:简单的key/value数据类型 数据持久性: Redis:Redis通过RDB(Redis DataBase)与AOF(Append Only File)持久化,可以将内存中的数据保存到硬盘中,然后重启之后在读取数据。 这里说明一下RDB和AOF的原理: RDB:是在达到指定的时间或者操作次数后,自动将在内存中的数据写入磁盘(数据恢复时一致性和完整性较差,因为也许最后一次备份前就宕机了,适合数据量较大的数据恢复时候使用) AOF:是日志形式,当数据写入内存中的时候,在日志文件下记录下所有写操作。(数据量较大时,数据的恢复缓慢) 注意:如果不需要持久化的功能,可以关闭。如果想要达到持久化的效果,建议两者都使用(RDB,AOF) Memched

reids使用详情,全面详解

好久不见. 提交于 2019-11-26 16:58:06
Nosql介绍 非关系性数据库 不支持sql语法 nosql没有通用语言,每种语言都有自己得语法 sql对事物支持完善,而nosql基本不支持事务 Nosql有redis,mongodb,hbase hadoop等等。 Redis简介 redis 是一个开源免费得,遵守BSD协议,是一个高性能得key-value得非关系型数据库。 redis是nosql技术,通过多中键值类型来适应不同场景下得需求,借助一些高级得接口使用可以胜任,如缓存,队列系统得不用角色。 Redis特性与优势 redis支持数据得持久化,可以将内存中的数据保存在磁盘中,重启得是时候可以再次加载使用 redis不仅仅支持简单得key-value类型得数据,同时还提供list,set,zest,string,hash reidis支持数据得备份即master-slave模式数据备份 性能极高redis能读得速度是110000次/s,写的速度是81000次/s 丰富得数据类型redis支持二进制案例得string,lists,hashes,sets即ordered sets数据类型操作 原子redis得所有操作都是原子性(要么都成功要么都失败) 丰富得特性redis还支持publish/subscribe,通知key过期等 Redis应用场景 用来做缓存,token生成,session共享,分布式锁,自增id,验证码

分布式为什么使用python

社会主义新天地 提交于 2019-11-26 16:50:56
一、单线程的redis为什么这么快 #1、纯内存操作 #2、单线程操作,避免了频繁的上下文切换 #3、采用了非阻塞 I/O 多路复用机制 二、redis的过期策略和内存淘汰机制 # Redis 只能存 5G 数据,可是你写了 10G,那会删 5G 的数据。怎么删的 1、过期策略 #1、为什么不用定时删除策略 #定时删除: 用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源 #2、定期删除+惰性删除 # 2.1定期删除, #Redis默认每隔100ms检查,是否有过期的key,有过期key则删除。 需要说明的是,Redis不是每隔100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,Redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。 #2.2惰性删除 在我们获取某个key的时候,Redis会检查一下,这个key是否设置了过期时间,是否过期,过期了会删除 #2.3定期删除+惰性删除存在的问题 定期删除没删除key。然后我们也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。 2、数据(内存)淘汰策略 lru算法 python中的LRU算法 #在redis.conf中有一行配置: maxmemory-policy

分布式锁

故事扮演 提交于 2019-11-26 16:43:17
一、为什么要有分布式锁 #效率: 使用分布式锁可以避免不同节点重复相同的工作,这些工作会浪费资源。比如用户付了钱之后有可能不同节点会发出多封短信。 #正确性: 加分布式锁同样可以避免破坏正确性的发生,如果两个节点在同一条数据上面操作,比如多个节点机器对同一个订单操作不同的流程有可能会导致该笔订单最后状态出现错误,造成损失。 二、分布式锁需求分析 在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件: #1、在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行; #2、高可用的获取锁与释放锁; #3、高性能的获取锁与释放锁; #4、具备可重入特性; #5、具备锁失效机制,防止死锁; #6、具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。 三、分布式锁的三种实现方式 1、基于数据库实现分布式锁 #基于数据库的实现方式的核心思想是: 在数据库中创建一个表,表中包含方法名等字段,并在方法名字段上创建唯一索引,想要执行某个方法,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。 (1)创建一个表: DROP TABLE IF EXISTS `method_lock`; CREATE TABLE `method_lock` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT

分布式场景常见问题及解决方案

[亡魂溺海] 提交于 2019-11-26 16:07:05
一、分布式锁   分布式锁是在分布式场景下一种常见技术,通常通过基于redis和zookeeper来实现,本文主要介绍redis分布式锁和zookeeper分布式锁的实现方案和对比:   (1)基于redis的普通实现   这个方案的加锁主要实现是基于redis的”SET key 随机值 NX PX 过期时间(毫秒)”指令,NX代表只有key不存在时才设置成功,PX代表在过期时间后会自动释放。   这个方案的释放锁是通过lua脚本删除key的方式,判断value一样则删除key。   使用随机值的原因是如果某个获取到锁的客户端阻塞了很长时间,导致了它获取到的锁已经自动释放,此时可能有其他客户端已经获取到了锁,如果直接删除是有问题的,所以要通过随机值加上lua脚本去判断如果value相等时再删除。   这个方案存在一个问题就是,如果采用redis单实例可能会存在单点故障问题,但如果采用普通主从方式,如果主节点挂了key还没来得及同步到从节点,此时从节点被切换到了主节点,由于没有同步到数据别人就会拿到锁。   (2)redis的RedLock算法   这个方案是redis官方推荐的分布式锁的解决方案,假设有5个redis master实例,然后执行如下步骤去获取一把锁:   1)获取当前时间戳,单位是毫秒   2)跟上面类似,轮流尝试在每个master节点上创建锁,过期时间较短

【转】Redis相关

こ雲淡風輕ζ 提交于 2019-11-26 08:48:03
1. 什么是redis? Redis 是一个使用 C 语言写成的,开源的基于内存的高性能key-value数据库。 Redis的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)等多种数据结构组成。 回到顶部 2. Redis的特性 速度快 速度快的原因: - Redis所有数据都放在内存中 - Redis是C语言实现 - Redis使用了单线程的架构,预防了多线程可能产生的竞争问题 基于键值对的数据结构服务器 Redis中的值不仅可以是字符串,Redis的值可以是由string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合)、Bitmaps(位图)等多种数据结构组成,便于许多应用场景的开发并且提高了开发效率。 丰富的共鞥 提供了键过期功能,可以用来实现缓存 提供了发布/订阅功能,可以用来实现消息系统 支持Lua脚本功能,可以利用Lua创造出新的Redis命令 提供了简单的事务功能,能在一定程度上保证事务特性 提供了流水线(Pipeline)功能,减少了网络开销 简单稳定 客户端语言多 持久化 RDB(快照) AOF(日志的形式) 4.0版本开始支持RDB和AOF混用的方式聊进行持久化 主从复制 高可用和分布式 高可用实现:Redis Sentinel 分布式实现

【转】Redis面试题

戏子无情 提交于 2019-11-26 08:47:32
1、谈谈Redis的主从复制流程 有几个重点: 主节点负责写,从节点负责读,slave node 主要用来进行横向扩容,做读写分离,扩容的 slave node 可以提高读的吞吐量。 必须开启 master node 的持久化,不建议用 slave node 作为 master node 的数据热备,因为那样的话,如果你关掉 master 的持久化,可能在 master 宕机重启的时候数据是空的,然后可能一经过复制, slave node 的数据也丢了。 当启动一个 slave node 的时候,它会发送一个 PSYNC 命令给 master node。 slave node 初次连接到 master node,那么会触发一次 full resynchronization 全量复制。此时 master 会启动一个后台线程,开始生成一份 RDB 快照文件,同时还会将从客户端 client 新收到的所有写命令缓存在内存中。 断点续传是通过offset机制。 如果 master node 重启或者数据出现了变化,那么 slave node 应该根据不同的 run id 区分。 更详细见:https://github.com/doocs/advanced-java/blob/master/docs/high-concurrency/redis-master-slave.md 2

【转】Redis常见面试题

倖福魔咒の 提交于 2019-11-26 08:30:05
介绍:Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API的非关系型数据库。 传统数据库遵循 ACID 规则。而 Nosql(Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称) 一般为分布式而分布式一般遵循 CAP 定理。 Github 源码:https://github.com/antirez/redis Redis 官网:https://redis.io/ Redis支持的数据类型? String字符串: 格式: set key value string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型,一个键最大能存储512MB。 Hash(哈希) 格式: hmset name key1 value1 key2 value2 Redis hash 是一个键值(key=>value)对集合。 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。 List(列表) Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边) 格式:

使用hiredis实现redis分布式锁

蹲街弑〆低调 提交于 2019-11-26 06:15:01
简言 1. redis实现分布式锁的原理,这里不再赘述,不清楚的可以参见笔者的这篇博客 https://blog.csdn.net/yzf279533105/article/details/100524700 2. 解锁时使用lua脚本,由于hiredis是根据空格来解析cmd参数的,但是lua中肯定有空格,所以解锁的redis命令要分开格式化 代码如下: 头文件(仅贴出主要代码) // redis锁 struct RedisLock { string key; // 锁的key int randval; // 随机值 }; // 加锁(锁数据,过期时间,单位:秒) bool Lock(RedisLock lockkey, uint32_t expire); // 解锁 bool Unlock(RedisLock lockkey); cpp文件 // 加锁(锁数据,过期时间,单位:秒) bool CRedisClient::Lock(RedisLock lockkey, uint32_t expire) { bool bSuc = connect(); if (!bSuc) { ERROR("CRedisClient::Lock(), connect failed"); return false; } ostringstream os; os<< "set " << lockkey

Redis分布式锁严谨的实现方式

我们两清 提交于 2019-11-26 02:35:39
本文主要基于Springboot2.x,基于lettuce客户端实现 组件依赖 Maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> <version>2.1.6.RELEASE</version> </dependency> <!--如果需要使用Redis线程池,需要依赖 --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.6.2</version> </dependency> 配置 spring: redis: timeout: 5000ms host: 192.168.1.123 password: 1password1 database: 1 lettuce: pool: max-idle: 8 min-idle: 1 max-wait: 3000ms max-active: 8 代码实现 import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis