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

浙公网安备 33010602011771号