JAVA面试题库-Redis相关面试题

1、最直接的问题,为啥用Redis?

因为传统的关系型数据库如Mysql已经不能适⽤所有的场景了,比如秒杀的库存扣减,APP⾸⻚的访问流量⾼峰等等,都很容易把数据库打崩,所以引⼊了缓存中间件,⽬前市⾯上比较常用的缓存中间件Redis 和 Memcached 不过中和考虑了他们的优缺点,最后选择了Redis。

2、redis 和 memcached区别是什么?

  1. 数据类型不同,redis有五种(list set string hash zset),memcached只有一种string
  2. Redis支持数据的备份,即master-slave模式的数据备份。
  3. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  4. 内存的使用率上memcached数据结构简单 只有一种string ,不用记录数据的类型。而reids需要记录。
  5. redis 只使用单核,而 memcached 可以使用多核,所以平均每一个核上 redis 在存储小数据时比 memcached 性能更高。而在 100k 以上的数据中,memcached 性能要高于 redis。

3、Redis有哪些数据结构呀?

字符串String、字典Hash、列表List、集合Set、有序集合SortedSet

4、Redis是怎么持久化的?服务主从数据怎么交互的?

RDB做镜像全量持久化,AOF做增量持久化。因为RDB会耗费较⻓时间,不够实时,在停机的时候会导致⼤量丢失数据,所以需要AOF来配合使⽤。在redis实例重启时,会使⽤RDB持久化⽂件重新构建内存,再使⽤AOF重放近期的操作指令来实现完整恢复重启之前的状态。

这⾥很好理解,把RDB理解为⼀整个表全量的数据,AOF理解为每次操作的⽇志就好了,服务器重启的时候先把表的数据全部搞进去,但是他可能不完整,你再回放⼀下⽇志,数据不就完整了嘛。不过Redis本身的机制是 AOF持久化开启且存在AOF⽂件时,优先加载AOF⽂件;AOF关闭或者AOF⽂件不存在时,加载RDB⽂件;加载AOF/RDB⽂件城后,Redis启动成功; AOF/RDB⽂件存在错误时,Redis启动失败并打印错误信息

5、Redis 有哪些架构模式?讲讲各自的特点

  1. 单机版
    特点:简单。
    问题:1、内存容量有限 2、处理能力有限 3、无法高可用。

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

    特点:1、master/slave 角色 2、master/slave 数据相同 3、降低 master 读压力在转交从库
    问题:无法保证高可用 没有解决 master 写的压力

  3. 哨兵
    Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。

    特点:1、保证高可用 2、监控各个节点 3、自动故障迁移
    问题:主从模式,切换需要时间丢数据,没有解决 master 写的压力

  4. 集群(proxy 型)
    Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器; Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和 redis 协议。
    特点:
    1、多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins
    2、支持失败节点自动删除
    3、后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致
    问题:
    1、增加了新的 proxy,需要维护其高可用。
    2、failover 逻辑需要自己实现,其本身不能支持故障的自动转移可扩展性差,进行扩缩容都需要手动干预

  5. 集群(直连型)
    从redis 3.0之后版本支持redis-cluster集群,Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。
    特点:

    1、无中心架构(不存在哪个节点影响性能瓶颈),少了 proxy 层。

    2、数据按照 slot 存储分布在多个节点,节点间数据共享,可动态调整数据分布。

    3、可扩展性,可线性扩展到 1000 个节点,节点可动态添加或删除。

    4、高可用性,部分节点不可用时,集群仍可用。通过增加 Slave 做备份数据副本

    5、实现故障自动 failover,节点之间通过 gossip 协议交换状态信息,用投票机制完成 Slave到 Master 的角色提升。

    缺点:

    1、资源隔离性较差,容易出现相互影响的情况。

    2、数据通过异步复制,不保证数据的强一致性

6、Redis常用命令?

1、查询键 keys * 查询所有的键,会遍历所有的键值,复杂度O(n)
2、键总数 dbsize 查询键总数,直接获取redis内置的键总数变量,复杂度O(1)
3、检查键是否存在 exists key 存在返回1,不存在返回0
4、删除键O(k) del key [key…] 返回结果为成功删除键的个数
5、键的数据结构类型 type key 如果键hello是字符串类型,则返回string;如果键不存在,则返回none
6、键重命名 rename key newkey
7、切换数据库 select dbIndex
8、设置值 O(1) set key value
9、获取值O(1) get key 不存在则返回nil
10、批量设置值O(k) mset key value [key value …] eg:mset a 1 b 2 c 3 d 4
11、追加值O(1) append key value 可以向字符串尾部追加值

7、使用过Redis分布式锁么,它是怎么实现的?

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值