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

    一、Redis支持的数据类型?

    String字符串:

    格式: set key value

    string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

    string类型是Redis最基本的数据类型,一个键最大能存储512MB。

    Hash(哈希)

    格式: hmset name  key1 value1 key2 value2

    Redis hash 是一个键值(key=>value)对集合。

    Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

    List(列表)

    Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

    格式: lpush  name  value

    在 key 对应 list 的头部添加字符串元素

    格式: rpush  name  value

    在 key 对应 list 的尾部添加字符串元素

    格式: lrem name  index

    key 对应 list 中删除 count 个和 value 相同的元素

    格式: llen name  

    返回 key 对应 list 的长度

    Set(集合)

    格式: sadd  name  value

    Redis的Set是string类型的无序集合。

    集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

    zset(sorted set:有序集合)

    格式: zadd  name score value

    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

    不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

    zset的成员是唯一的,但分数(score)却可以重复。

    二、什么是Redis持久化?Redis有哪几种持久化方式?优缺点是什么?

      持久化就是把内存的数据写到磁盘中去,防止服务宕机了内存数据丢失。

      Redis 提供了两种持久化方式:RDB(默认) 和AOF 

    RDB:将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化

      rdb是Redis DataBase缩写

      功能核心函数rdbSave(生成RDB文件)和rdbLoad(从文件加载内存)两个函数

    AOF: 将Reids的操作日志以追加的方式写入文件

      Aof是Append-only file缩写

      每当执行服务器(定时)任务或者函数时flushAppendOnlyFile 函数都会被调用, 这个函数执行以下两个工作

      aof写入保存:

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

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

    存储结构:

        内容是redis通讯协议(RESP )格式的命令文本存储。

    比较

      1、aof文件比rdb更新频率高,优先使用aof还原数据。

      2、aof比rdb更安全也更大

      3、rdb性能比aof好

      4、如果两个都配了优先加载AOF

    刚刚上面你有提到redis通讯协议(RESP ),能解释下什么是RESP?有什么特点?(可以看到很多面试其实都是连环炮,面试官其实在等着你回答到这个点,如果你答上了对你的评价就又加了一分)

    RESP 是redis客户端和服务端之前使用的一种通讯协议;

    RESP 的特点:实现简单、快速解析、可读性好

    For Simple Strings the first byte of the reply is "+" 回复

    For Errors the first byte of the reply is "-" 错误

    For Integers the first byte of the reply is ":" 整数

    For Bulk Strings the first byte of the reply is "$" 字符串

    For Arrays the first byte of the reply is "*" 数组

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

    单机版

    特点:简单

    问题:

    1、内存容量有限 2、处理能力有限 3、无法高可用

    主从复制

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

    特点:

      1、master/slave 角色

      2、master/slave 数据相同

      3、降低 master 读压力在转交从库

    问题:

    无法保证高可用

    没有解决 master 写的压力

    哨兵

    Redis sentinel 是一个分布式系统中监控 redis 主从服务器,并在主服务器下线时自动进行故障转移。其中三个特性:

    监控(Monitoring):    Sentinel  会不断地检查你的主服务器和从服务器是否运作正常。

    提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。

    自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作。

    特点:

    1、保证高可用

    2、监控各个节点

    3、自动故障迁移

    缺点:主从模式,切换需要时间丢数据

    没有解决 master 写的压力

    集群(proxy 型):

    Twemproxy 是一个 Twitter 开源的一个 redis 和 memcache 快速/轻量级代理服务器; Twemproxy 是一个快速的单线程代理程序,支持 Memcached ASCII 协议和 redis 协议。

    特点:1、多种 hash 算法:MD5、CRC16、CRC32、CRC32a、hsieh、murmur、Jenkins 

    2、支持失败节点自动删除

    3、后端 Sharding 分片逻辑对业务透明,业务方的读写方式和操作单个 Redis 一致

    缺点:增加了新的 proxy,需要维护其高可用。

    failover 逻辑需要自己实现,其本身不能支持故障的自动转移可扩展性差,进行扩缩容都需要手动干预

    集群(直连型):

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

    特点:

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

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

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

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

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

    缺点:

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

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

    redis 六种数据淘汰策略

    volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放;

    allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据释放;

    volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放;

    allkeys-random:从数据集中(包括了设置过期时间以及未设置过期时间)随机选择一个数据进行入释放;

    volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作;

    noeviction:不删除任意数据(但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误

    ----------------------------------------------------------------------------------------------------------------------------

    https://www.cnblogs.com/jasontec/p/9699242.html

  • 相关阅读:
    java设计模式之建造者模式
    java设计模式之工厂模式
    Java并发—简介与线程创建
    Java基础—反射(转载)
    Eclipse中svn操作
    js常用方法总结
    Oracle学习笔记—常用函数
    Oracle学习笔记—connect、resource和dba三种权限(转载)
    JavaWeb—拦截器Interceptor
    JavaWeb—监听器Listener
  • 原文地址:https://www.cnblogs.com/Jomini/p/13679242.html
Copyright © 2011-2022 走看看