面试题:Redis 部分

面试题:Redis 部分

完成:第一遍

  1. Redis 是什么?都有哪些使用场景?
    是由意大利人开发的一款内存高速缓存数据库。全称为远程数据服务,该软件用c语言编写,是一个key-value存储系统,支持丰富的数据类型
    众多语言都支持Redis,因为Redis交换数据快,所以在服务器中常用来存储一些需要频繁调取的数据,这样可以大大节省系统直接读取磁盘来获得数据的I/O开销,更重要的是可以极大提升速度。
    拿大型网站来举个例子,比如a网站首页一天有100万人访问,其中有一个板块为推荐新闻。要是直接从数据库查询,那么一天就要多消耗100万次数据库请求。上面已经说过,Redis支持丰富的数据类型,所以这完全可以用Redis来完成,将这种热点数据存到Redis(内存)中,要用的时候,直接从内存取,极大的提高了速度和节约了服务器的开销。
  2. Redis 有哪些功能?
    慢查询、缓存
  3. Redis 和 MemeCache 有什么区别?
    1.与Memached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富的多:String、hash、List、Set和Sort Set。Redis内部使用一个redisObject对象来表示所有的key和value
    2.内存管理机制不同,并不是所有的数据都是一直存储在内存中的。当物理内存用完时,Redis可以将一些很久没用到的value交换到磁盘
    3.数据持久化支持。Redis虽然是基于内存的存储系统,但它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志。而memcached是不支持数据持久化操作的
    4.集群管理不同。memcached是全内存的数据缓冲系统,redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。
  4. Redis 为什么是单线程的?
    以前有个误区,认为高性能服务器一定是多线程来实现的,其实不然,redis核心就是如果我的数据全在内存里,单线程的区操作效率是最高的。因为多线程的本质就是COU模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis用单个CPU绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPu上完成的,所以它是单线程处理
  5. 什么是缓存穿透?怎么解决?
    缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存
  6. Redis 支持的数据类型有哪些?
    String,hash,list,set,zset
  7. Redis 支持的 Java 客户端都有哪些?
    Redission、jedis,lettuce,官方推荐使用Redisson
  8. Jedis 和 Redisson 有哪些区别?
    Jedis时java实现redis的客户端,它的Api提供了全面类似于Redis原生命令的支持。相比于其他Redis封装框架更加原生。它的使用主要是使用JedisPool
    Redisson是一个在Redis的基础上实现的Java驻内存数据网格。它不仅提供了一系列额分布式的java常用对象,还提供了许多分布式服务
  9. 怎么保证缓存和数据库数据的一致性?
    我们只能采取合适的策略来降低缓存和数据库间数据不一致的概率,而无法保证两者间的强一致性。合适的策略包括 合适的缓存更新策略,更新数据库后要及时更新缓存、缓存失败时增加重试机制,例如MQ模式的消息队列。
  10. Redis 持久化有几种方式?
    RDB与AOF两种方式
  11. Redis 怎么实现分布式锁?
    1)setNx一个锁key,相应的value为当前时间加上过期时间的时钟
    2)如果setNx成功,或者当前时钟大于此时key对应的时钟则加锁成功,否则加锁失败退出
    3)加锁成功执行相应的业务操作
    4)释放锁时判断当前时钟是否小于锁key的value,如果当前时钟小于锁key对应的value对应的value则执行删除锁key的操作
  12. Redis 分布式锁有什么缺陷?
    对于单点的redis能很好的实现分布式锁,如果redis集群,会出现master宕机的情况。如果master宕机,此时锁key还没有同步到slave节点上,会出现机器B从新的master上获取了一个重复的锁
  13. Redis 如何做内存优化?
    1)redisObject对象
    2)缩减键值对象
    3)共享对象池
    4)字符串优化
    5)编码优化
    6)控制key的数量
  14. Redis 淘汰策略有哪些?
    1)voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

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

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

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

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

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

  1. Redis 常见的性能问题有哪些?该如何解决?
    1.Master写内存快照
    2.Master AOF持久化
    3.Master调用BGREWRITEAOF
    4.Redis主从复制的性能问题
    5.单点故障问题
    总结:Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化。
    如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
    为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内。
    尽量避免在压力较大的主库上增加从库
    为了Master的稳定性,主从复制不要用图状结构,用单向链表结构更稳定,即主从关系为:Master<–Slave1<–Slave2<–Slave3…….,这样的结构也方便解决单点故障问题,实现Slave对 Master的替换,也即,如果Master挂了,可以立马启用Slave1做Master,其他不变。

你可能感兴趣的:(【Redis】)