Redis面试题

Redis面试题

  • 使用Redis保存对象有几种方式?
    (1)json格式保存数据
    set key=user value={“id”=001,“name”=“张三”}
    支持跨语言,python、JavaScript、c都支持json格式的数据解析。
    (2)以二进制的方式保存数据
    序列化与反序列化,二进制的形式其实也是一个String类型的字符串
    不支持跨语言,因为它是把对象序列化,只有Java反序列化才能得到对象。
    如果是核心业务的话用二进制的方式存储不方便读代码内容,必须要反序列化成对象才能看,以json形式存储更直观。
    在这里插入图片描述

  • redis有哪些优点?
    (1)redis的数据保存在内存中,速度快,不需要进行IO操作;
    (2)支持丰富数据类型,支持string,list,hash,set,sorted set
    (3)支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
    (4)丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

  • Memcache与Redis的区别都有哪些?
    (1)存储方式
    Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
    Redis有部份存在硬盘上,这样能保证数据的持久性。
    (2)数据支持类型
    Memcache对数据类型支持相对简单。
    Redis有复杂的数据类型。
    (3)value大小
    redis最大可以达到1GB,而memcache只有1MB

Redis持久化机制
redis的数据是保存在内存中的,如果服务器宕机但还要数据不丢失,就是因为Redis持久化机制,是默认开启的。
把数据序列化的方式保存在硬盘中,重启redis后数据在从硬盘上读回来

ehcache也有持久化功能,大部分缓存框架都会有基本功能:淘汰策略,持久化机制;memberCache没有持久化机制。

  • redis持久化的方式

    先了解两个概念:
    全量同步:(定时同步)每天定时,避开高峰期,或者是采用一种周期的实现将数据拷贝到另一个地方。他的频率不是很大,可能会造成数据的丢失。比如每天10点同步数据,但是在11点的时候服务器宕机了,在这一小时内数据发生的变化就丢失了。
    增量同步:发生写的操作就同步数据,偏向实时同步数据,发生的频率比较高,对于服务器同步的压力也是比较大的,但是能尽量的保证数据不丢失

    redis持久化主要有两种:rdb和aof
    rdb方式:
    在redis中有两个线程:
    一个主线程就是执行redis请求的,还有一个fork子进程,是处理数据同步的,以定时的方式,在一段时间内,对key有修改操作,就会把整个数据记录到一个rdb文件中,如果之前已经有一个rdb文件了,他会覆盖之前的rdb文件。
    Redis默认采用的就是rdb方式实现数据持久化,以快照的形式将数据持久化到硬盘的一个二进制文件dump.rdb。它的快照频率可以在配置文件redis.conf中修改
    在redis的bin目录下dump.rdb文件与redis.conf同级
    aof方式:
    aof是一种增量同步的方式,有三种同步策略,一般使用第二种:
    (1)appendfsync always:每次有数据修改时都会把数据保存进aof文件,能够实时的保证数据的安全性(不建议使用,效率低性能不好)
    (2)appendfsync everysec:AOF的缺省策略,每秒钟同步一次,也有可能丢失数据,但是效率更高(开启aof默认使用的就是这个策略,建议使用)
    (3)appendfsync no:从不同步,高效但是数据不持久化

    下图是appendfsync everysec策略
    在这里插入图片描述
    如何开启aof:
    直接修改redis.conf中的appendonly yes
    vi redis.conf文件 开启aof同步文件
    在这里插入图片描述
    在这里插入图片描述

  • Mysql和redis如何解决数据一致性
    (1)直接清除Redis缓存,重新读取数据库。
    缺点:如果mysql中进行频繁的修改操作,那Redis中也需要频繁的清缓存和连接数据库,开销太大
    (2)使用mq异步订阅mysql的binlog日志文件,每当有写的操作就会保存到binlog文件中,mq发现binlog文件发生了改变就同步一次Redis数据。
    优点:实现同步增量
    (3)使用阿里巴巴开发的canal框架

  • Redis的内存淘汰策略
    Redis的数据保存在内存中,如果在高并发的情况下,数据有可能会被撑爆,为了防止内存撑爆而出现的一个淘汰策略。
    在redis服务器上设置一个缓存内存的阈值,超过阈值会报错。
    淘汰策略类似垃圾回收机制,内存满时淘汰掉不常用的数据(key)

    默认是使用noeviction:当内存达到阈值的时候,在执行内存申请的命令就会报错
    allkeys-lru:在所有的key中,优先移除最近未使用的key(推荐)
    volatile-lru:在过期的key中,优先移除最近未使用的key
    allkeys-random:在所有key中,随机移除key
    volatile-random:在过期的key中,随机移除key
    volatile-ttl:在过期的key中,优先移除更早过期或是没使用过得key

    设置redis淘汰策略:
    vi redis.conf 搜索 maxmemory< bytes >
    设置maxmemory 100mb
    在这里插入图片描述
    在这里插入图片描述

  • redis中的自动过期操作:
    场景:未支付的订单在30分钟之后自动取消。
    1、采用定时任务,30分钟后检查下这笔订单是否支付。但是如果每分钟都有这样的待支付订单,那就需要不停的开启定时任务,效率很差
    2、根据key的有效期回调事件
    原理:
    下订单的时候生成一条订单记录,给这条记录绑定一个token存放在redis中,token的有效期设置为30分钟。key=token,token令牌看不见保存的真实信息,比较安全,value=订单id(order_id)

    在这里插入图片描述
    对这个key绑定一个过期时间回调,执行回调方法,传递这个key,查询这个key对应的订单,如果订单还是未支付的状态,那么订单状态改为已超时的状态,如果订单已经支付了,这笔订单就完成了

    开启key自动过期机制:
    在这里插入图片描述
    最后推荐一篇文章,分析Redis持久化机制分析的很详细了:https://blog.csdn.net/qq_41688840/article/details/109695535

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值