Redis知识点
Posted 陈多
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis知识点相关的知识,希望对你有一定的参考价值。
1.列举至少3个非关系型数据库,简单描述他们的特性
Memcached
特性:数据都在内存中,一般不持久化
支持简单的 key-value模式
一般是作为缓存数据库辅助持久化的数据库
Redis
特性:几乎覆盖了Memcached的绝大部分功能
数据都在内存中,支持持久化,主要用作备份恢复 除了支持简单的key-value模式,还支持多种数据结构的存储,比如 list、set、hash、zset等。
一般是作为缓存数据库辅助持久化的数据库
mongoDB
特性:高性能、开源、模式自由(schema free)的文档型数据库 数据都在内存中, 如果内存不足,把不常用的数据保存到硬盘 虽然是key-value模式,但是对value(尤其是json)提供了丰富的查询功能
支持二进制数据及大型对象 可以根据数据的特点替代RDBMS ,成为独立的数据库。或者配合RDBMS,存储特定的数据。
2.reids常用的数据类型有哪些?(介绍一下各数据类型的特点)
Redis支持存储的多种key-value类型,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。
1. 字符串类型(string)
这是redis中最基本的类型,也是最常用的类型,跟memcached一样,即一个key对应一个值这种。操作也很简单,常用操作命令有get、set、del等。
2. 链表类型(list)
链表类型有点类似于编程语言中的数组一样,可以用一个key存一组数据进去。其实list类型就是一个双向链表,通过lpush、lpop、rpush、rpop这四个命令来向链表的头部插入、移除、尾部插入、移除,这使得list即可以用作栈,也可以用作队列。
3set(集合)
redis中的set是string类型的无序集合,set元素最大可以包含2的32次方-1个元素。利用set集合类型,我们可以快速取出n个key之间的并集、交集、差集等,从而轻松解决mysql等数据库不容易实现这种运算的缺陷。应用场景:取出两个QQ号中的共同的好友数。
4. 有序集合类型(sorted set)
和set一样,sorted set也是string类型元素的集合,是一个没有重复元素的字符串集合。因为元素是有序的,所以使用有序集合你可以以非常快的速度(O(log(N)))添加,删除和更新元素,它也很擅长排序。应用场景:获取所有用户投票数最高的前10名,等等。
5. 哈希类型(hash)
hash数据类型存储的数据与mysql数据库中存储一条记录极为相似,其存储了字段和字段值的映射,但字段值只能是字符串,不支持其他类型。每一个哈希可以存储超过2的32次方-1个字段-值对。应用场景:存储用户的基本信息,等等。
3.redis的持久化方式是什么?分别有什么特点?如何选取持久化方式?(或者问Redis的数据持久化方式有哪些?如何进行的持久化?如何选取持久化方式?)
redis 持久化的两种方式
- RDB:RDB 持久化机制,是对 redis 中的数据执行周期性的持久化。
- AOF:AOF 机制对每条写入命令作为日志,以 append-only 的模式写入一个日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重新构建整个数据集。
通过 RDB 或 AOF,都可以将 redis 内存中的数据给持久化到磁盘上面来,然后可以将这些数据备份到别的地方去,比如说阿里云等云服务。
如果 redis 挂了,服务器上的内存和磁盘上的数据都丢了,可以从云服务上拷贝回来之前的数据,放到指定的目录中,然后重新启动 redis,redis 就会自动根据持久化数据文件中的数据,去恢复内存中的数据,继续对外提供服务。
如果同时使用 RDB 和 AOF 两种持久化机制,那么在 redis 重启的时候,会使用 AOF 来重新构建数据,因为 AOF 中的数据更加完整。
RDB 优缺点
-
RDB会生成多个数据文件,每个数据文件都代表了某一个时刻中 redis 的数据,这种多个数据文件的方式,非常适合做冷备,可以将这种完整的数据文件发送到一些远程的安全存储上去,比如说 Amazon 的 S3 云服务上去,在国内可以是阿里云的 ODPS 分布式存储上,以预定好的备份策略来定期备份redis中的数据。
-
RDB 对 redis 对外提供的读写服务,影响非常小,可以让 redis 保持高性能,因为 redis 主进程只需要 fork 一个子进程,让子进程执行磁盘 IO 操作来进行 RDB 持久化即可。
-
相对于 AOF 持久化机制来说,直接基于 RDB 数据文件来重启和恢复 redis 进程,更加快速。
-
如果想要在 redis 故障时,尽可能少的丢失数据,那么 RDB 没有 AOF 好。一般来说,RDB 数据快照文件,都是每隔 5 分钟,或者更长时间生成一次,这个时候就得接受一旦 redis 进程宕机,那么会丢失最近 5 分钟的数据。
-
RDB 每次在 fork 子进程来执行 RDB 快照数据文件生成的时候,如果数据文件特别大,可能会导致对客户端提供的服务暂停数毫秒,或者甚至数秒。
AOF 优缺点
- AOF 可以更好的保护数据不丢失,一般 AOF 会每隔 1 秒,通过一个后台线程执行一次
fsync
操作,最多丢失 1 秒钟的数据。 - AOF 日志文件以
append-only
模式写入,所以没有任何磁盘寻址的开销,写入性能非常高,而且文件不容易破损,即使文件尾部破损,也很容易修复。 - AOF 日志文件即使过大的时候,出现后台重写操作,也不会影响客户端的读写。因为在
rewrite
log 的时候,会对其中的指导进行压缩,创建出一份需要恢复数据的最小日志出来。再创建新日志文件的时候,老的日志文件还是照常写入。当新的 merge 后的日志文件 ready 的时候,再交换新老日志文件即可。 - AOF 日志文件的命令通过非常可读的方式进行记录,这个特性非常适合做灾难性的误删除的紧急恢复。比如某人不小心用
flushall
命令清空了所有数据,只要这个时候后台rewrite
还没有发生,那么就可以立即拷贝 AOF 文件,将最后一条flushall
命令给删了,然后再将该AOF
文件放回去,就可以通过恢复机制,自动恢复所有数据。 - 对于同一份数据来说,AOF 日志文件通常比 RDB 数据快照文件更大。
- AOF 开启后,支持的写 QPS 会比 RDB 支持的写 QPS 低,因为 AOF 一般会配置成每秒
fsync
一次日志文件,当然,每秒一次fsync
,性能也还是很高的。(如果实时写入,那么 QPS 会大降,redis 性能会大大降低) - 以前 AOF 发生过 bug,就是通过 AOF 记录的日志,进行数据恢复的时候,没有恢复一模一样的数据出来。所以说,类似 AOF 这种较为复杂的基于命令日志/merge/回放的方式,比基于 RDB 每次持久化一份完整的数据快照文件的方式,更加脆弱一些,容易有 bug。不过 AOF 就是为了避免 rewrite 过程导致的 bug,因此每次 rewrite 并不是基于旧的指令日志进行 merge 的,而是基于当时内存中的数据进行指令的重新构建,这样健壮性会好很多。
RDB和AOF到底该如何选择
- 不要仅仅使用 RDB,因为那样会导致你丢失很多数据
- 也不要仅仅使用 AOF,因为那样有两个问题,第一,你通过 AOF 做冷备,没有 RDB 做冷备,来的恢复速度更快; 第二,RDB 每次简单粗暴生成数据快照,更加健壮,可以避免 AOF 这种复杂的备份和恢复机制的 bug。
- redis 支持同时开启开启两种持久化方式,我们可以综合使用 AOF 和 RDB 两种持久化机制,用 AOF 来保证数据不丢失,作为数据恢复的第一选择; 用 RDB 来做不同程度的冷备,在 AOF 文件都丢失或损坏不可用的时候,还可以使用 RDB 来进行快速的数据恢复。
4.redis的事务有什么作用?CAS是什么意思?常用的事务命令是什么?watch的作用是什么?
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
Redis事务的主要作用就是串联多个命令防止别的命令插队
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量。Redis就是利用这种check-and-set机制实现事务的。
WATCH key [key ...] 在执行multi之前,先执行watch key1 [key2],可以监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。
unwatch 取消 WATCH 命令对所有 key 的监视。 如果在执行 WATCH 命令之后, EXEC 命令或 DISCARD 命令先被执行了的话,那么就不需要再执行 UNWATCH 了。
WATCH命令可以监控一个或多个键,一旦其中有一个键被修改(或删除),之后的事务就不会执行。监控一直持续到EXEC命令(事务中的命令是在EXEC之后才执行的,所以在MULTI命令后可以修改WATCH监控的键值)
5.redis的主从复制有什么优点?能否解决redis的容量问题?能否分摊写操作的压力?
- 一个Master可以同步多个Slaves
- Slave同样可以接受其它Slaves的连接和同步请求,这样可以有效的分载Master的同步压力。因此我们可以将Redis的Replication架构视为图结构
- Master Server是以非阻塞的方式为Slaves提供服务。所以在Master-Slave同步期间,客户端仍然可以提交查询或修改请求
- Slave Server同样是以非阻塞的方式完成数据同步。在同步期间,如果有客户端提交查询请求,Redis则返回同步之前的数据
- 为了分载Master的读操作压力,Slave服务器可以为客户端提供只读操作的服务,写服务仍然必须由Master来完成。即便如此,系统的伸缩性还是得到了很大的提高
- Master可以将数据保存操作交给Slaves完成,从而避免了在Master中要有独立的进程来完成此操作
- 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离
一个机器启动多个实例,其实并不会耗费太多资源,因为Redis够轻量,另外多个实例一个接一个的重写AOF文件或者生成内存快照,可以降低内存的占用,而不影响对外的服务
6.主从复制中主节点down机,怎么实现主从切换(自动、手动)?自动实现从转主的时候,选取slave转为master的选取机制是?
上一个slave可以是下一个slave的Master,slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个的master, 可以有效减轻master的写压力,去中心化降低风险。 用 slaveof <ip> <port> 中途变更转向:会清除之前的数据,重新建立拷贝最新的 风险是一旦某个slave宕机,后面的slave都没法备份
当一个master宕机后,后面的slave可以立刻升为master,其后面的slave不用做任何修改。。 用 slaveof no one 将从机变为主机。
7.Redis中哨兵的作用是什么?
反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库.
8.当Redis数据库容量不够,并发写数据量较大,如何分摊压力和扩容?简述redis集群的搭建流程?
1、安装ruby环境
能上网
执行yum install ruby 执行yum install rubygems
不能上网
cd /run/media/root/CentOS 7 x86_64/Packages(路径跟centos6不同) 获取右图rpm包 拷贝到/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
以上是关于Redis知识点的主要内容,如果未能解决你的问题,请参考以下文章