redis分布式锁

Redis面试题

可紊 提交于 2019-11-29 18:51:34
Redis有哪些数据结构? 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。 如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。 如果你说还玩过Redis Module,像BloomFilter,RedisSearch,Redis-ML,面试官得眼睛就开始发亮了。 使用过Redis分布式锁么,它是什么回事? 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。 这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样? 这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!对方这时会显露笑容,心里开始默念:摁,这小子还不错。 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 使用keys指令可以扫出指定模式的key列表。 对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

Redis面试题

北城以北 提交于 2019-11-29 18:47:12
1.为什么要使用Redis? a.实现分布式锁 redis提供了可以用来实现分布式锁的方法,比如redis的setnx方法等 b.提高性能 通过redis可以实现基于内存的数据库,可以通过redis实现对请求的缓存。 c.实现高并发 redis的缓存功能、以及可以通过redis可以实现类似与消息队列的能够,避免了大量请求同时调用数据库。 2.单线程的Redis为什么这么快? a.绝大数的请求操作都是纯粹的内存操作 b.采用了单线模式,避免了不必要的上下文切换和竞争条件 这里的单线程指的是网络请求模块只使用了一个线程(所以不必考虑并发安全性),即一个请求处理所有网络请求,其他模块仍使用了多个线程。 c.非阻塞IO—IO多路复用 IO多路复用实现了可以同时监听多个客户端。 IO多路复用与多线程相,IO多路复用不需要切换到内核进行线程切换,需要更少的时间和资源. 3.Redis过期策略和内存淘汰机制 定时删除:在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除 惰性删除: key过期的时候不删除,每次从数据库获取key的时候去检查是否过期,若过期,则删除,返回null。 定期删除: 每隔一段时间执行一次删除过期key操作 注:redis一般使用定时删除、定期删除; mercached只使用惰性删除。 4.使用Redis有什么缺点?

python基于redis实现分布式锁

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

Redis五大数据类型详解

