Redis面试题

4 篇文章 0 订阅
1 篇文章 0 订阅
十八、Redis
179.redis 是什么?都有哪些使用场景?

答:

  • redis是NoSQL,
  • NoSQL泛指非关系型数据库,随着需求的增加,传统的关系型数据库已经无法应对超大规模和高并发,暴露了许多难以克服的难题。非关系型数据库得到了非常迅速的发展。
  • Redis:REmote DIctionary Server(远程字典调用)
  • 是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行,并支持持久化的NoSQL,是当前最热门的NoSQL数据库之一,也被人称为数据结构服务器。
  • 优点:
    Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
    Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
    Redis支持数据的备份,即master-slave模式的数据备份
  • 应用场景:
    内存存储和持久化:redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务
    取最新N个数据的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
    模拟类似于HttpSession这种需要设定过期时间的功能
    发布、订阅消息系统
    定时器、计数器
180.redis 有哪些功能?
  • 基于本机内存的缓存
  • 服务端的Redis
  • 持久化(Persistence)
  • 哨兵(Sentinel)和复制(Replication)
  • 集群(Cluster)
181.redis 和 memecache 有什么区别?

1.性能上:
性能上都很出色,具体到细节,由于Redis只使用单核,而Memcached可以使用多核,所以平均每一个核上Redis在存储小数据时比
Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起 Memcached,还是稍有逊色。

2.内存空间和数据量大小:
MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。

3.操作便利上:
MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。

4.可靠性上:
MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。

5.应用场景:
Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。
Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。

182.redis 为什么是单线程的?
  • 多线程的并不一定比单线程效率搞
  • redis是数据都存在内存里,然后单线程去操作。对于多线程来说是cpu模拟出来多个线程的情况,这种模拟出来的就有一个代价就是上下文切换,对于一个内存系统来说,没有上下文切换效率是最高的。
183.什么是缓存穿透?怎么解决?
  • 缓存穿透(查不到)的概念很简单,用户相要查询一个数据,发现Redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候(秒杀),缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大压力,这就是相当于缓存穿透。
    在这里插入图片描述
  • 解决方案:布隆过滤器
    布隆过滤器是一种数据结构,对所有可能查询的参数以hash形式存储,在控制层先进性校验,不符合则丢弃,从而避免了对底层存储系统的查询压力。
    在这里插入图片描述
  • 缓存空对象
    在这里插入图片描述
缓存击穿(量太大,缓存过期)
  • 概述:
  • 这里需要注意和缓存击穿的区别,缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就击破缓存,直接请求数据库,就像在屏障上凿开了一个点。
  • 当某个key在过期的瞬间,有大量的请求并发访问,这类数据一般是热点数据,由于缓存国企,会同时访问数据来查询最新数据,并且会写缓存,会导致数据库瞬间压力过大。
  • 解决方案:
  • 设置热点数据永不过期,在缓存层面来看,没有设置过期时间,所以不会出现热点问题
  • 加分布式锁:使用分布式锁,保证对于每个key同时只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,因此只需要等待即可。这种方式将高并发的压力转移到了分布式锁,因此对分布式锁的压力很大。
缓存雪崩
  • 停掉一些服务可用,双十一比如退款。
  • 降级
  • 数据预热
184.redis 支持的数据类型有哪些?

答:
String字符串
hash哈希
List列表
Set集合
zset有序集合

185.redis 支持的 java 客户端都有哪些?
186.jedis 和 redisson 有哪些区别?
187.怎么保证缓存和数据库数据的一致性?

答:

  • 1.如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。
  • 2.如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。
    因为写和读是并发的,没法保证顺序,就会出现缓存和数据库的数据不一致的问题。如何解决?这里给出两个解决方案,先易后难,结合业务和技术代价选择使用。
  • 延时双删策略
    在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。具体步骤是:
    1)先删除缓存
    2)再写数据库
    3)休眠500毫秒(根据具体的业务时间来定)
    4)再次删除缓存。
188.redis 持久化有几种方式?

答:
RDB和AOF

  • RDB中文名为快照/内存快照,它的过程很好理解,就是Redis按照一定的时间周期将目前服务中的所有数据全部写入到磁盘中。由于是周期性的同步,所以RDB存在的最大问题就是在Redis异常崩溃,需要从最近一次RDB文件恢复数据时,常常出现最近一批更新的数据丢失,而且根据快照的周期设置,这批数据的总量还可能比较大。
  • Redis还是提供了另一种数据持久化方式——AOF。AOF全称是Append Only File,从字面上理解就是“只进行增加的文件”。
189.redis 怎么实现分布式锁?

答:

  • 数据库乐观锁;

  • 基于Redis的分布式锁;

  • 基于ZooKeeper的分布式锁。

特性 满足:

  • 互斥性

  • 在任意时刻,只有一个客户端能持有锁。

  • 不能死锁

  • 客户端在持有锁的期间崩溃而没有主动解锁,也能保证后续其他客户端能加锁。

  • 容错性

  • 只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。

190.redis 分布式锁有什么缺陷?
191.redis 如何做内存优化?
192.redis 淘汰策略有哪些?
193.redis 常见的性能问题有哪些?该如何解决?
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值