zoukankan      html  css  js  c++  java
  • 【面试】Redis

    1.如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?

    1. set指令有非常复杂的参数,这个应该是可以同时setnx和expire合成一条指令来用的!

    2.使用过Redis分布式锁吗?它是如何实现的?

    1. 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。

    3.使用过Redis做异步队列吗?是怎么用的,有什么缺点?

    1. 一般会用list结构作为消息队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如RabbitMQ等。

    4.能不能生产一次消费多次?

    1. 使用pub/sub主题订阅者模式,可以实现1:N的消息队列。

    5.什么是缓存穿透?如何避免?什么是缓存雪崩?如何避免?

      缓存穿透:

        一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如:DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。叫做恶意穿透。

      如何避免:

    1. 对查询为空的结果可以进行缓存,缓存时间设置短一些,或者该key对应的数据insert了之后清理缓存。
    2. 对一定不存在的key进行过滤。可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。

      缓存雪崩:

        当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统造成很大的压力,导致系统奔溃。

      如何避免?

    1. 在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程读数据和写缓存,其他线程等待。
    2. 做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期。
    3. 不同的key,设置不同的过期时间,让缓存的失效时间尽量均匀。

    6.什么是Redis持久化,Redis持久化的方式有几种?优缺点是什么?

    1. 持久化就是把内存的数据放到磁盘中去,防止服务器宕机导致内存数据丢失。
    2. Redis提供了2中持久化方式:RDB(默认)和AOF

        RDB:把缓存中数据保存到磁盘中。

        AOF写入保存:

        WRITE:根据条件,将aof_buf中的缓存写入到AOF文件中

        SAVE:根据条件,调用 fsync 或者 fdatasync 函数,将AOF文件保存到磁盘中。

        比较:

      1. aof文件比rdb更新频率高,优先使用aof还原数据。
      2. aof比rdb更安全也更大
      3. rdb性能比aof好
      4. 如果两个都配了优先加载AOF

    7.Redis 有哪些架构模式?讲讲各自的特点

    1. 客户端到服务端直接缓存,特点:简单,问题:1、内存容量有限,2、处理能力有限,3、无法高可用
    2. 从主服务器复制到从服务器,比较复杂一点:

       Redis的复制(replication)功能允许用户根据一个Redis服务器来创建任意多个该服务器的复制品,其中被复制的服务器为主服务器(master),而通过复制创建出来的服务器复制品则为从服务器(slave)。只要主从服务器之间的网络链接正常,主从服务器两者会具有相同的数据,主服务器就会一直将发生在自己身上的数据更新同步到从服务器,从而一直保证主从服务器数据相同。


    8.Redis的数据类型有哪些?

    1. Set、List、String、Sorted Set、Hashes

    9.Redis主要消耗什么物理资源

    1. 内存

    10.Redis官方为什么不提供Windows版本?

    1. 因为目前Linux版本已经相当稳定,而且用户量也很大,无需开发windows版本,反而会带来版本兼容性等问题。

    11.一个字符串类型的值能存储最大容量是多少?

    1. 512M

    12.怎么理解Redis事务?

    1. 事务是一个单独的隔离操作:事务中所有命令都会序列化,按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
    2. 事务是一个原子操作:事务中的命令要么全部执行,要么全部都不执行。
  • 相关阅读:
    Ubuntu16.04安装Docker、nvidia-docker
    Java 对象和类
    Java基础知识总结
    Java 学习路线
    编写radware的负载配置
    MySQL的主从复制+双主模式
    模拟MBR Grub故障修复
    搭建Nginx(haproxy)+keepalived+Tomcat双主高可用负载均衡
    golang数据库操作初体验
    我操蛋的2019
  • 原文地址:https://www.cnblogs.com/EveningWind/p/11236874.html
Copyright © 2011-2022 走看看