zoukankan      html  css  js  c++  java
  • Redis详解

    一、缓存数据库介绍

     NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库,随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

    NoSQL数据库的四大分类:

    键值(Key-Value)存储数据库:

    这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
     
    列存储数据库:
    这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
     
    文档型数据库:
    文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
     
    图形(Graph)数据库:
    图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。 如:Neo4J, InfoGrid, Infinite Graph.
    因此,我们总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。

    二、Redis

    介绍:

           redis是业界主流的key-value nosql 数据库之一。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

    Redis优点:

    • 异常快速 : Redis是非常快的,每秒可以执行大约110000设置操作,81000个/每秒的读取操作。

    • 支持丰富的数据类型 : Redis支持最大多数开发人员已经知道如列表,集合,可排序集合,哈希等数据类型。

      这使得在应用中很容易解决的各种问题,因为我们知道哪些问题处理使用哪种数据类型更好解决。
    • 操作都是原子的 : 所有 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。

    • MultiUtility工具:Redis是一个多功能实用工具,可以在很多如:缓存,消息传递队列中使用(Redis原生支持发布/订阅),在应用程序中,如:Web应用程序会话,网站页面点击数等任何短暂的数据;

    安装redis:

    Centos安装Redis:
    
    1、下载安装包:
    yum install gcc-c++ tcl
    cd /usr/local/src
    wget http://download.redis.io/releases/redis-4.0.1.tar.gz
    tar zxvf redis-4.0.1.tar.gz
    2、安装:
    cd redis-4.0.1
    make 
    cd src/
    make install PREFIX=/usr/local/redis
    3、复制配置文件:
    mkdir /usr/local/redis/etc/
    cd ..
    cp redis.conf /usr/local/redis/etc/
    4、修改配置文件:
    mkdir /usr/local/redis/log/
    mkdir /usr/local/redis/run/
    mkdir /usr/local/redis/redis/
    cd /usr/local/redis/etc/
    vi redis.conf 
    ########
    .......
    port 6379
    .......
    daemonize yes
    .......
    pidfile /usr/local/redis/run/redis_6379.pid
    .......
    logfile /usr/local/redis/log/redis_6379.log
    .......
    dir /usr/local/redis/redis       #工作目录,dump文件所在目录
    #########
    5、启动redis:
    cd /usr/local/redis/bin/
     ./redis-server /usr/local/redis/etc/redis.conf 
    ps -ef |grep redis
    ./redis-cli          #连接redis
    echo "/usr/local/bin/redis-server /etc/redis/redis.conf" >> /etc/rc.local  #设置开机启动
    redis-cli shutdown       默认是6379端口     #关闭redis服务
    redis-cli -p 6379 shutdown                #如果端口变化可以指定端口

    还可以通过如下方法,设置redis服务启动脚本及开机自启动
    将redis解压包下utils下redis启动脚本redis_init_script拷贝至/etc/init.d/,并修改脚本名称(也可不修改)为redis

    cp /usr/local/src/redis-4.0.1/utils/redis_init_script /etc/init.d/redis
    chmod +x /etc/init.d/redis
    
    修改脚本pid及conf路径为实际路径:
    vim /etc/init.d/redis
    ......
    REDISPORT=6379
    EXEC=/usr/local/redis/bin/redis-server
    CLIEXEC=/usr/local/redis/bin/redis-cli
    
    PIDFILE=/usr/local/redis/run/redis_6379.pid
    CONF="/usr/local/redis/etc/redis.conf"
    ......
    
    这样,就可以直接用下面的命令关闭和启动redis服务了
    /etc/init.d/redis stop
    /etc/init.d/redis start
    
    设置自启动
    [root@dev ~]# chkconfig redis on
    redis 服务不支持 chkconfig
    
    这是因为没有在启动脚本/etc/init.d/redis里加入redis启动优先级信息,可添加如下红色字体的两行:
    [root@dev ~]# vim /etc/init.d/redis 
    #!/bin/sh
    #
    # chkconfig: 2345 90 10                                            //注意:后面的英文空格
    # description: Redis is a persistent key-value database           //注意:后面的英文空格
    
    # Simple Redis init.d script conceived to work on Linux systems
    # as it does use of the /proc filesystem.
    .......
    
    [root@dev ~]# chkconfig redis on
    [root@dev ~]# chkconfig --list|grep redis
    redis 0:关闭    1:关闭    2:启用    3:启用    4:启用    5:启用    6:关闭

    Redis初始化配置:

    1、redis默认的持久化方式是RDB,数据写入到dump文件中。如果要启用AOF持久化,就在redis.conf文件中配置如下:
    appendonly yes                     #启用AOF持久化方式
    appendfilename "appendonly.aof"    #AOF文件的名称,默认为appendonly.aof
    # appendfsync always               #每次收到写命令就立即强制写入磁盘,是最有保证的完全的持久化,但速度也是最慢的,一般不推荐使用。
    appendfsync everysec               #每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,是受推荐的方式。
    # appendfsync no                   #完全依赖OS的写入,一般为30秒左右一次,性能最好但是持久化最没有保证,不被推荐。
    2、配置最大大内存maxmemory参数    注:64G的机器,64*45%/1.2 = 24G作为maxmemory是比较安全的规划。
    maxmemory 1073741824   #1G
    3、记得关闭THP,这个默认的Linux内存页面大小分配策略会导致RDB时出现巨大的latency和巨大的内存占用。关闭方法为:
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag

    配置文件字段详解:

    一、总体配置(端口,日志,数据库):
    1、daemonize no   Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程。 
    2、pidfile /var/run/redis.pid 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定。 
    3、port 6379 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字 
    4、bind 127.0.0.1  绑定的主机地址,指定地址可以访问,需要所有的地址可以访问,把下面字段注释掉。 
    5、loglevel verbose  指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose 
    6、logfile stdout  日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
    7、databases 16  设置数据库的数量,默认数据库为0,可以使用SELECT <dbid>命令在连接上指定数据库id 
    8、dir ./   指定本地数据库存放目录 
    9、activerehashing yes   指定是否激活重置哈希,默认为开启
    二、最大内存及策略:
    1、maxmemory 1073741824(1G) 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key, 当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区。 2、maxmemory-policy 内存不够淘汰策略,默认为:noeviction volatile-lru 用lru算法删除过期的键值 allkeys-lru 用lru算法删除所有键值 volatile-random 随机删除过期的键值 allkeys-random 随机删除任何键值 volatile-ttl 删除最近要到期的键值   noeviction 不删除键 3、maxmemory-samples 检测lru采样数,默认为5
    三、AOF相关配置
    1、appendonly no 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。 因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no 2、appendfilename appendonly.aof 指定更新日志文件名,默认为appendonly.aof 3、appendfsync everysec 指定更新日志条件。 no:表示等操作系统进行数据缓存同步到磁盘(快) always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全) everysec:表示每秒同步一次(折衷,默认值)
    四、RDB相关配置
    1、指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合 save <seconds> <changes> Redis默认配置文件中提供了三个条件: save 900 1 分别表示900秒(15分钟)内有1个更改 save 300 10 300秒(5分钟)内有10个更改 save 60 10000 60秒内有10000个更改。 2、rdbcompression yes 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大
    3、dbfilename dump.rdb 指定本地数据库文件名,默认值为dump.rdb
    五、慢查询设置
    1、slowlog-log-slower-than 慢查询预设阈值(单位是微秒1秒=1000000微秒),默认10000 2、slowlog-max-len 慢查询最多存多少条,默认128 3、latency-monitor-threshold 内存延迟监控,默认关闭0
    六、数据结构优化
    七、复制相关的参数
    1、slaveof <masterip> <masterport> 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
    八、客户端相关的参数
    1、 timeout 300 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能 2、maxclients 128 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,
    表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
    九、安全相关的配置:
    1、requirepass foobared 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭 2、masterauth <master-password> 当master服务设置了密码保护时,slav服务连接master的密码

     其他配置:

    1、指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)
         vm-enabled no
    2、虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
         vm-swap-file /tmp/redis.swap
    3、将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0
         vm-max-memory 0
    4、Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
         vm-page-size 32
    5、设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。
         vm-pages 134217728
    6、设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
         vm-max-threads 4
    7、设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
        glueoutputbuf yes
    8、指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法
        hash-max-zipmap-entries 64
        hash-max-zipmap-value 512
    9、指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
        include /path/to/local.conf

     Redis常用命令:

    序号命令说明
    1 AUTH password 使用给定的密码验证服务器
    2 ECHO message 打印给定的字符串信息
    3 PING 检查服务器是否正在运行
    4 QUIT 关闭当前连接
    5 SELECT index 更改当前连接的所选数据库
     

    redis的键、字符串、哈希、列表、集合、有序集合、发布订阅的操作详见:

    http://www.cnblogs.com/chimeiwangliang/p/7216243.html

    Redis数据的备份和恢复:

    1、查看备份目录:
    127.0.0.1:6379> CONFIG GET dir
    1) "dir"
    2) "/usr/local/redis/bin"
    2、备份:
    127.0.0.1:6379> SAVE
    3、恢复:
    如果需要恢复数据,只需将备份文件(dump.rdb)移动到redis安装目录并启动服务即可

    为Radis设置密码:

    1、查看密码:
    127.0.0.1:6379>CONFIG get requirepass
    (默认情况下 requirepass 参数是空的,这就意味着你无需通过密码验证就可以连接到 redis 服务。)
    2、设置密码:
     127.0.0.1:6379>CONFIG set requirepass "runoob"
    3、验证密码(设置密码后不验证密码会报错:(error) NOAUTH Authentication required.):
    127.0.0.1:6379>AUTH password
  • 相关阅读:
    B.Icebound and Sequence
    Educational Codeforces Round 65 (Rated for Div. 2) D. Bicolored RBS
    Educational Codeforces Round 65 (Rated for Div. 2) C. News Distribution
    Educational Codeforces Round 65 (Rated for Div. 2) B. Lost Numbers
    Educational Codeforces Round 65 (Rated for Div. 2) A. Telephone Number
    Codeforces Round #561 (Div. 2) C. A Tale of Two Lands
    Codeforces Round #561 (Div. 2) B. All the Vowels Please
    Codeforces Round #561 (Div. 2) A. Silent Classroom
    HDU-2119-Matrix(最大匹配)
    读书的感想!
  • 原文地址:https://www.cnblogs.com/chimeiwangliang/p/7234901.html
Copyright © 2011-2022 走看看