1.redis的概述:
redis是一款内存高速缓存数据库,全称是remote dictionary service(远程数据服务),典型的nosql数据库服务器,redis是一个key-value存储系统,存储类型包括String,list,hash,set,zset。纯内存操作,读写是目前较快的key-value db,但其主要缺点是:受物理内存的限制,不能作为海量数据的高性能读写,如果需要进行海量数据的高性能读写推荐使用MongoDB
补充:
MongoDB
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
2.Redis的安装:
(1)安装环境
先下载安装包:Redis官方网址
安装Redis需要将下载的源码进行编译,编译依赖gc++,如果没有gc++环境需要安装gcc,执行命令:yum install gcc-c++
(2)安装:
1.将软件安装在/usr/local目录下,执行命令:tar -zxvf redis-3.2.10.tar.gz -C /usr/local/redis3拷贝配置文件到安装目录下(方便以后的启动),进入解压后的redis目录,里面有一份配置文件reids.conf,将其拷贝到安装目录bin目录下
执行命令:cp /usr/local/redis/redis-3.2.10/redis.conf /usr/local/redis/bin/redis-3.2.10
(3)、Redis启动
后端模式启动,修改安装目录(即bin目录)下的redis.conf配置文件,将daemonize no改为daemonize yes如下图所示:
并在redis服务启动时加载该配置文件:
执行命令:cd /usr/local/redis/redis-3.2.10/bin
再执行命令:./redis-server redis.conf
(4)、关闭Redis
首先进入redis安装目录(即bin目录),执行命令:cd /usr/local/redis/bin
关闭redis:
方式一:执行命令: ./redis-cli shutdown
也可以根据redis服务的端口号来进行关闭
方式二:执行命令: ./redis-cli -p 6379 shutdown
3.关系型数据库和nosql数据库的区别:
(1) 概述上:关系型数据库是按照行和列形式展示,行和列组织起来的数据的集合
4.Redis 最适合的场景有哪些?
(1)会话缓存 (2)全页缓存 (3)排行版/计数器 (4)队/列 (5)发布/订阅(ActiveMq消息中间件的俩种模式)
5.Memcache 与 Redis 的区别都有哪些?
(1)存储方式:memcache是数据全部存储于内存的,数据大小不能超过内存大小,如果突然断电,数据库会挂掉;redis是部分存储于磁盘的,便于数据的持久化存储
(2)存储数据类型:memcache存储简单数据类型(String),redis存储复杂的数据类型(String,list,list,set,zest)
(3)存储大小:memcache内存大小为1Mb,redis为1Gb
(4)底层模型:他们的底层实现方式以及客户端之间的通信协议不一致。redis直接自己构建VM机制(一般的系统调用系统函数会浪费时间去移动和请求)。
6.为什么 redis 需要把所有数据放到内存中?
redis为了达到最快的读写速度将数据添加到内存中,并通过异步的方式将数据存储到磁盘中,所以redis具有快速和数据持久化的特征。如果不放在内存中,磁盘I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis会越来越受欢迎,如果设置了最大使用的内存,则数据达到内存限值后无法继续添加新值。
7.Redis 常见的性能问题都有哪些?如何解决?
(1)Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大的时候对性能影响是比较大的,会间断性暂停服务,所以master最好不要写内存快照
(2)Master AOF持久化,如果重写AOF文件,这个持久化方式对性能的影响是最小的,单数AOF文件不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何的持久化工作,包括内存快照和AOF日志文件,特别是不要启用内寸快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。
(3)Master调用BGREWRITEAOF 重写AOF文件,AOF在重写的时候回占用大量的cpu和内存资源,导致服务load过高,出现短暂服务暂停现象
(4)Redis主从赋值的性能问题,为了主从赋值的速度和连接的稳定性,slave和master最好在同一个局域网
8. Redis 用过 RedisNX 吗?Redis 有哪几种数据结构?
见过没使用过,Redis中含较多的nx后缀,nx为: SETNX SET if Not eXists (自我理解:分布式锁中,在访问redis缓存数据库时,先判断key是否被使用,如果被占用,返回一个false,当该key不在被使用(key过期时)自动释放该key,再次访问redis缓存数据库时即可使用该key用于存储数据)
数据类型:
(1)String 字符串类型: 简单的key-value类型 value不仅可以是String,也可以是数字
(2)Hash 字典 将一些数据化的信息打包成hashmap,在客户端序列化后存储在一个字符串的值(一般是json格式的字符串),比如用户的昵称,年龄,性别,积分等。
(3)list -- 列表 redis使用双端链表实现的List
(4)Set---集合 Set就是一个集合,集合的概念就是一堆无序不重复的组合,利用Redis提供的Set数据结构,可以存储一些集合性的数据。
(5)zset(Sorted set)有序集合 和set相比,sorter set是将set中的元素添加一个权重参数score,是的集合中的元素能够按照score进行有序排列
9.Redis的优缺点:
优点: (1)性能高 ---redis能支持10万每秒的读写频率
(2)丰富的数据类型:redis支持二进制的数据类型操作:String,list,hash,set和Sorter Set等
(3)原子性:redis的所有操作都是原子性的,同时redis还支持几个操作全并后的原子性执行。执行要么全部成功,要么全部失败回滚。
(4)丰富的特性:redis还支持publish/subscribe(发布/订阅),通知,key过期等特性。
缺点:
(1)内存数据库,存储局限于内存的大小,虽然redis有key过期策略,但还是需要提前预估和节约内存,如果内存增长过快,需要定期删除数据
(2)如果进行完整重同步,需要生成rdb文件,需要传输,会占用主机的cpu,会消耗现网的宽带。redis2.8之后,已经有了部分重同步的功能,但还没用全部重同步。比如,新上线的备机。
(3)修改配置文件,需要重启,将硬盘的数据加载到内存,时间比较久,这个过程中,redis不能提供服务。
10.Redis 的持久化
RDB持久化:该机制可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)默认的redis持久化方式
AOF持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。AOF文件中的命令全部以redis协议的格式来保存,新命令会被追加到文件的末尾。redis还可以在后台对AOF文件进行重写(rewirte),使得AOF文件的体积不会超出保存数据集状态所需的实际大小。(追加文件)
无持久化:让数据只能在服务器运行时存在。
同时应用AOF和RDB:但redis重启时,他会优先使用AOF文件来还原数据集,因为AOF文件保存的数据集通常比RDB文件所保存的数据集更完整。
RDB的优缺点:
优点;RDB是一个非常紧凑的文件,他保存了redis在某个时间状态下的数据集。这种文件非常适合备份。
缺点:如果需要尽量避免在服务器故障时丢失数据,那么RDB不适合。虽然redis允许设置不同的保存点(save point) 来控制保存RDB文件的频率,但redis文件需要保存整个数据集的状态,所以他不是一个轻松的操作,可能5分钟才会保存一次RDB文件。在这种情况下,一旦发生故障停机,就会丢失好几分钟的数据。每次保存RDB的时候,redis第一台fork()一个子线程,并由子进程来进行实际的持久化工作。在数据集比较庞大的时候,fork()非常耗时,造成服务器在某某毫秒内停止处理客户端;如果数据集非常大,并且cpu非常紧张,把你这种停止时间甚至可能会长达一秒
AOF的优缺点:
优点:
1.使用AOF持久化会使redis变得非常耐久
2.redis可以在AOF文件体积非常大的时候,自动在后台对AOF进行重写;重写后的心AOF文件包含了回复当前数据集所需要的最小命令集合。整个重写操作是绝对安全的,因为redis在创建新的AOF文件的过程中,会继续将命令追加到AOF文件中,即使重写过程中发生停机,现有AOF文件也不会丢失。而一旦新AOF文件创建完毕,redis就会从旧AOF文件切换到新的AOF文件,并开始对新AOF文件进行追加操作。
缺点:
对于相同的数据集来说,AOF的体积比RDB的体积大,根据使用的fsync策略,AOF的速度可能会慢于RDB,在一般情况下,每秒的fsync的性能依然非常高,而关闭fysnc可以让AOF的速度和RDB一样快,即使是在高负荷下,不过在处理巨大的写入载入时,RDB可以提供更有保证的最大延迟时间(latency).
AOF发生过bug:个别命令的原因,导致AOF文件在重新载入的时候们无法将数据集恢复成原来的样子
俩者的区别:
两种区别就是,一个是持续的用日志记录写操作,crash后利用日志恢复;一个是平时写操作的时候不触发写,只有手动提交save命令,或者是关闭命令时,才触发备份操作。
选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb)。rdb这个就更有些 eventually consistent的意思了。