大宇java面试系列(三):Redis常见面试题

1. Redis 是什么?都有哪些使用场景?node

咱们先来理解经典的CAP理论nginx

一致性:是指从数据层面来看的一致性。程序员

可用性:是指从系统层面的可用性。web

容错性:是指从网络层面的的容错性。redis

数据库逐渐从关系数据库向不一样领域不一样层次分化。随着读多写少场景的出现,致使须要读取数据的时间变慢,为了提高性能,出现了数据库缓存技术,对数据库的读取进行分离。web2.0时代,网民的生产力大增,存储总量也在增长,目前仍是读多写少模式,原有的缓存技术显然不能知足写的压力,因此,出现了分库分表,实现读写分离。其中比较经常使用的一种缓存技术是用Redis作缓存。数据库

Redis是什么?缓存

Redis是一个基于内存且支持持久化的key-value的NoSQL数据库,其中每一个key和value都是使用对象表示的,具备以如下特征:多样数据类型、持久化、主从同步。服务器

和Memcached相似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操做,并且这些操做都是原子性的。微信

在此基础上,redis支持各类不一样方式的排序。与memcached同样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的使用RDB快照的方式,把更新的数据写入磁盘或者使用相似MySQL的AOF日志方式把修改操做写入追加的记录文件,而且在此基础上实现了master-slave(主从)同步。Redis支持将数据同步到多台从数据库上,这种特性对提升读取性能很是有益。网络

Redis3.0版本容许单点故障,它没有中心节点,各个节点地位同样,扩展性很好,节点间的采用二进制通讯,节点与客户端采用ascII协议通讯。

综上所述,Redis可用于缓存、数据库、消息中间件。

 

Redis 使用场景:

  • 记录帖子点赞数、点击数、评论数;

  • 缓存近期热帖;

  • 缓存文章详情信息;

  • 记录用户会话信息。

2. Redis 有哪些功能?

  • 数据缓存功能

  • 分布式锁的功能

  • 支持数据持久化

  • 支持事务

  • 支持消息队列

3. Redis 和 memcache 有什么区别?

  • 存储方式不一样:memcache 把数据所有存在内存之中,断电后会挂掉,数据不能超过内存大小;Redis 有部份存在硬盘上,这样能保证数据的持久性。

  • 数据支持类型:memcache 对数据类型支持相对简单;Redis 有复杂的数据类型。

  • 使用底层模型不一样:它们之间底层实现方式,以及与客户端之间通讯的应用协议不同,Redis 本身构建了 vm 机制,由于通常的系统调用系统函数的话,会浪费必定的时间去移动和请求。

  • value 值大小不一样:Redis 最大能够达到 1gb;memcache 只有 1mb。

4. Redis 为何是单线程的?

由于 cpu 不是 Redis 的瓶颈,Redis 的瓶颈最有多是机器内存或者网络带宽。既然单线程容易实现,并且 cpu 又不会成为瓶颈,那就瓜熟蒂落地采用单线程的方案了。

关于 Redis 的性能,官方网站也有,普通笔记本轻松处理每秒几十万的请求。

并且单线程并不表明就慢 nginx 和 nodejs 也都是高性能单线程的表明。

5. 什么是缓存穿透?怎么解决?

缓存穿透:指查询一个必定不存在的数据,因为缓存是不命中时须要从数据库查询,查不到数据则不写入缓存,这将致使这个不存在的数据每次请求都要到数据库去查询,形成缓存穿透。

解决方案:最简单粗暴的方法若是一个查询返回的数据为空(不论是数据不存在,仍是系统故障),咱们就把这个空结果进行缓存,但它的过时时间会很短,最长不超过五分钟。

6. Redis 支持的数据类型有哪些?

Redis 支持的数据类型:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)。

7. Redis 支持的 Java 客户端都有哪些?

支持的 Java 客户端有 Redisson、jedis、lettuce 等。

8. jedis 和 Redisson 有哪些区别?

  • jedis:提供了比较全面的 Redis 命令的支持。

  • Redisson:实现了分布式和可扩展的 Java 数据结构,与 jedis 相比 Redisson 的功能相对简单,不支持排序、事务、管道、分区等 Redis 特性。

9. 怎么保证缓存和数据库数据的一致性?

  • 合理设置缓存的过时时间。

  • 新增、更改、删除数据库操做时同步更新 Redis,可使用事物机制来保证数据的一致性。

10. Redis 持久化有几种方式?

Redis 的持久化有两种方式,或者说有两种策略:

  • RDB(Redis Database):指定的时间间隔能对你的数据进行快照存储。

  • AOF(Append Only File):每个收到的写命令都经过write函数追加到文件中。

11. Redis 怎么实现分布式锁?

Redis 分布式锁其实就是在系统里面占一个“坑”,其余程序也要占“坑”的时候,占用成功了就能够继续执行,失败了就只能放弃或稍后重试。

占坑通常使用 setnx(set if not exists)指令,只容许被一个程序占有,使用完调用 del 释放锁。

12. Redis 分布式锁有什么缺陷?

Redis 分布式锁不能解决超时的问题,分布式锁有一个超时时间,程序的执行若是超出了锁的超时时间就会出现问题。

13. Redis 如何作内存优化?

尽可能使用 Redis 的散列表,把相关的信息放到散列表里面存储,而不是把每一个字段单独存储,这样能够有效的减小内存使用。好比将 Web 系统的用户对象,应该放到散列表里面再总体存储到 Redis,而不是把用户的姓名、年龄、密码、邮箱等字段分别设置 key 进行存储。

14. Redis 淘汰策略有哪些?

  • volatile-lru:从已设置过时时间的数据集(server. db[i]. expires)中挑选最近最少使用的数据淘汰。

  • volatile-ttl:从已设置过时时间的数据集(server. db[i]. expires)中挑选将要过时的数据淘汰。

  • volatile-random:从已设置过时时间的数据集(server. db[i]. expires)中任意选择数据淘汰。

  • allkeys-lru:从数据集(server. db[i]. dict)中挑选最近最少使用的数据淘汰。

  • allkeys-random:从数据集(server. db[i]. dict)中任意选择数据淘汰。

  • no-enviction(驱逐):禁止驱逐数据。

15. Redis 常见的性能问题有哪些?该如何解决?

  • 主服务器写内存快照,会阻塞主线程的工做,当快照比较大时对性能影响是很是大的,会间断性暂停服务,因此主服务器最好不要写内存快照。

  • Redis 主从复制的性能问题,为了主从复制的速度和链接的稳定性,主从库最好在同一个局域网内。

若是您感受文章对您有所帮助,请让更多人看到!

1.点赞此篇文章,并评论一句!

2.转发此篇文章 给予做者支持!

3.微信搜索 ~ 关注微信公众号:程序员知识码头  获取全套学习资料一份!

微信扫码关注:天天准时发技术文章!还能加入专属的学习交流社群!

点赞!好文要顶哦~

相关文章
相关标签/搜索