zoukankan      html  css  js  c++  java
  • 01 redis基础

    一.什么是redis

    • 1.开源分布式kv数据库
    • 2.C语言编写,单线程运行
    • 3.支持数据类型分别是key、string、list、set、hash、zset
    • 4.提供多种语言API,常见的c/java/php/python/node.js/perl/swift等
    • 5.高性能,并提供持久化机制
    • 6.支持一致性hash集群分布,支持主从复制高可用方案

    二.优点

    • 1.高性能,写8W/s,读11W/s
    • 2.易用,数据类型比MC更多
    • 3.易扩展,支持lua脚本、集群、高可用
    • 4.数据可靠及完整性,两种持久化方式:rdb、aof,支持部分事务
    • 5.生产实践多
    • 6.社区活跃,培训多,在线文档全

    三.redis与MC对比样例

    3.1测试用例说明
    • 1.key范围:2-100字节随机生产
    • 2.value固定100字节
    • 3.初始数据分别为0/500w/1500w
    • 4.分别测试insert、select
    • 5.每次测试并发50线程,每个线程处理10w记录
    • 6.redis开启快照持久化,300s一次
    • 7.开启redis虚拟内存功能
    • 8.7500w-8000w存量的数据内存约13G左右
    3.2测试结论
    类型 MC redis
    相同的数据模型 保存的热数据量比redis高,13G内存下能保存1亿条数据 保存8000w条
    相同的服务器环境写性能 写性能比redis高,约10W条每秒 约7W条每秒
    相同的服务器环境读性能 约10W条每秒 约8W条每秒
    达到内存上限的处理 插入性能在临界点有些抖动,然后将到约7W条每秒,之后性能跟临界点之前一样
    达到内存上限的性能 读性能并没有变化 性能急剧下降,1100条每秒,之后受子进程dump数据竞争系统资源影响而非常不稳定性能急剧下降,之后受子进程dump数据和每秒产生大量页面错误影响而持续下降
    单个CPU百分比 内存上限临界点约300%,其他稳定在150%左右 内存上限临界前90%左右,之后受子进程dump数据和每秒产生大量页面错误影响,CPU使用率不高,甚至降到1%
    CPU利用率 单实例 单线程运行,只能用一颗CPU,单主机多实例
    内存占用 都随着写入数据的增多而增大,达到内存上限后不再变化 受子进程dump数据竞争而持续下降
    页面错误 纯内存操作,不产生页面错误 达到内存上限后,需要将数据转储虚拟内存,受子进程dump数据竞争系统资源影响产生大量页面错误
    IO操作 纯内存操作 insert时,达到内存上线前没有明显IO读操作,有明显IO写操作,因为快照,达到内存上线后,有明显磁盘IO读操作,写操作反而不明显

    四.业务场景

    4.1复杂数据结构及业务场景
    • 1.利用内存的高效,基于lua业务逻辑扩展,实现基于缓存的业务逻辑计算,比如商品实时价格
    • 2.利用redis事务机制,支撑复杂的业务,保障业务完整性,如扣除库存以及下订单
    • 3.取罪行N个数据的操作,比如最新评论,基于list,取前后末尾
    • 4.排行榜应用,取top n操作,基于sorted set中的score排序
    • 5.查找过期数据,基于sorted set中的score,把score的值设置为时间
    • 6.计数器,高性能,具备原子性
    • 7.uniq操作,获取某段时间所有数据排重值
    • 8.pub/sub构建实时消息系统
    • 9.构建队列系统
    4.2 宕机时间短
    • 1.基于快照、aof、主从复制提供高可用和数据快速还原
    • 2.业务越复杂,丢失的数据恢复越困难

    五.安装redis4.0,以服务方式进行安装部署

    • 1)下载解压,不需要编译
    wget http://download.redis.io/releases/redis-4.0.8.tar.gz
    tar -zxvf redis-4.0.8.tar.gz
    cd redis-4.0.8
    make && make install
    
    • 2)结束之后在目录/usr/local/bin会生成如下文件
    -rwxr-xr-x. 1 root root 5.5M Mar 29 10:55 redis-server
    -rwxr-xr-x. 1 root root 2.4M Mar 29 10:55 redis-benchmark
    -rwxr-xr-x. 1 root root 2.5M Mar 29 10:55 redis-cli
    -rwxr-xr-x. 1 root root 5.5M Mar 29 10:55 redis-check-rdb
    -rwxr-xr-x. 1 root root 5.5M Mar 29 10:55 redis-check-aof
    lrwxrwxrwx. 1 root root   12 Mar 29 10:55 redis-sentinel -> redis-server
    

    也可以安装到指定目录make install PREFIX=/usr/local/redis

    • 3)从源码目录拷贝单独的配置文件
    mkdir -p /usr/local/redis/etc
    cp /root/redis-4.0.8/*.conf /usr/local/redis/etc
    
    • 4)配置连接地址和密码
    vi /usr/local/redis/etc/redis.conf
    #bind 127.0.0.1
    requirepass foobared
    daemonize yes
    #protected-mode yes
    dir /usr/local/redis/work
    #slaveof 172.16.3.140 6379
    # master不需要设置slaveof,只有slave才需要
    
    • 5)启动脚本
    cp /root/redis-4.0.8/utils/redis_init_script /etc/init.d/redis
    touch /etc/init.d/redis
    chmod u+x /etc/init.d/redis
    vi /etc/init.d/redis
    #!/bin/sh
    #
    # redis        Startup script for Redis Server
    #
    # chkconfig: - 80 12
    # description: Redis is an open source, advanced key-value store.
    #
    # processname: redis-server
    # config: /etc/redis.conf
    # pidfile: /var/run/redis.pid
    source /etc/init.d/functions
    BIN="/usr/local/redis/bin"
    CONFIG="/usr/local/redis/etc/redis.conf"
    PIDFILE="/var/run/redis.pid"
    ### Read configuration
    [ -r "$SYSCONFIG" ] && source "$SYSCONFIG"
    RETVAL=0
    prog="redis-server"
    desc="Redis Server"
    start() {
            if [ -e $PIDFILE ];then
                 echo "$desc already running...."
                 exit 1
            fi
            echo -n $"Starting $desc: "
            daemon $BIN/$prog $CONFIG
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$prog
            return $RETVAL
    }
    stop() {
            echo -n $"Stop $desc: "
            killproc $prog
            RETVAL=$?
            echo
            [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$prog $PIDFILE
            return $RETVAL
    }
    restart() {
            stop
            start
    }
    case "$1" in
      start)
            start
            ;;
      stop)
            stop
            ;;
      restart)
            restart
            ;;
      condrestart)
            [ -e /var/lock/subsys/$prog ] && restart
            RETVAL=$?
            ;;
      status)
            status $prog
            RETVAL=$?
            ;;
       *)
            echo $"Usage: $0 {start|stop|restart|condrestart|status}"
            RETVAL=1
    esac
    exit $RETVAL
    
    • 6)启动验证
    /etc/init.d/redis start
    [root@haproxy02 init.d]# redis-cli -h 172.16.3.141 -p 6379 -a foobared
    172.16.3.141:6379> 
    

    六.启动参数

    6.1启动
    • 1.默认启动
    src/redis-server
    # 默认前台启动
    # 默认不适用配置文件
    
    • 2.后台启动
    src/redis-server &
    # 不要用
    参数文件 daemonize yes
    
    • 3.启动参数
    root@haproxy02 bin]# ./redis-server --help
    Usage: ./redis-server [/path/to/redis.conf] [options]
           ./redis-server - (read config from stdin)
           ./redis-server -v or --version
           ./redis-server -h or --help
           ./redis-server --test-memory <megabytes>
    #
    Examples:
           ./redis-server (run the server with default conf)
           ./redis-server /etc/redis/6379.conf
           ./redis-server --port 7777
           ./redis-server --port 7777 --slaveof 127.0.0.1 8888
           ./redis-server /etc/myredis.conf --loglevel verbose
    #
    Sentinel mode:
           ./redis-server /etc/sentinel.conf --sentinel
    
    6.2常用参数说明
    • daemonize:后台运行,默认no
    • pidfile:pid文件位置,默认/run/redis.pid
    • port:监听端口号,默认6379
    • bind 127.0.0.1,监听网卡的IP,远程被连接需要注释掉
    • logfile:log文件位置,默认stdout,默认后台模式会输出到/dev/null
    • loglevel notice,日志记录级别,多到少:debug/verbose/notice/warning
    6.3自启动配置
    • 1.以端口命名参数文件
    cp /root/redis-4.0.8/redis.conf /usr/local/redis/etc/redis_6379.conf
    
    • 2.复制到启动脚本到/etc/init.d目录下
    [root@haproxy02 utils]# pwd
    /root/redis-4.0.8/utils
    [root@haproxy02 utils]# cat redis_init_script
    #!/bin/sh
    # chkconfig: 2345 90 10
    # 增加项,linux启动级别2345,启动优先级90,关闭优先级10
    # Simple Redis init.d script conceived to work on Linux systems
    # as it does use of the /proc filesystem.
    #
    REDISPORT=6379
    #EXEC=/usr/local/bin/redis-server
    EXEC=/usr/local/redis/bin/redis-server
    # 修改项
    #CLIEXEC=/usr/local/bin/redis-cli
    CLIEXEC=/usr/local/redis/bin/redis-cli
    # 修改项
    #
    PIDFILE=/var/run/redis_${REDISPORT}.pid
    # 配置与config文件里的pidfile参数一致
    CONF="/etc/redis/${REDISPORT}.conf"
    # 修改项
    case "$1" in
        start)
            if [ -f $PIDFILE ]
            then
                    echo "$PIDFILE exists, process is already running or crashed"
            else
                    echo "Starting Redis server..."
                    $EXEC $CONF
            fi
            ;;
        stop)
            if [ ! -f $PIDFILE ]
            then
                    echo "$PIDFILE does not exist, process is not running"
            else
                    PID=$(cat $PIDFILE)
                    echo "Stopping ..."
                    $CLIEXEC -p $REDISPORT shutdown
                    while [ -x /proc/${PID} ]
                    do
                        echo "Waiting for Redis to shutdown ..."
                        sleep 1
                    done
                    echo "Redis stopped"
            fi
            ;;
        *)
            echo "Please use start or stop as first argument"
            ;;
    esac
    
    6.4客户端命令
    • 1.默认连接本地6379端口
    redis-cli
    # 等于redis-cli -h 127.0.0.1 -p 6379
    
    • 2.加了密码连接
    redis-cli -h 127.0.0.1 -p 6379 -a foobared
    
  • 相关阅读:
    mysql添加用户和密码
    常用正则表达式
    锐捷配置telnet
    Cisco配置aaa验证
    华为交换机端口镜像配置
    华为交换机boot默认密码
    python自动化运维常用模块安装
    python交互模式下tab键自动补全
    python脚本检查TCP端口是否正常
    python脚本获取主机Mac地址
  • 原文地址:https://www.cnblogs.com/jenvid/p/9131144.html
Copyright © 2011-2022 走看看