别来无恙 提交于 2019-11-29 16:44:39
关于Redis的五大数据类型,它们分别为:String、List、Hash、Set、SortSet。本文将会从它的 底层数据结构 、 常用操作命令 、一些 特点 和 实际应用 这几个方面进行解析。对于数据结构的解析,本文只会从大的方面来解析,不会介绍详细的代码实现。 String 1.实现结构   String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。首先,表面上它是字符串,但其实他可以灵活的表示 字符串、整数、浮点数 3种值。Redis会自动的识别这3种值。那么,String的底层数据机构又是怎样的呢?由于Redis是使用c语言实现的,而c语言中没有String这一数据类型,那么就需要自己实现一个类似于String的 结构体 。它的名字就叫做SDS(simple dynamic string),下面是它的代码结构。 1 typedef struct sdshdr { 2 // buf中已经占用的字符长度 3 unsigned int len; 4 // buf中剩余可用的字符长度 5 unsigned int free; 6 // 数据空间 7 char buf[]; 8 } 如果有了解过Java集合框架类的朋友都知道,这种结构与集合中 动态数组结构 类似,那么就会涉及到一系列的扩容判断和操作,但这些具体的做法在这里不深入讲解

redis笔记

╄→гoц情女王★ 提交于 2019-11-29 16:43:31
Redis面试题 一、缓存雪崩 1.1什么是缓存雪崩? 首先为什么要使用缓存(Redis): 优点: 提高性能:缓存查询速度比数据库查询速度快(内存vs硬盘) 提高并发能力:缓存分担了部分请求。支持更高的并发 Now 如果缓存宕机了,就意味着所有的请求就都要跑去数据库了。 Redis不可能把所有的数据都缓存起来(内存昂贵且有限);所以Redis需要对数据设置过期时间,并采取采用的是惰性删除+定期删除两种策略对过期键删除。 如果缓存数据设置的时间是相同的,并且Redis恰好将在这部分数据全部删光了。这就导致了这段时间内,这些缓存同时失效,全部请求到数据库中。 这就是缓存雪崩: Redis挂掉了,请求全部走数据库。 对缓存数据设置相同的过期时间,导致某时间内缓存失效,请求全部数据库走数据。 1.2如何解决缓存雪崩 解决方法: 在缓存的时候给过期时间加上一个随机值,这样就会大幅的减少缓存在同一时间过期。 思路: 事发前:实现Redis高可用(主从架构+sentinel或者Redis Cluster),尽量避免Redis失效这种情况。 事发中:万一Redis失效了,我们可以设置本地缓存(ehcache)+限流(hystrix),尽量避免我们的数据库失效。 事发后:Redis持久化,重启后自动回复缓存数据。 二、缓存穿透 2.1什么是缓存穿透? 我们有一张数据库表,ID都是从1开始的(正数)

Redis的那些最常见面试问题[精校版]

流过昼夜 提交于 2019-11-29 14:54:12
Address: https://www.cnblogs.com/Survivalist/p/8119891.html Name: 回首笑人间 1.什么是redis?    Redis 是一个基于内存的高性能key-value数据库。  2.Reids的特点      Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。    Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。    Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 3

Redis的最常被问到知识点总结

自闭症网瘾萝莉.ら 提交于 2019-11-29 13:18:11
1.什么是redis?    Redis 是一个基于内存的高性能key-value数据库。 2.Reids的特点      Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。    Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。    Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 3.使用redis有哪些好处?    (1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1) (2

redis从入门到踩坑

狂风中的少年 提交于 2019-11-29 10:08:55
背景 Redis在互联网项目的使用也是非常普遍的,作为最常用的NO-SQL数据库,对Redis的了解已经成为了后端开发的必备技能。小编对Redis的使用时间不长,但是项目中确两次踩中了Redis的坑,今天特意从基础知识层面到实战层面对Redis知识进行梳理,能够达到对Redis的知识体系有更全面和深入的理解。 Redis的特点 优点: Key-Value类型的内存数据库,是加强版的Memcached。 整个数据库都是在内存中进行操作的,并且定期异步持久化数据到硬盘上进行保存。 在内存中进行操作,不存在磁盘IO,性能方面是非常出色的,读取操作处理速度可以超过10万次每秒,是已知性能最快的Key-Value 数据库。 Redis还提供丰富的数据结构类型。 Redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。 缺点: 数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 Redis和Memcached的比较 Redis的常用数据结构及使用场景 String String是Redis最基本的类型,一个key对应一个value,也是最常用的数据结构,在定义每个String的key的时候,记得加上前缀。一个Key最大能存储512MB,一个Value最大能存储1G。 Set

Redis-习-01-Redis分布式锁(单节点Lua脚本)

牧云@^-^@ 提交于 2019-11-29 05:45:18
文章目录 Redis-习-01-Redis分布式锁(Lua脚本) 获取锁释放锁代码 测试 代码 测试过程 Redis-习-01-Redis分布式锁(Lua脚本) SpringBoot 项目中,采用 set key value nx px 命令确保获取锁的原子性操作,使用 Lua 脚本确保释放锁的原子性操作。(仅限单节点Redis) 获取锁释放锁代码 private static final Long RELEASE_SUCCESS = 1L; private static final String LOCK_SUCCESS = "OK"; private static final String SET_IF_NOT_EXIST = "NX"; private static final String SET_WITH_EXPIRE_TIME = "EX"; private static final String RELEASE_LOCK_SCRIPT = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end"; @SuppressWarnings("rawtypes") @Autowired private RedisTemplate

数据库 | Redis 缓存雪崩解决方案

这一生的挚爱 提交于 2019-11-29 05:36:53
Redis 雪崩 缓存层承载着大量的请求,有效保护了存储层。但是如果由于缓存大量失效或者缓存整体不能提供服务,导致大量的请求到达存储层,会使存储层负载增加,这就是缓存雪崩的场景。 解决缓存雪崩,可以从以下几个方面入手。 1.保持缓存层的高可用性 使用Redis 哨兵模式或者Redis 集群部署方式,即便个别Redis 节点下线,整个缓存层依然可以使用。除此之外,还可以在多个机房部署 Redis,这样即便是机房死机,依然可以实现缓存层的高可用。 2.限流降级组件 无论是缓存层还是存储层都会有出错的概率,可以将它们视为资源。作为并发量较大的分布式系统,假如有一个资源不可用,可能会造成所有线程在获取这个资源时异常,造成整个系统不可用。降级在高并发系统中是非常正常的,比如推荐服务中,如果个性化推荐服务不可用,可以降级补充热点数据,不至于造成整个推荐服务不可用。常见的限流降级组件如 Hystrix、Sentinel 等。 3.缓存不过期 Redis 中保存的 key 永不失效,这样就不会出现大量缓存同时失效的问题,但是随之而来的就是Redis 需要更多的存储空间。 4.优化缓存过期时间 设计缓存时,为每一个 key 选择合适的过期时间,避免大量的 key 在同一时刻同时失效,造成缓存雪崩。 5.使用互斥锁重建缓存 在高并发场景下,为了避免大量的请求同时到达存储层查询数据、重建缓存