zoukankan      html  css  js  c++  java
  • 菜鸟刷面试题(三、Redis篇)

    目录:

    • redis是什么?都有哪些使用场景?
    • redis有哪些功能?
    • redis和memecache有什么区别?
    • redis为什么是单线程的?
    • 什么是缓存穿透?怎么解决?
    • redis支持的数据类型有哪些?
    • redis支持的java客户端都有哪些?
    • jedis和 redisson 有哪些区别?
    • 怎么保证缓存和数据库数据的一致性?
    • redis持久化有几种方式?
    • redis怎么实现分布式锁?
    • redis分布式锁有什么缺陷?
    • redis如何做内存优化?
    • redis淘汰策略有哪些?

    redis是什么?都有哪些使用场景?

    1、Redis是一款开源的、基于C语言编写的key value数据库,其数据读写基于内存,性能高。

    2、Redis使用场景很多:

    • 可作用于底层DB的缓存层
    • 分布式锁
    • 使用list做热点数据排行
    • GEO做地理位置统计
    • 等等。。。。。。

    redis有哪些功能?

    数据持久化、事务、发布订阅消息、主从复制、集群、哨兵等等。

    redis和memecache有什么区别?

    memecache目前仅支持k/v类型的数据存储,而redis支持的存储方式更加丰富

    memecache挂掉了数据就没了,redis有持久化策略。

    。。。。。。

    redis为什么是单线程的?

    我们首先要知道Redis是一个高效的key/value数据库,且采用内存读写数据

    那么既然是内存读写数据的话单线程的效率肯定是最高的,因为多线程的本质就是CPU模拟出来多个线程的情况,这种模拟出来的线程势必会有上下文切换的消耗,所以对于内存系统来说没有上下文的切换就是最高效的

    参考:https://blog.csdn.net/world6/article/details/79381682

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

    1、什么是缓存穿透:缓存穿透查询一个根本不存在的数据,导致每次请求都不会命中缓存,请求都进到DB,导致DB压力过大而降低DB吞吐量,严重时可能会让DB宕机;一般是自身业务代码或数据出现问题,或是一个恶意攻击、爬虫等造成的。

    2、怎么解决:

    • 缓存null值,将那些不可能存在的数据也做一层缓存,如缓存值为null;这样便不会将这些数据命中到DB层了。
    • 布隆过滤器

    redis支持的数据类型有哪些?

    String、List、Hash、Set、Sorted Set。

    可以再细说下编码以及这些数据类型的特性等等。

    redis支持的java客户端都有哪些?

    Jedis、Redisson、lettuce等等,官方推荐使用Redisson

    jedis和redisson有哪些区别?

    简介:

    • Jedis:redis的java客户端的实现,提供了比较全面的redis命令支持。
    • Redisson:实现了分布式和可扩展的Java数据结构。

    区别:

    • 封装:jedis只是简单封装了redis的api库,它的方法和redis命令类似;redisson不仅封装了redis命令,还封装了更多的数据结构以及锁等功能。
    • 灵活性:jedis对于redisson来说更加灵活。

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

    1、读数据:先读缓存,后读数据库。

    2、写数据:先写数据库,后写缓存。

    3、每次更新数据都要把缓存清掉。

    4、缓存设置过期时间,保持与数据库的最终一致性。

    参考:https://blog.csdn.net/cwb521sxm/article/details/96182882

    redis持久化有几种方式?

    见:https://www.cnblogs.com/bzfsdr/p/12043669.html Redis持久化

    redis怎么实现分布式锁?

    1、手动实现:如果key存在则返回已锁,不存在则加锁,还可以设置锁的时间,并需要及时解锁。

    2、使用redisson api实现

    redis分布式锁有什么缺陷?

    1、可能会造成死锁

    客户端A获取锁成功了,但释放锁的时候崩溃了,导致锁依然存在。我们可以通过设置过期时间来解决这一问题。

    2、错误的获取锁

    上面说到可以设置过期时间来预防死锁,但若客户端A执行之间过长或因为某些原因导致客户端A阻塞了,这是锁可能已经过期了,然后客户端B又拿到了锁。

    此时客户端A又恢复了过来,这样便会有两个线程执行操作,导致最终的数据不一致。

    参考:https://blog.csdn.net/twt936457991/article/details/90181855

    redis如何做内存优化?

    1、设置内存上限:maxmemory

    2、可根据实际情况调整内存淘汰策略

    3、压缩键值对的长度

    4、尽可能的使用hash结构,减少key的数量(对ziplist编码的妙用)

    redis淘汰策略有哪些?

    见:https://www.cnblogs.com/bzfsdr/p/12043669.html 缓存设计第a节

  • 相关阅读:
    转载:[Java面经]干货整理, Java面试题(覆盖Java基础,Java高级,JavaEE,数据库,设计模式等)
    转载:《理解OAuth 2.0》 阮一峰
    转载:《RESTful API 设计指南》 阮一峰
    转载:《理解RESTful架构》 阮一峰
    转载:2.2.5 在配置中使用变量《深入理解Nginx》(陶辉)
    转载:2.2.4 配置项的单位《深入理解Nginx》(陶辉)
    转载:2.2.3 配置项的注释《深入理解Nginx》(陶辉)
    SQL & PL/SQL 模块总结
    一些比较好的shellscript脚本
    11 高级优化技术
  • 原文地址:https://www.cnblogs.com/bzfsdr/p/12050008.html
Copyright © 2011-2022 走看看