zoukankan      html  css  js  c++  java
  • Redis 的基础介绍

    Ø  简介

    本文主要记录 Redis 的基础介绍,包含如下内容:

    1.   Redis 简介

    2.   Redis 的适用场景

    3.   Redis 的特点

    4.   Redis 的安装与部署

    5.   Redis 的配置

    6.   Redis 的性能测试

     

    1.   Redis 简介

    Ø  Redis 是由意大利人 Salvatore Sanfilippo(网名:antirez)开发的一款内存高速缓存数据库;

    Ø  Redis 全称为:Remote Dictionary Server(远程数据服务),该软件使用 C语言编写;

    Ø  Redis 是一个开源的,先进的 key-value 存储可用于构建高性能,可扩展的 Web 应用程序的解决方案,它通常被称为数据结构服务器。

    Ø  支持丰富的数据类型,例如:stringlistsetzset(sorted set)hash

    Ø  提供的 API 语言包括:CC++C#ClojureCommon LispErlangHaskellJavaJavaScriptLuaObjective-CPerlPHPPythonPuby ScalaGOTcl 等。

    Ø  Redis 官方网站:http://www.redis.io/

    Ø  尽量使用 3.2 以上版本,才具有官方提供的 Redis 集群支持(RedisCluster)。

     

    2.   Redis 的适用场景

    1)   取最新的 N 个数据的操作;

    2)   排行榜应用,取 TOP N 的操作;

    3)   需要精确设定过期时间的应用;

    4)   计数器应用;

    5)   Uniq 操作,获取某段时间所有数据排重值;

    6)   实时系统,反垃圾系统;

    7)   Pub/Sub(发布/订阅)构建实时消息系统;

    8)   构建队列系统;

    9)   缓存

     

    目前全球最大的 Redis 用户是新浪微博,在新浪有200多台物理机,400多个端口正在运行着 Redis,+4G 的数据在 Redis 上来为微博用户提供服务。

    在新浪微博 Redis 的部署场景很多,大概分为如下的 2 种:

    1)   应用程序直接访问 Redis 数据库:这样的方式存在不安全的问题,如果数据库服务断电或者死机,就会照成数据的丢失。

    2)   应用程序直接访问 Redis,只有当 Redis 访问失败时才访问 MySQL

     

    3.   Redis 的特点

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

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

    Ø  原子性操作:所有的 Redis 的操作都是原子,从而确保当两个客户同时访问 Redis 服务器得到的是更新后的值(最新值)。

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

    Ø  Redis 整体的特点是速度快,支持的数据类型丰富,但是并不只有 Redis 具备有这样的特点,Redis 是属于缓存数据的第二代产品了,而第一代产品就是 memcached 数据库。

    Ø  Redis Memcached 的区别

    1.   Redis 支持比 Memcached 更多的数据类型

    2.   Redis 支持主从结构Master-Slave)可以实现数据备份;

    3.   Redis 支持数据持久化,可以将数据保存到磁盘上,重启时数据依然可用。

     

    4.   Redis 的安装与部署

    1)   介绍

    1.   Redis 给出的安装包只是源代码的开发包(C程序的源文件),既然是 C 语言的文件,那么如果要想使用 Redis,就必须进行代码的编译处理。理论上这些编译的环境可以在任意的操作系统之中执行,但是考虑到实际的应用环境,更多的是在 Linux 下完成。

    2.   如果非要在 Windows 中执行,可以去下载一个 cygwin UNIX 模拟环境。

     

    2)   安装步骤

    1.   第一步:下载安装包,官方下载地址:https://redis.io/download

     

    2.   第二步:将 Redis 安装包上传到 Linux 系统之中,但是需要注意,由于给出的安装包属于源代码,所以还需要进行解压,解压到“/usr/local/src”的目录:

    tar -xzvf /jingle/redis-5.0.5.tar.gz -C /usr/local/src/

     

    3.   第三步:编译源程序

    1)   进入 Redis 源代码所在的安装目录(就是之前解压的目录)

    cd /usr/local/src/redis-5.0.5/

    2)   输入编译命令:make

    可能出现如下错误:

    1.   /bin/sh: cc: 未找到命令

    安装 gcc 即可:yum install gcc-c++ -y

    2.   zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

    输入命令:make MALLOC=libc

     

    4.   第四步:安装 Redis

    cd src          #进入 /redis-5.0.5/src/ 目录下

    make install    #安装 Redis

     

    5.   第五步:移动文件,便于管理

    mkdir -p /usr/local/redis/bin          #创建 bin 文件夹

    mkdir -p /usr/local/redis/etc          #创建 etc 文件夹

    cd /usr/local/src/redis-5.0.5          #进入 redis 安装目录

    mv ./redis.conf /usr/local/redis/etc/   #移动 redis.conf 文件

    cd src                                 #进入 src 目录

    mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server redis-trib.rb /usr/local/redis/bin/  #将所有标绿的文件移动到 bin 目录下

     

    文件解释:

    redis-server

    Redis 服务启动程序

    redis-cli

    Redis 命令行客户端

    redis-benchmark

    性能测试工具

     

    6.   第六步:启动 Redis 服务

    1)   修改 redis.conf 配置文件,将 Redis 设置为后台启动

    daemonize no    #改为yes

    注意:设置后台启动后就不会打印 Redis-server 启动日志了,例如:

    daemonize no 的启动日志:

    clip_image002[4]

    daemonize yes 的启动日志:

    clip_image004[4]

    2)   启动 Redis 服务

    [root@localhost bin]# ./redis-server /usr/local/redis/etc/redis.conf

    3)   检查 Redis 是否启动成功

    ps -ef | grep redis         #查看程序是否启动

    或者

    !net                       #查看端口是否运行

    或者

    netstat -tunpl | grep 6379

    注:Redis 服务端的默认连接端口是6379

     

    7.   第七步:连接和退出 Redis 客户端

    /usr/local/redis/bin/redis-cli  #客户端远程连接(方式1

    /usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379 #客户端远程连接(方式2

    /usr/local/redis/bin/redis-cli -a abeam. info replication   #登录后发送命令

    quit | exit                    #退出客户端

     

    8.   第八步:关闭 Redis 服务

    pkill redis-server

    或者

    killall redis-server

    或者

    /usr/local/redis/bin/redis-cli shutdown

     

    5.   Redis 的配置

    1)   配置 Redis 内存支配

    Redis 属于内存缓存数据库,那么如果是一台单独的 Redis 服务器,则应该考虑将所有的可用内存都交给 Redis 来进行支配,所以理论上还需要执行如下的一行代码:

    echo "vm.overcommit_memory=1" >> /etc/sysctl.conf

    以上命令用于设置内存的分配策略,vm.overcommit_memory 可以设置值如下:

    0表示在进行处理时首先检查是否有足够的内存供应,如果没有足够的内存供应则无法分配,内存申请失败;如果有可用内存则直接进行申请开辟;

    1表示将所有的内存都交给应用使用,而不关心当前的内存状态如何;

    2表示允许分配超过所有物理内存和交换空间的内存总和;

    再执行命令,将以上的配置写入到内核参数之中:/sbin/sysctl -p

     

    2)   Redis 数据库配置

    Redis 主要使用 redis.conf 配置文件来完成。

    1.   Redis 作为一个具备持久化功能的缓存数据库,所以一定会有一个用于数据存储的目录,一般有三类文件需要保存:Redis 运行的 pidRedis 相关的处理日志、Redis 的数据文件。

    mkdir -p /usr/local/redis/{run,logs,dbcache}

     

    2.   修改 redis.conf 的配置文件:

    vim /usr/local/redis/etc/redis.conf

    配置 Redis 运行端口

    port 6379

    配置 Redis 是否为后台运行

    daemonize yes

    设置进程保存路径

    pidfile /usr/local/redis/run/redis_6379.pid

    设置日志保存路径

    (启动 redis-server 的日志将输出在此文件中)

    logfile "/usr/local/redis/logs/redis.log"

    Redis 支持的数据库数量

    databases 16

    保存数据库文件的目录

    dir /usr/local/redis/dbcache/

     

    3)   redis.conf 配置说明

    1.   daemonize:      是否在后台运行 Redis,取值为no/yes.

    2.   pidfile:        配置多个pid的地址,默认在/var/run/redis.pid

    3.   bind:           绑定ip,设置后只接受来自该 ip 的请求

    4.   port:           监听端口,默认为6379

    5.   timeout:        设置客户端连接时的超时时间,单位为秒

    6.   loglevel:       分为4级,debugverbosenoticewarning

    7.   logfile:        配置 log 的文件地址

    8.   databases:      设置数据库的数量,默认使用的数据库为0

    9.   save:           设置 redis 进行数据库镜像的频率

    10.  rdbcompression: 在进行镜像备份时,是否进行压缩

    11.  Dbfilename:     镜像备份文件的文件名

    12.  Dir:            数据库镜像备份的文件放置路径

    13.  Slaveof:        设置数据库为其他数据库的从数据库

    14.  Masterauth:     主数据库连接需要的密码验证

    15.  Requirepass:    设置登录时需要使用的密码

    16.  Maxclients:     限制同时连接的客户数量

    17.  Maxmemory:      设置 redis 能够使用的最大内存

    18.  Appendonly:     开启 append only 模式

    19.  Appendfsync:    设置对 appendonly.aof 文件同步的频率

    20.  vm-enabled:     是否开启虚拟内存支持

    21.  vm-swap-file:   设置虚拟内存的交换文件路劲

    22.  vm-max-memory: 设置 redis 使用的最大物理内存大小

    23.  vm-page-size:   设置虚拟内存的页大小

    24.  vm-pages        设置交换文件的总的 page 数量

    25.  vm-max-threads 设置 VMIO 同时使用的线程数量

    26.  Glueoutputbuf   把小的输出缓存放在一起

    27.  hash-max-zipmap-entries 设置 hash 的临界值

    28.  Activerehashing 重新hash

     

    6.   Redis 的性能测试

    Redis 中有一个"redis-benchmark"的性能测试工具,可以直接使用该工具来观察 Redis 的运行情况,该命令所需的参数如下:

        -h <hostname>      Server hostname (default 127.0.0.1)

    -p <port>          Server port (default 6379)

    -s <socket>        Server socket (overrides host and port)

    -a <password>      Password for Redis Auth

    -c <clients>       Number of parallel connections (default 50)

    -n <requests>      Total number of requests (default 100000)

    -d <size>          Data size of SET/GET value in bytes (default 3)

    --dbnum <db>       SELECT the specified db number (default 0)

    -k <boolean>       1=keep alive 0=reconnect (default 1)

    -r <keyspacelen>   Use random keys for SET/GET/INCR, random values for SADD

      Using this option the benchmark will expand the string __rand_int__

      inside an argument with a 12 digits number in the specified range

      from 0 to keyspacelen-1. The substitution changes every time a command

      is executed. Default tests use this to hit random keys in the

      specified range.

    -P <numreq>        Pipeline <numreq> requests. Default 1 (no pipeline).

    -e                 If server replies with errors, show them on stdout.

                        (no more than 1 error per second is displayed)

    -q                 Quiet. Just show query/sec values

    --csv              Output in CSV format

    -l                 Loop. Run the tests forever

    -t <tests>         Only run the comma separated list of tests. The test

                        names are the same as the ones produced as output.

        -I                 Idle mode. Just open N idle connections and wait.

     

    范例:下面模拟1000个客户端进行数据的处理

    # /usr/local/redis/bin/redis-benchmark -h 127.0.0.1 -p 6379 -c 1000 -d 10 -n 10000

    此命令的参数含义如下:

    -h: 要连接的 Redis 服务器的地址

    -p: 要连接 Redis 的运行端口

    -c: 模拟客户端的数量

    -d: 每次操作的数据长度

    -n: 每个客户端发出的请求数量

     

    测试结果如下(以 set 命令举例):

    ====== SET ======

    65359.48 requests per second    #表示 set 请求,可以每秒65359.48次请求

  • 相关阅读:
    nginx-1.8.1的安装
    ElasticSearch 在3节点集群的启动
    The type java.lang.CharSequence cannot be resolved. It is indirectly referenced from required .class files
    sqoop导入导出对mysql再带数据库test能跑通用户自己建立的数据库则不行
    LeetCode 501. Find Mode in Binary Search Tree (找到二叉搜索树的众数)
    LeetCode 437. Path Sum III (路径之和之三)
    LeetCode 404. Sum of Left Leaves (左子叶之和)
    LeetCode 257. Binary Tree Paths (二叉树路径)
    LeetCode Questions List (LeetCode 问题列表)- Java Solutions
    LeetCode 561. Array Partition I (数组分隔之一)
  • 原文地址:https://www.cnblogs.com/abeam/p/14723974.html
Copyright © 2011-2022 走看看