Redis的详解

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最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

官方网站:https://www.mongodb.com/

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/redis
2.解压编译:make PREFIX=/usr/local/redis/redis-3.2.10  install          此时能够看到在该路径下多出一个bin目录

3拷贝配置文件到安装目录下(方便以后的启动),进入解压后的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)  概述上:关系型数据库是按照行和列形式展示,行和列组织起来的数据的集合                
         非关系型数据库是按照key-value形式存在,key是唯一的,value是可以有多个重复的数据
  nosql的优势:(1)成本上:nosql简单易部署,代码开源免费,oracle数据库收费
          (2)查询速率上:nosql的查询速率更快    
          (3)存储数据格式:key-value可以存储String,hash,list,list,set,zeset等类型的数据,关系型数据库只能存储结构化数据
         (4)拓展性:关系型数据库有join这样的多表查询机制的限制拓展性难
                 缺点:(1)维护和资源有限,nosql属于新技术
        (2)不支持sql语句
        (3)不提供关系型数据库对事物的处理,容易丢失数据(失败不回滚)。
        (4)存储在内存上,局限于物理内存的大小  

 

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的意思了。

posted @ 2019-12-02 22:01  阿楠121397442  阅读(255)  评论(1编辑  收藏  举报