zoukankan      html  css  js  c++  java
  • 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的意思了。

  • 相关阅读:
    HDU 4278 Faulty Odometer 8进制转10进制
    hdu 4740 The Donkey of Gui Zhou bfs
    hdu 4739 Zhuge Liang's Mines 随机化
    hdu 4738 Caocao's Bridges tarjan
    Codeforces Gym 100187M M. Heaviside Function two pointer
    codeforces Gym 100187L L. Ministry of Truth 水题
    Codeforces Gym 100187K K. Perpetuum Mobile 构造
    codeforces Gym 100187J J. Deck Shuffling dfs
    codeforces Gym 100187H H. Mysterious Photos 水题
    windows服务名称不是单个单词的如何启动?
  • 原文地址:https://www.cnblogs.com/xinghaonan/p/11973582.html
Copyright © 2011-2022 走看看