zoukankan      html  css  js  c++  java
  • Redis for OPS 07:Redis 补充说明

    写在前面的话

    redis 的各种架构搭建暂时就到这里,本文主要用于补充说明 Redis 的一些概念以及配置文件的相关信息。

    常用词汇

    缓存穿透:

    类似热点数据存储 Redis 一样,对于非热点数据存储到后端 DB,当服务访问一个 Redis 不存在的 KEY,然后请求被交予后端的 DB,当请求量过大时,会导致后端 DB 挂掉。

    解决办法:增大 KEY 的量,使用布隆过滤器将不存在的 KEY 过滤掉,访问到不存在的 KEY 时候,将 KEY 以空值存到缓存,并设置一个过期时间。

    缓存雪崩:

    大量的 KEY 设置了相同的过期时间,导致同一时间失效,造成 DB 瞬间请求变大,引起雪崩。

    解决方法:过期时间可以加上一个随机时间值,使每个 KEY 过期时间错开。

    缓存击穿:

    一个 KEY,在过期时,同时有大量请求,这些请求会被交予 DB,造成 DB 压力剧增。

    解决方案:访问之前,可以使用 SETNX 判断 KEY 是否存在。

    基础配置说明

    #################################################################################################
    # Redis 配置文件说明:
    #################################################################################################
    # 启动命令:/data/services/redis/bin/redis-server /data/services/redis/conf/redis.conf &
    # 监听端口:6379
    # 服务密码:helloworld
    #################################################################################################
    
    #################################################################################################
    # 注释的不常用配置
    #################################################################################################
    # 引入其它配置或者模块
    # include /path/to/local.conf
    # loadmodule /path/to/my_module.so
    
    # 在使用socket作为连接的时候可以使用
    # unixsocket /tmp/redis.sock
    # unixsocketperm 700
    
    # 系统日志设置
    # syslog-enabled no
    # syslog-ident redis
    # syslog-facility local0
    
    # 为了安全,可以将某些命令重命名
    # rename-command CONFIG ""
    
    # 客户端最大并发数,默认0不限制
    # maxclients 10000
    
    # 指定Redis最大内存限制
    # maxmemory <bytes>
    
    # 当达到最大内存的清除策略,默认不清除只是报错
    # maxmemory-policy noeviction
    
    # 清除算法选择的样本数量
    # maxmemory-samples 5
    
    
    #################################################################################################
    # 基础配置
    #################################################################################################
    # 保护模式,如果【yes】必须绑定IP或者设置密码
    protected-mode yes
    
    # 绑定IP地址,多个使用空格隔开,全部可以使用0.0.0.0
    bind 127.0.0.1 192.168.200.101
    
    # 配置密码
    requirepass helloworld
    
    # 运行端口
    port 6379
    
    # TCP已完成连接队列长度,一般大于/proc/sys/net/core/somaxconn,在高并发环境建议调大该值和系统somaxconn的值
    tcp-backlog 2048
    
    # 关闭空闲连接的时间,0为不关闭
    timeout 0
    
    # TCP保活策略,单位秒,Redis每300s检测一次客户端存活,如果没响应就关闭连接
    tcp-keepalive 300
    
    # 以守护进程运行
    daemonize yes
    
    # 可以通过upstart和systemd来管理进程,no表示不需要
    supervised no
    
    # PID文件
    pidfile /data/services/redis/logs/redis-6379.pid
    
    # 日志级别
    loglevel notice
    
    # 日志文件
    logfile "/data/services/redis/logs/redis-6379.log"
    
    # 数据库数目,默认是0库
    databases 16
    
    # 启动显示logo
    always-show-logo yes
    
    #################################################################################################
    # RDB持久化配置
    #################################################################################################
    # 快照保存名字
    dbfilename dump-6379.rdb
    
    # 快照保存目录
    dir "/data/services/redis/data"
    
    # 持久化规则,15分钟一次变化,5分钟10次变化。1分钟10000次变化都会触发持久化
    save 900 1
    save 300 10
    save 60 10000
    
    # 如果开启RDB快照,如果持久化失败,Redis就会拒绝所有写请求
    stop-writes-on-bgsave-error yes
    
    # 对于快照是否进行压缩
    rdbcompression yes
    
    # 快照保存后是否进行数据校验
    rdbchecksum yes
    
    #################################################################################################
    # AOF持久化配置
    #################################################################################################
    # RDB持久化宕机可能丢失部分数据,AOF相当于MySQL binlog
    appendonly yes
    
    # AOF持久化文件名称
    appendfilename "appendonly-6379.aof"
    
    # 持久化策略always/no/always
    appendfsync everysec
    
    # AOF重写或写入RDB时候会产生大量IO,此时AOF的fsync将阻塞很久,如果应用无法接受这种延迟则设置为yes,则rewrite期间不fsync
    no-appendfsync-on-rewrite yes
    
    # 自动重写,当前AOF超过上一次重写时百分之多少触发重写
    auto-aof-rewrite-percentage 100
    
    # 最小达到多大才重写,避免很小的时候就重写
    auto-aof-rewrite-min-size 64mb
    
    # AOF文件尾部可能不完整,redis启动时,数据载入。yes会自动修复,否则可能需要手动redis-check-aof
    aof-load-truncated yes
    
    # 4.0 开始允许两种持久化混合
    aof-use-rdb-preamble no
    
    #################################################################################################
    # 主从配置
    #################################################################################################
    # 从库配置主库的IP端口
    # slaveof <masterip> <masterport>
    
    # 主库有密码的时候配置密码
    # masterauth <master-password>
    
    # 当slave与master断开或者正在同步的时候,设置yes返回的数据可能是旧的,设置no直接返回正在同步的错误
    slave-serve-stale-data yes
    
    # 设置从库只读
    slave-read-only yes
    
    # 主从是否使用无硬盘复制,即主不通过RDB文件直接传数据给从
    repl-diskless-sync no
    
    # 选择无硬盘备份时,需要等待多久才传数据
    repl-diskless-sync-delay 5
    
    # 从向主周期性发送ping包时间
    # repl-ping-slave-period 10
    
    # 备份超时时间
    # repl-timeout 60
    
    # 是否禁用从的CTP_NODELAY,如果yes主从会有一点延时
    repl-disable-tcp-nodelay no
    
    # 备份缓冲区,从库失联后会短暂的帮从库接受数据
    # repl-backlog-size 1mb
    
    # 主多长时间没有和从连接就释放缓冲区
    # repl-backlog-ttl 3600
    
    # 从优先级,用于sentinel选主时使用,数字越小越高,但是0就不参与选举
    slave-priority 100
    
    # 主停止接受写请求,当从在线小于3个,滞后10秒时
    # min-slaves-to-write 3
    # min-slaves-max-lag 10
    
    # Redis master能够通过不通方式列出从的地址和端口
    # slave-announce-ip 5.5.5.5
    # slave-announce-port 1234
    
    #################################################################################################
    # 集群配置
    #################################################################################################
    # 集群开关
    # cluster-enabled yes
    
    # 集群配置文件名称,每个集群都有一个集群配置相关文件用于持久化保存集群信息。Redis 自动生成
    # cluster-config-file nodes-6379.conf
    
    # 节点连接超时毫秒数
    # cluster-node-timeout 15000
    
    # 判断slave是否和master断开连接过长而导致数据过旧,这种节点旧不会倍选为主
    # cluster-slave-validity-factor 10
    
    # slave数量大于该值,slave才能迁移到其它孤立的master
    # cluster-migration-barrier 1
    
    # 默认所有节点的切片都正常集权状态才是OK
    # cluster-require-full-coverage yes
    # cluster-slave-no-failover no

    启动脚本模板

    #!/bin/sh
    
    #################################################################################################
    # 用途:Redis 启停脚本
    # 作者:Dylan<1214966109@qq.com>
    # 时间:2019/11/12
    #################################################################################################
    
    #################################################################################################
    # 系统变量
    #################################################################################################
    # REDIS 安装目录
    REDIS_HOME='/data/services/redis'
    
    # 启动端口
    REDIS_PORT=6379
    
    # 启动服务端命令
    SERVER_CMD="${REDIS_HOME}/bin/redis-server"
    
    # 客户端命令
    CLIENT_CMD="${REDIS_HOME}/bin/redis-cli"
    
    # PID 文件
    PID_FILE="${REDIS_HOME}/logs/redis-${REDIS_PORT}.pid"
    
    # 配置文件
    REDIS_CONF="${REDIS_HOME}/conf/redis-${REDIS_PORT}.conf"
    
    # 导入结果检测
    . /etc/rc.d/init.d/functions
    
    
    #################################################################################################
    # 启动函数
    #################################################################################################
    FUNC_REDIS_START() {
        if [ -f ${PID_FILE} ];then
            action "Redis is running,file ${PID_FILE} is exists!" /bin/false
        else
            ${SERVER_CMD} ${REDIS_CONF} &
            if [ $? -eq 0 ];then
                action "Starting Redis server ..." /bin/true
            else
                action "Starting Redis server ..." /bin/false
            fi
        fi
    }
    
    
    #################################################################################################
    # 停止函数
    #################################################################################################
    FUNC_REDIS_STOP() {
        if [ ! -f ${PID_FILE} ];then
            action "${PID_FILE} does not exist, process is not running!" /bin/false
        else
            PID=$(cat ${PID_FILE})
            ${CLIENT_CMD} -p ${REDIS_PORT} shutdown
            while [ -x /proc/${PID} ];do
                echo "Waiting for Redis to shutdown ..."
                sleep 2
            done
            action "Redis stopped" /bin/true
        fi
    }
    
    
    #################################################################################################
    # 状态函数
    #################################################################################################
    FUNC_REDIS_STATUS() {
        if [ -f ${PID_FILE} ];then
            echo "Redis server is running!"
        else
            echo "Redis is stopped!"
        fi
    }
    
    
    #################################################################################################
    # 重启函数
    #################################################################################################
    FUNC_REDIS_RESTART() {
        FUNC_REDIS_STOP
        sleep 3
        FUNC_REDIS_START
    }
    
    
    #################################################################################################
    # 执行入口
    #################################################################################################
    case "$1" in
        start)
            FUNC_REDIS_START
        ;;
        stop)
            FUNC_REDIS_STOP
        ;;
        status)
            FUNC_REDIS_STATUS
        ;;
        restart)
            FUNC_REDIS_RESTART
        ;;
        *)
            echo $"Usage: $0 {start|stop|restart|status}"
        ;;
    esac
  • 相关阅读:
    load data to matlab
    Apriori algorithm
    LOGIN Dialogue of Qt
    Methods for outlier detection
    MFC改变对话框背景色
    g++宏扩展
    Some key terms of Data Mining
    Qt QLabel 显示中文
    How To Debug a Pyhon Program
    C++命名规范
  • 原文地址:https://www.cnblogs.com/Dy1an/p/11839899.html
Copyright © 2011-2022 走看看