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 命令查看集群信息