Redis常见面试题总结

1.列举至少3个非关系型数据库,简单描述他们的特性

Memcached
 很早出现的NoSql数据库
 数据都在内存中,一般不持久化
 支持简单的key-value模式
 一般是作为缓存数据库辅助持久化的数据库
Redis
 几乎覆盖了Memcached的绝大部分功能
 数据都在内存中,支持持久化,主要用作备份恢复
 除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。
 一般是作为缓存数据库辅助持久化的数据库
mongoDB
 高性能、开源、模式自由(schema  free)的文档型数据库
 数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘
 虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能
 支持二进制数据及大型对象
 可以根据数据的特点替代RDBMS ,成为独立的数据库。或者配合RDBMS,存储特定的数据。

2.reids常用的数据类型有哪些?(介绍一下各数据类型的特点)

string(字符串)
 String是Redis最基本的类型,一个key对应一个value。
 String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
 String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
list(链表)
 单键多值
 如果键不存在,创建新的链表
 如果键已经存在,则新增链表内容
 如果值全部移除,对于的键也会随之消失
 链表的操作无论是从头或者尾执行效率都很高,但是如果从中间对元素进行操作,效率会下降。
set(集合)
 Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
zset(sorted set --有序集合)
 Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的所有成员都关联了一个评分(score) ,
 这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复的 。
 因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。访问有序集合的中间元素也是非常快的,
 因此你能够使用有序集合作为一个没有重复成员的智能列表。
hash(哈希类型)
 Redis  hash 是一个键值对集合。
 Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
 类似Java里面的Map<String,Object>

3.redis的持久化方式是什么?分别有什么特点?如何选取持久化方式?(或者问Redis的数据持久化方式有哪些?如何进行的持久化?如何选取持久化方式?)

RDB
 节省磁盘空间
 恢复速度快
 虽然Redis在fork时使用了写时拷贝技术,但是如果数据庞大时还是比较消耗性能。
 在备份周期在一定间隔时间做一次备份,所以如果Redis意外down掉的话,就会丢失最后一次快照后的所有修改。
AOF
 备份机制更稳健,丢失数据概率更低
 可读的日志文本,通过操作AOF稳健,可以处理误操作。
 比起RDB占用更多的磁盘空间。
 恢复备份速度要慢。
 每次读写都同步的话,有一定的性能压力。
 存在个别Bug,造成奴不能恢复。
如何选取持久化方式?
 官方推荐两个都启用(会先载入AOF文件回复数据)。
 如果对数据不敏感,可以选单独用RDB。
 不建议单独用 AOF,因为可能会出现Bug。
 如果只是做纯内存缓存,可以都不用。

4.redis的事务有什么作用?CAS是什么意思?常用的事务命令是什么?watch的作用是什么?

Redis事务的主要作用就是串联多个命令防止别的命令插队
CAS是什么意思?
 乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,
 乐观锁策略:提交版本必须大于记录当前版本才能执行更新
常用的事务命令是什么?
 Multi、Exec、discard、WATCH key [key ...]、unwatch
watch的作用是什么?
 在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

5.redis的主从复制有什么优点?能否解决redis的容量问题?能否分摊写操作的压力?

优点:
 (1) 高可用性 :在一个Redis集群中,如果master宕机,slave可以介入并取代master的位置,因此对于整个Redis服务来说不至于提供不了服务,这样使得整个Redis服务足够安全。
    (2) 高性能 :在一个Redis集群中,master负责写请求,slave负责读请求,这么做一方面通过将读请求分散到其他机器从而大大减少了master服务器的压力,另一方面slave专注于提供读服务从而提高了响应和读取速度。
    (3) 水平扩展性 :通过增加slave机器可以横向(水平)扩展Redis服务的整个查询服务的能力。 
能否解决redis的容量问题?
 在新的机器上创建实例,并且每个实例设置为被迁移实例的从机。
 主从复制完成之后,设置程序将新的实例作为主。
 停止旧的实例
 经过如上步骤之后,旧机器的内存就变大了,最后内存最大为每台机器一个Redis实例。
能否分摊写操作的压力?
 主从模式衍生:上一个slave可以是下一个slave的Master。

 

6.主从复制中主节点down机,怎么实现主从切换(自动、手动)?自动实现从转主的时候,选取slave转为master的选取机制是?

手动:
 当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。。
 用 slaveof  no one  将从机变为主机。
自动:
 哨兵。
 自定义的/myredis目录下新建sentinel.conf文件
 在配置文件中填写内容:
        sentinel  monitor  mymaster  127.0.0.1  6379  1
自动实现从转主的时候,选取slave转为master的选取机制是
 1、选择优先级靠前的
 2、选择偏移量最大的
 3、选择runid最小的从服务

7.Redis中哨兵的作用是什么?

 反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库.
 哨兵的作用就是监控Redis系统的运行状况和故障恢复功能。它的功能包括以下两个:
 1)监控主数据库和从数据库是否正常运行。
 2)主数据库出现故障时自动将数据库转换为主数据库。
 主观下线状态:单个哨兵实例对主节点做出的下线判断
 客观下线状态:多个哨兵实例对主节点做出的下线判断

8.当Redis数据库容量不够,并发写数据量较大,如何分摊压力和扩容?简述redis集群的搭建流程?

Redis 集群实现了对Redis的水平扩容,即启动N个redis节点,将整个数据库分布存储在这N个节点中,每个节点存储总数据的1/N。
redis集群的搭建流程:
 1、安装ruby环境
 能上网:
      执行yum install ruby
      执行yum install rubygems
 不能上网:
  cd  /run/media/root/CentOS 7 x86_64/Packages(路径跟centos6不同)
 拷贝到/opt/rpmruby/目录下,并cd到此目录
 执行:rpm -Uvh *.rpm --nodeps --force
 按照依赖安装各个rpm包
 2、拷贝redis-3.2.0.gem到/opt目录下
 3、执行在opt目录下执行  gem install --local redis-3.2.0.gem
 
 4、制作6个实例,6379,6380,6381,6389,6390,6391
  拷贝多个redis.conf文件
  开启daemonize yes
  Pid文件名字
  指定端口
  Log文件名字
  Dump.rdb名字
  Appendonly 关掉或者换名字
 5、安装redis cluster配置修改
  cluster-enabled yes    打开集群模式
  cluster-config-file  nodes-6379.conf  设定节点配置文件名
  cluster-node-timeout 15000   设定节点失联时间,超过该时间(毫秒),集群自动进行主从切换。
 6、将六个节点合成一个集群
  组合之前,请确保所有redis实例启动后,nodes-xxxx.conf文件都生成正常。
  启动redis集群
 7、通过 cluster nodes 命令查看集群信息
posted @ 2020-10-18 21:02  augie  阅读(106)  评论(0)    收藏  举报