面试之redis

1、redis的数据持久化方式有哪些?

redis持久化有两种,RDB(Redis DataBase)和AOF(Append Only File)。持久化就是把内存的数据写到磁盘中去,防止服务宕机,内存数据丢失。
RDB其实就是把数据以快照的形式保存在磁盘上。默认开启。可以理解成把当前时刻的数据拍成一张照片保存下来。RDB持久化是指在指定的时间间隔内将内存中的数据集快照写入磁盘。也是默认的持久化方式,这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。容易丢失数据,重启后恢复数据速度比AOF快,因为RDB文件中直接存储的时内存数据。
AOF是将每条写命令作为日志,以append-only模式写入一个日志文件,在Redis重启时,通过回放日志中的写入指令来重构整个数据。两种触发方式:每修改同步(always)、每秒同步(everysec)。AOF日志一般比RDB快照更大,更好的避免数据丢失。

2、redis数据淘汰策略有几种?

为尽量避免redis内存占用过多,合理使用内存,可手动修改maxmemory参数,指定一种有效的数据淘汰策略。redis5.0为我们提供了八个不同的内存置换策略,很早之前提供了6种。
volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。
volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰。
volatile-random:从已设置过期时间的数据集中任意选择数据淘汰。
volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰。
allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰。
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据,这也是默认策略。意思是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失。
最好为Redis指定一种有效的数据淘汰策略以配合maxmemory设置,避免在内存使用满后发生写入失败的情况。

3、redis键的过期删除策略有哪些?

Redis采用的是定期删除 + 懒惰删除策略。1定时删除,定时删除是在设置key的过期时间的同时,redis会创建一个定时器(timer)。在key的过期时间到时,立即执行对key的删除操作。优点保证内存被尽快释放,缺点比较耗性能耗CPU。2定期删除,每隔一段时间,程序就对部分的缓存数据进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库, 则由算法决定。缺点限制删除操作执行的时长和频率需要合理地设置。优点可有效地减少因为过期key而带来的内存浪费。3懒惰删除,放任键过期不管,每次获取key时,都会检查取得的key是否过期,如果过期,则删除该key。优点耗CPU资料少。缺点是可能造成大量过期缓存数据堆积,造成内存浪费。

4、redis支持哪几种数据类型存储?

redis支持五种数据类型:字符串(string),哈希(hash),列表(list),集合(set)、有序集合(zset)。

5、什么是redis缓存雪崩、缓存穿透、缓存击穿?如何解决?

缓存雪崩:大量缓存数据key同时失效,所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机,造成系统的崩溃。解决:1设置对应热点key永不过期,2均摊分配key的失效时间,3加二级缓存ehchache
缓存穿透:指查询一个数据库一定不存在的数据。此类数据缓存也一定不存在,所有请求会直接打在db上,造成宕机,从而影响整个系统。解决:1在接口层增加校验,屏蔽不合法参数请求。2添加特殊值为key的缓存,例如空缓存。3在网关中设置ip请求阈值。
缓存击穿:击穿是指数据在数据库中真实存在,只是缓存丢失,大量请求击穿数据库。

6、如何实现redis高可用?

为避免redis单点故障,提高可用性。redis sentinel是redis高可用的实现方案,即哨兵模式。哨兵模式能自动完成故障发现和故障转移,并通知应用方,从而实现高可用。哨兵节点作为独立的节点运行。哨兵模式原理是,对redis每个节点使用心跳机制进行可用性监控,一旦发现 Redis 主节点失效,将选举出一个其他节点作为领导者。同时,哨兵可向指定的对象发送故障提醒,提醒及时手动修复故障节点。详细见https://blog.csdn.net/a281246240/article/details/84377876

7、redis通信协议是什么?

Redis客户端和服务器端通信使用名为 RESP (REdis Serialization Protocol) 的协议。这个协议是专门为Redis设计。特点是解析速度快。

8、如何保证redis与mysql数据一致性?

采用方案:双删策略。在更新mysql数据的前后都删除redis缓存。涉及到数据更新操作时,由于需要更新数据库和缓存,就容易出现缓存(Redis)和数据库(MySQL)间的数据一致性问题。不管是先更新缓存还是后更新缓存都有可能出现脏数据问题,所以采用延时双删策略,在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。

9、redis读写读取如何?redis为什么处理速度快?

1、redis是面向内存操作,数据都存放在内存当中,读写数据的时候都不会受到硬盘 I/O 速度的限制,所以速度极快。写操作8万/秒,读10万/秒。2、Redis采用单线程,避免了不必要的上下文切换和竞争。3键值对数据结构查询时间短。、

10、redis如何实现分布式锁?原理?

分布式锁与我们平常讲到的锁原理基本一样,目的就是确保在多个线程并发时,只有一个线程在同一刻操作获取到资源,在一个进程中,也就是一个jvm或者说应用中,我们很容易去处理控制,在java.util并发包中已经为我们提供了这些方法去加锁,比如synchronized关键字或者Lock锁,都可以处理。但是如果在分布式环境下,要保证多个线程同时只有1个能访问某个资源,就需要用到分布式锁。这里我们将介绍用Redis的setnx命令来实现分布式锁。

使用Spring-data-redis,基于redis的setnx()、expire()方法实现分布式锁,setnx()命令,setnx的含义就是SET if Not Exists,其主要有两个参数 setnx(key, value)。该方法是原子的,如果 SETNX 返回1,说明该线程获得锁;如果 SETNX 返回0,说明其他线程已经获得了锁,线程不能进入临界区。线程可以在一个循环中不断地尝试 SETNX 操作,以获得锁。但是要注意的是setnx命令不能设置key的超时时间,只能通过expire()来对key设置。

具体的使用步骤如下:1、setnx(lockkey, 1) 如果返回0,则说明占位失败;如果返回1,则说明占位成功。2、expire()命令对lockkey设置超时时间,为的是避免死锁问题。3、执行完业务代码后,通过delete命令删除key。

if (redisTemplate.opsForValue().setIfAbsent(lockKey, expiresStr)) {
                locked = true;
                // 设置锁的有效期,也是锁的自动释放时间,也是一个客户端在其他客户端能抢占锁之前可以执行任务的时间
                // 可以防止因异常情况无法释放锁而造成死锁情况的发生
                redisTemplate.expire(lockKey, expireTime, TimeUnit.SECONDS);
                // 上锁成功结束请求
                return true;
            }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值