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

    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,hash,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  

    数据类型:

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

    一,为什么要是用Redis?(为什么要使用缓存)

      主要从高性能和高并发两方面讨论

    高性能:

      当用户第一次访问数据库中的某些数据的时候,数据是从硬盘中获取的,速度比较慢,如果将数据存储到缓存中,下一次用户查数据时就可以直接从缓存中获取,而操作缓存,将相当于操作内存,速度非常快,如果数据库中数据之后发生改变,同步改变缓存中的数据就可以了

    高并发:

      直接操作缓存的能够承受的请求是远远大于直接操作数据库的,如果将数据库中的一部分数据转存到缓存中,那么用户的一部分请求就会直接到缓存中查询数据,而不是数据库

    二,为什么使用redis而不用map做缓存?

      缓存分为本地缓存和分布式缓存。以Java为例,使用map和guava实现的属于本地缓存,最主要特点是轻量以及快速,生命随着JVM的销毁而结束,当有很多实例的时候,每个实例都需要为各自保存一份缓存,缓存不具有一致性

      使用redis和memcached之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存,缓存具有一致性。缺点是需要保证redis或memcached服务的高可用,整个程序结构比较复杂。

    四,redis常见数据结构以及使用场景分析

    String:

      String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字,常规key-value缓存应用,常规计数:微博数,粉丝数等

    Hash:

      Hash是一个string类型的field和value的映射表,hash特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值,比如我们可以Hash数据结构来存储用户信息,商品信息等等

    List:

       list就是链表,Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能都可以用Redis的list结构来实现

      Redis list 的实现为一个双向链表,既可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,

      另外可以通过lrang命令,就是从某个元素开始读取多少个元素,可以基于list实现分页查询,这个很棒的一个功能,基于redis实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能很高

    Set:

      set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的。

      当你需要 存储一个列表数据,又不希望出现重复数据的时候,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。可以基于set轻易实现交集,并集,差集的操作

      比如:zai微博应用中,可以将一个用户所有的关注人存在存在一个集合中,将其所有粉丝存在一个集合,Redis可以非常方便的实现如共同关注,共同粉丝,共同喜好等功能。这个过程也就是求交集的过程,具体命令如下:sinterstore  key1  key2  key3  将交集存在key1内

    ZSet:

      和set相比,zset增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。举例:在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜,弹幕消息等信息,适合使用Redis中的SortedSet结构进行存储

    v>

    五. redis 内存淘汰机制。
    redis 提供 6 种数据淘汰策略:
    1. volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    2. volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
    3. volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    4. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的).
    5. allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
    6. no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!
     
     
  • 相关阅读:
    最不要勉强的,是感情.
    Nginx+phpfastcgi下flush 一下子全部输出问题
    php excel 读取日期问题
    JavaScript年月日和时间戳互转
    mysql 查找除id外其他重复的字段数据
    Thinkphp 下 MySQL group by 接count 获得条数方法
    MySQL性能管理及架构设计 --- 理论篇
    MySQL 导入.sql文件
    Apache ab 压力并发测试工具
    工作生活随笔
  • 原文地址:https://www.cnblogs.com/wufeng6/p/11973590.html
Copyright © 2011-2022 走看看