首页 > 数据库 >redis

redis

时间:2022-10-01 08:56:19浏览次数:40  
标签:Rocky redis Redis server 100 root

Redis简介

说明

Redis (Remote Dictionary Server远程字典服务)是一个遵循BSD MIT开源协议的高性能的NoSQL.Redis
基于ANSI C语言语言)编写的key-value数据库,是意大利的Salvatore Sanfilippo在2009年发布,从2010
年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal公司赞助。
目前国内外使用的公司众多,比如:阿里,腾讯,百度,京东,新浪微博,GitHub,Twitter 等
Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库
起到很好的补充作用。它提供了Java,C/C++,Go, C#,PHP,JavaScript,Perl,Object-C,Python,
Ruby,Erlang等客户端

特性

  1. 速度快: 10W QPS,基于内存,C语言实现
  2. 单线程
    持久化
  3. 支持多种数据结构
  4. 支持多种编程语言
  5. 功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
  6. 简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
  7. 主从复制
  8. 支持高可用和分布式

单线程

说明

Redis 6.0版本前一直是单线程方式处理用户的请求

image-20220927213455420

单线程为何如此快?

image-20220927213608311

  1. 纯内存
  2. 非阻塞
  3. 避免线程切换和竞态消耗

主要事项

  • 一次只运行一条命令
  • 避免执行长(慢)命令:keys *, flushall, flushdb, slow lua script, mutil/exec, operate big
    value(collection)
  • 其实不是单线程: 早期版本是单进程单线程,3.0 版本后实际还有其它的线程, 实现特定功能,如: fysnc
    file descriptor,close file descriptor

Redis 对比 Memcached

比较类别 Redis Redis memcached
支持的数据结构 哈希、列表、集合、有序集合 纯kev-value
持久化支持
高可用支持 redis支持集群功能,可以实现主动复制,读写分离。官方也提供了sentinel集群管理工具,能够实现主从服务监控,故障自动转移,这一切,对于客户端都是透明的,无需程序改动,也无需人工介入 需要二次开发
存储value容量 最大512M 最大1M
内存分配 临时申请空间,可能导致碎片 预分配内存池的方式管理内存,能够省去内存分配时间
虚拟内存使用 有自己的VM机制,理论上能够存储比物理内存更多的数据,当数据超量时,会引发swap,把冷数据刷到磁盘上 所有的数据存储在物理内存里
网络模型 非阻塞IO复用模型,提供一些非KV存储之外的排序,聚合功能,在执行这些功能时,复杂的CPU计算,会阻塞整个IO调度 非阻塞IO复用模型
水平扩展的支持 redis cluster 可以横向扩展暂
多线程 Redis6.0之前是只支持单线程 Memcached支持多线程,CPU利用方面Memcache优于Redis
过期策略 有专门线程,清除缓存数据 懒淘汰机制:每次往缓存放入数据的时候,都会存一个时间,在读取的时候要和设置的时间做TTL比较来判断是否过期
单机QPS 约10W 约60W
源代码可读性 代码清爽简洁 可能是考虑了太多的扩展性,多系统的兼容性,代码不清爽
适用场景 复杂数据结构、有持久化、高可用需求、value存储内容较大 纯KV,数据量非常大,并发量非常大的业务

Redis 常见应用场景

  • 缓存:缓存RDBMS中数据,比如网站的查询结果、商品信息、微博、新闻、消息
  • Session 共享:实现Web集群中的多服务器间的session共享
  • 计数器:商品访问排行榜、浏览数、粉丝数、关注、点赞、评论等和次数相关的数值统计场景
  • 社交:朋友圈、共同好友、可能认识他们等
  • 地理位置: 基于地理信息系统GIS(Geographic Information System)实现摇一摇、附近的人、外卖
    等功能
  • 消息队列:ELK等日志系统缓存、业务的订阅/发布系统

image-20220927215134172

缓存的实现流程

数据更新操作流程:

image-20220927215250678

数据读操作流程:

image-20220927215308592

Redis安装

  • 官网下载地址

    http://download.redis.io/releases/
    

    image-20220927220902919

yum/dnf安装

  • 查看yum可安装的redis信息

    #CentOS 8 由系统源提供,在CentOS7系统上需要安装EPEL源
    [root@Rocky_100 ~]#yum info redis
    上次元数据过期检查:0:10:38 前,执行于 2022年09月27日 星期二 21时45分22秒。
    可安装的软件包
    名称         : redis
    版本         : 5.0.3
    发布         : 5.module+el8.5.0+657+2674830e
    架构         : x86_64
    大小         : 926 k
    源           : redis-5.0.3-5.module+el8.5.0+657+2674830e.src.rpm
    仓库         : AppStream
    概况         : A persistent key-value database
    URL          : http://redis.io
    协议         : BSD and MIT
    描述         : Redis is an advanced key-value store. It is often referred to as a data
                 : structure server since keys can contain strings, hashes, lists, sets and
                 : sorted sets.
    
    
  • 安装Redis命令

    dnf -y install redis
    
  • 开机启动Redis

    systemctl enable --now redis
    
  • 查看redis端口

    [root@Rocky_100 ~]#ss -tnl
    State            Recv-Q           Send-Q                      Local Address:Port                       Peer Address:Port           Process           
    LISTEN           0                511                             127.0.0.1:6379                            0.0.0.0:*                                
    LISTEN           0                128                               0.0.0.0:22                              0.0.0.0:*                                
    LISTEN           0                128                                  [::]:22                                 [::]:*  
    
  • 查看redis进程和线程

    [root@Rocky_100 ~]#pstree -p|grep redis
               |-redis-server(1755)-+-{redis-server}(1756)
               |                    |-{redis-server}(1757)
               |                    `-{redis-server}(1758)
    
  • 进入命令行

    [root@Rocky_100 ~]#redis-cli
    127.0.0.1:6379> 
    
  • ping命令可用于检测redis实例是否存活,如果存活则显示PONG

    [root@Rocky_100 ~]#redis-cli
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> 
    [root@Rocky_100 ~]#redis-cli ping
    PONG
    
  • info:提供服务器的信息和统计

    [root@Rocky_100 ~]#redis-cli
    127.0.0.1:6379> info
    # Server
    redis_version:5.0.3
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:7fa21edfc0646001
    redis_mode:standalone
    os:Linux 4.18.0-348.el8.0.2.x86_64 x86_64
    arch_bits:64
    multiplexing_api:epoll
    .......
    

编译安装

  • Redis 源码包官方下载链接:

    http://download.redis.io/releases/
    
  • 下载安装

    wget http://download.redis.io/releases/redis-6.2.7.tar.gz
    

编译安装步骤

#安装依赖包
[root@Rocky_100 ~]#yum -y install gcc make jemalloc-devel
#如果支持systemd需要安装下面包
[root@Rocky_100 ~]#yum -y install gcc jemalloc-devel systemd-devel
#[root@ubuntu2004 ~]#apt -y install make gcc libjemalloc-dev libsystemd-dev
#下载源码
[root@Rocky_100 ~]#wget http://download.redis.io/releases/redis-6.2.7.tar.gz
[root@Rocky_100 ~]#tar xvf redis-6.2.7.tar.gz 
#编译安装
[root@Rocky_100 ~]#cd redis-6.2.7/
[root@Rocky_100 redis-6.2.7]#make -j 2 PREFIX=/apps/redis install #指定redis安装目录
#如果支持systemd,需要执行下面
[root@Rocky_100 redis-6.2.7]#make -j 2 USE_SYSTEMD=yes PREFIX=/apps/redis install
#配置环境变量
[root@centos8 ~]#echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
[root@centos8 ~]#. /etc/profile.d/redis.sh
#目录结构
[root@Rocky_100 redis-6.2.7]#tree /apps/redis/
/apps/redis/
└── bin
    ├── redis-benchmark
    ├── redis-check-aof -> redis-server
    ├── redis-check-rdb -> redis-server
    ├── redis-cli
    ├── redis-sentinel -> redis-server
    └── redis-server

1 directory, 6 files
[root@Rocky_100 redis-6.2.7]#mkdir /apps/redis/{etc,log,data,run} #创建配置文件、日志、数据等目录
[root@Rocky_100 ~]#cd /root/redis-6.2.7/
[root@Rocky_100 redis-6.2.7]#cp redis.conf /apps/redis/etc/

前台启动 Redis

#redis-server 是 redis 服务器端的主程序
[root@Rocky_100 redis-6.2.7]#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 --replicaof 127.0.0.1 8888
       ./redis-server /etc/myredis.conf --loglevel verbose -
       ./redis-server /etc/myredis.conf --loglevel verbose

Sentinel mode:
       ./redis-server /etc/sentinel.conf --sentinel

前台启动 redis

[root@Rocky_100 redis-6.2.7]#redis-server /apps/redis/etc/redis.conf
12776:C 27 Sep 2022 23:12:41.292 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12776:C 27 Sep 2022 23:12:41.292 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=12776, just started
12776:C 27 Sep 2022 23:12:41.292 # Configuration loaded
12776:M 27 Sep 2022 23:12:41.293 * monotonic clock: POSIX clock_gettime
12776:M 27 Sep 2022 23:12:41.293 # A key '__redis__compare_helper' was added to Lua globals which is not on the globals allow list nor listed on the deny list.
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.2.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
 |    `-._   `._    /     _.-'    |     PID: 12776
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

12776:M 27 Sep 2022 23:12:41.294 # Server initialized
12776:M 27 Sep 2022 23:12:41.294 * Ready to accept connections

#另外开启命令行终端窗口,查看redis默认服务端口:6379
[root@Rocky_100 redis-6.2.7]#ss -ntl
State            Recv-Q           Send-Q                      Local Address:Port                       Peer Address:Port           Process           
LISTEN           0                511                             127.0.0.1:6379                            0.0.0.0:*                                
LISTEN           0                128                               0.0.0.0:22                              0.0.0.0:*                                
LISTEN           0                511                                 [::1]:6379                               [::]:*                                
LISTEN           0                128                                  [::]:22                                 [::]:* 

开启 Redis 多实例

[root@Rocky_100 redis-6.2.7]#redis-server --port 6380
12795:C 27 Sep 2022 23:19:37.732 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
12795:C 27 Sep 2022 23:19:37.732 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=12795, just started
12795:C 27 Sep 2022 23:19:37.732 # Configuration loaded
12795:M 27 Sep 2022 23:19:37.734 * monotonic clock: POSIX clock_gettime
12795:M 27 Sep 2022 23:19:37.734 # A key '__redis__compare_helper' was added to Lua globals which is not on the globals allow list nor listed on the deny list.
                _._                                                  
           _.-``__ ''-._                                             
      _.-``    `.  `_.  ''-._           Redis 6.2.7 (00000000/0) 64 bit
  .-`` .-```.  ```\/    _.,_ ''-._                                  
 (    '      ,       .-`  | `,    )     Running in standalone mode
 |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6380
 |    `-._   `._    /     _.-'    |     PID: 12795
  `-._    `-._  `-./  _.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |           https://redis.io       
  `-._    `-._`-.__.-'_.-'    _.-'                                   
 |`-._`-._    `-.__.-'    _.-'_.-'|                                  
 |    `-._`-._        _.-'_.-'    |                                  
  `-._    `-._`-.__.-'_.-'    _.-'                                   
      `-._    `-.__.-'    _.-'                                       
          `-._        _.-'                                           
              `-.__.-'                                               

12795:M 27 Sep 2022 23:19:37.734 # Server initialized
12795:M 27 Sep 2022 23:19:37.735 * Loading RDB produced by version 6.2.7
12795:M 27 Sep 2022 23:19:37.735 * RDB age 36 seconds
12795:M 27 Sep 2022 23:19:37.735 * RDB memory usage when created 0.77 Mb
12795:M 27 Sep 2022 23:19:37.735 # Done loading RDB, keys loaded: 0, keys expired: 0.
12795:M 27 Sep 2022 23:19:37.735 * DB loaded from disk: 0.000 seconds
12795:M 27 Sep 2022 23:19:37.735 * Ready to accept connections

#另外开启命令行终端窗口,查看redis服务端口:6380
[root@Rocky_100 ~]#ss -ntl
State            Recv-Q           Send-Q                      Local Address:Port                       Peer Address:Port           Process           
LISTEN           0                511                             127.0.0.1:6379                            0.0.0.0:*                                
LISTEN           0                511                               0.0.0.0:6380                            0.0.0.0:*                                
LISTEN           0                128                               0.0.0.0:22                              0.0.0.0:*                                
LISTEN           0                511                                 [::1]:6379                               [::]:*                                
LISTEN           0                511                                  [::]:6380                               [::]:*                                
LISTEN           0                128                                  [::]:22                                 [::]:*                                
[root@Rocky_100 ~]#ps -ef|grep redis
root       12804    1431  0 23:25 pts/0    00:00:00 redis-server 127.0.0.1:6379
root       12811    9247  0 23:26 pts/1    00:00:00 redis-server *:6380
root       12844   12819  0 23:27 pts/2    00:00:00 grep --color=auto redis

消除启动时的三个Warning提示信息(可选)

前面直接启动Redis时有三个Waring信息,可以用下面方法消除告警,但非强制消除

Tcp backlog

WARNING: The TCP backlog setting of 511 cannot be enforced because
/proc/sys/net/core/somaxconn is set to the lower value of 128.
  • 说明

    Tcp backlog 是指TCP的第三次握手服务器端收到客户端 ack确认号之后到服务器用Accept函数处理请求
    前的队列长度,即全连接队列
    
  • 配置

    #vim /etc/sysctl.conf
    net.core.somaxconn = 1024
    #sysctl -p
    

overcommit_memory

WARNING overcommit_memory is set to 0! Background save may fail under low memory
condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf
and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to
take effect.
  • 内核参数说明:

    内核参数overcommit_memory 实现内存分配策略,可选值有三个:0、1、2
    0 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则内存
    申请失败,并把错误返回给应用进程
    1 表示内核允许分配所有的物理内存,而不管当前的内存状态如何
    2 表示内核允许分配超过所有物理内存和交换空间总和的内存
    
  • 配置

    #vim /etc/sysctl.conf
    vm.overcommit_memory = 1
    #sysctl -p
    

transparent hugepage

WARNING you have Transparent Huge Pages (THP) support enabled in your kernel.
This will create latency and memory usage issues with Redis. To fix this issue
run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as
root, and add it to your /etc/rc.local in order to retain the setting after a
reboot. Redis must be restarted after THP is disabled.
警告:您在内核中启用了透明大页面(THP,不同于一般4k内存页,而为2M)支持。 这将在Redis中造成延迟
和内存使用问题。 要解决此问题,请以root 用户身份运行命令“echo never>
/sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的/etc/rc.local中,以便在
重启后保留设置。禁用THP后,必须重新启动Redis。
  • 注意:ubuntu20.04, Rocky8/CentOS8 默认为 never,所以此值无需优化

  • 配置

    [root@centos8 ~]#echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
    [root@Rocky_100 ~]#echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
    [root@Rocky_100 ~]#cat /etc/rc.d/rc.local
    #!/bin/bash
    # THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
    #
    # It is highly advisable to create own systemd services or udev rules
    # to run scripts during boot instead of using this file.
    #
    # In contrast to previous versions due to parallel execution during boot
    # this script will NOT be run after all other services.
    #
    # Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
    # that this script will be executed during boot.
    
    touch /var/lock/subsys/local
    
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    [root@Rocky_100 ~]#chmod +x /etc/rc.d/rc.local
    [root@Rocky_100 ~]#
    

验证是否消除 Warning

重新启动redis 服务不再有前面的三个Waring信息

创建 Redis 用户和设置数据目录权限

[root@Rocky_100 ~]#useradd -r -s /sbin/nologin redis
[root@Rocky_100 ~]#id redis 
uid=994(redis) gid=991(redis) 组=991(redis)
#设置目录权限
[root@Rocky_100 ~]#chown -R redis.redis /apps/redis/

创建 Redis 服务 Service 文件

#可以复制CentOS8利用yum安装Redis生成的redis.service文件,进行修改
[root@Rocky_100 ~]#scp 10.0.0.8:/lib/systemd/system/redis.service
/lib/systemd/system/
[root@Rocky_100 ~]#vim /lib/systemd/system/redis.service
[root@Rocky_100 ~]#cat /lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify #如果支持systemd可以启用此行
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000 #指定此值才支持更大的maxclients值
[Install]
WantedBy=multi-user.target

Redis 通过Service方式启动

[root@Rocky_100 ~]#systemctl daemon-reload
[root@Rocky_100 ~]#systemctl start redis
[root@Rocky_100 ~]#systemctl status redis
● redis.service - Redis persistent key-value database
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2022-09-28 00:34:11 CST; 12s ago
 Main PID: 13010 (redis-server)
    Tasks: 5 (limit: 12257)
   Memory: 8.8M
   CGroup: /system.slice/redis.service
           └─13010 /apps/redis/bin/redis-server 127.0.0.1:6379

9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:C 28 Sep 2022 00:34:11.661 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:C 28 Sep 2022 00:34:11.661 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=130>
9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:C 28 Sep 2022 00:34:11.661 # Configuration loaded
9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:M 28 Sep 2022 00:34:11.662 * Increased maximum number of open files to 10032 (it was originally>
9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:M 28 Sep 2022 00:34:11.662 * monotonic clock: POSIX clock_gettime
9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:M 28 Sep 2022 00:34:11.662 # A key '__redis__compare_helper' was added to Lua globals which is >
9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:M 28 Sep 2022 00:34:11.663 * Running mode=standalone, port=6379.
9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:M 28 Sep 2022 00:34:11.663 # Server initialized
9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:M 28 Sep 2022 00:34:11.664 * Ready to accept connections
9月 28 00:34:11 Rocky_100 redis-server[13010]: 13010:M 28 Sep 2022 00:34:11.664 # systemd supervision error: NOTIFY_SOCKET not found!
lines 1-19/19 (END)
[root@Rocky_100 ~]#ss -ntl
State            Recv-Q           Send-Q                      Local Address:Port                       Peer Address:Port           Process           
LISTEN           0                511                             127.0.0.1:6379                            0.0.0.0:*                                
LISTEN           0                128                               0.0.0.0:22                              0.0.0.0:*                                
LISTEN           0                511                                 [::1]:6379                               [::]:*                                
LISTEN           0                128                                  [::]:22  

验证客户端连接 Redis

image-20220928003628748

  • 客户端连接格式

    redis-cli -h IP/HOSTNAME -p PORT -a PASSWORD
    
  • 连接客户端

    #默认无密码
    [root@Rocky_100 ~]#redis-cli 
    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> INFO
    # Server
    redis_version:6.2.7
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:edcdaa437413d981
    redis_mode:standalone
    os:Linux 4.18.0-348.el8.0.2.x86_64 x86_64
    arch_bits:64
    monotonic_clock:POSIX clock_gettime
    

自动化脚本一键安装

REDIS_VERSION=redis-6.2.5
#REDIS_VERSION=redis-4.0.14
PASSWORD=123456
INSTALL_DIR=/apps/redis
CPUS=`lscpu |awk '/^CPU\(s\)/{print $2}'`

. /etc/os-release

color () {
    RES_COL=60
    MOVE_TO_COL="echo -en \\033[${RES_COL}G"
    SETCOLOR_SUCCESS="echo -en \\033[1;32m"
    SETCOLOR_FAILURE="echo -en \\033[1;31m"
    SETCOLOR_WARNING="echo -en \\033[1;33m"
    SETCOLOR_NORMAL="echo -en \E[0m"
    echo -n "$1" && $MOVE_TO_COL
    echo -n "["
    if [ $2 = "success" -o $2 = "0" ] ;then
        ${SETCOLOR_SUCCESS}
        echo -n $"  OK  "    
    elif [ $2 = "failure" -o $2 = "1"  ] ;then 
        ${SETCOLOR_FAILURE}
        echo -n $"FAILED"
    else
        ${SETCOLOR_WARNING}
        echo -n $"WARNING"
    fi
    ${SETCOLOR_NORMAL}
    echo -n "]"
    echo 
}


prepare(){
    if [ $ID = "centos" -o $ID = "rocky" ];then
        yum  -y install gcc make jemalloc-devel systemd-devel
    else
	    apt update 
	    apt -y install  gcc make libjemalloc-dev libsystemd-dev
    fi
    if [ $? -eq 0 ];then
        color "安装软件包成功"  0
    else
        color "安装软件包失败,请检查网络配置" 1
        exit
    fi
}
install() {   
    if [ ! -f ${REDIS_VERSION}.tar.gz ];then
        wget http://download.redis.io/releases/${REDIS_VERSION}.tar.gz || { color "Redis 源码下载失败" 1 ; exit; }
    fi
    tar xf ${REDIS_VERSION}.tar.gz -C /usr/local/src
    cd /usr/local/src/${REDIS_VERSION}
    make -j $CUPS USE_SYSTEMD=yes PREFIX=${INSTALL_DIR} install && color "Redis 编译安装完成" 0 || { color "Redis 编译安装失败" 1 ;exit ; }

    ln -s ${INSTALL_DIR}/bin/redis-*  /usr/bin/
    
    mkdir -p ${INSTALL_DIR}/{etc,log,data,run}
  
    cp redis.conf  ${INSTALL_DIR}/etc/

    sed -i -e 's/bind 127.0.0.1/bind 0.0.0.0/'  -e "/# requirepass/a requirepass $PASSWORD"  -e "/^dir .*/c dir ${INSTALL_DIR}/data/"  -e "/logfile .*/c logfile ${INSTALL_DIR}/log/redis-6379.log"  -e  "/^pidfile .*/c  pidfile ${INSTALL_DIR}/run/redis_6379.pid" ${INSTALL_DIR}/etc/redis.conf


    if id redis &> /dev/null ;then 
         color "Redis 用户已存在" 1 
    else
         useradd -r -s /sbin/nologin redis
         color "Redis 用户创建成功" 0
    fi

    chown -R redis.redis ${INSTALL_DIR}

    cat >> /etc/sysctl.conf <<EOF
net.core.somaxconn = 1024
vm.overcommit_memory = 1
EOF
    sysctl -p 
    if [ $ID = "centos" -o $ID = "rocky" ];then
        echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
        chmod +x /etc/rc.d/rc.local
        /etc/rc.d/rc.local 
    else 
        echo -e '#!/bin/bash\necho never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.local
        chmod +x /etc/rc.local
        /etc/rc.local
    fi


cat > /lib/systemd/system/redis.service <<EOF
[Unit]
Description=Redis persistent key-value database
After=network.target

[Service]
ExecStart=${INSTALL_DIR}/bin/redis-server ${INSTALL_DIR}/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT \$MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000

[Install]
WantedBy=multi-user.target

EOF
     systemctl daemon-reload 
     systemctl enable --now  redis &> /dev/null 
     if [ $? -eq 0 ];then
         color "Redis 服务启动成功,Redis信息如下:"  0 
     else
         color "Redis 启动失败" 1 
         exit
     fi
     sleep 2
     redis-cli -a $PASSWORD INFO Server 2> /dev/null
}

prepare 
install 

Redis 的多实例

说明

测试环境中经常使用多实例,需要指定不同实例的相应的端口,配置文件,日志文件等相关配置

配置步骤:以编译安装为例实现 redis 多实例

#生成的文件列表 sed -r '/^ExecStart/s/(.*)redis(.*)$/\1redis6379\2/'
[root@Rocky_100 ~]#tree /apps/redis/
/apps/redis/
├── bin
│   ├── redis-benchmark
│   ├── redis-check-aof -> redis-server
│   ├── redis-check-rdb -> redis-server
│   ├── redis-cli
│   ├── redis-sentinel -> redis-server
│   └── redis-server
├── data
├── etc
│   └── redis.conf
├── log
└── run

5 directories, 7 files
[root@Rocky_100 ~]#mv /apps/redis/etc/{redis.conf,redis6379.conf} 
[root@Rocky_100 ~]#sed  's/6379/6380/' /apps/redis/etc/redis6379.conf >/apps/redis/etc/redis6380.conf
[root@Rocky_100 ~]#sed  's/6379/6381/' /apps/redis/etc/redis6379.conf >/apps/redis/etc/redis6381.conf
[root@Rocky_100 ~]#tree /apps/redis/
/apps/redis/
├── bin
│   ├── redis-benchmark
│   ├── redis-check-aof -> redis-server
│   ├── redis-check-rdb -> redis-server
│   ├── redis-cli
│   ├── redis-sentinel -> redis-server
│   └── redis-server
├── data
├── etc
│   ├── redis6379.conf
│   ├── redis6380.conf
│   └── redis6381.conf
├── log
└── run

5 directories, 9 files
#可以先从yum安装的redis拷贝systemd启动服务:/usr/lib/systemd/system/redis.service
[root@Rocky_100 ~]#cat  /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify #如果支持systemd可以启用此行
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000 #指定此值才支持更大的maxclients值
[Install]
WantedBy=multi-user.target
[root@Rocky_100 ~]#mv /usr/lib/systemd/system/{redis.service,redis6379.service}
[root@Rocky_100 ~]#sed -ri '/^ExecStart/s/(.*)redis(.*)$/\1redis6379\2/' /usr/lib/systemd/system/redis6379.service
[root@Rocky_100 ~]#sed -r '/^ExecStart/s/(.*)redis.*(\..*)$/\1redis6380\2/' /usr/lib/systemd/system/redis6379.service > /usr/lib/systemd/system/redis6380.service
[root@Rocky_100 ~]#sed -r '/^ExecStart/s/(.*)redis.*(\..*)$/\1redis6381\2/' /usr/lib/systemd/system/redis6379.service > /usr/lib/systemd/system/redis6381.service

[root@Rocky_100 ~]#cat /usr/lib/systemd/system/redis6379.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis6379.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify #如果支持systemd可以启用此行
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000 #指定此值才支持更大的maxclients值
[Install]
WantedBy=multi-user.target

[root@Rocky_100 ~]#cat /usr/lib/systemd/system/redis6380.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis6380.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify #如果支持systemd可以启用此行
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000 #指定此值才支持更大的maxclients值
[Install]
WantedBy=multi-user.target

[root@Rocky_100 ~]#cat /usr/lib/systemd/system/redis6381.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis6381.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify #如果支持systemd可以启用此行
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
LimitNOFILE=1000000 #指定此值才支持更大的maxclients值
[Install]
WantedBy=multi-user.target

[root@Rocky_100 ~]#systemctl enable --now redis6379
Created symlink /etc/systemd/system/multi-user.target.wants/redis6379.service → /usr/lib/systemd/system/redis6379.service.
[root@Rocky_100 ~]#systemctl enable --now redis6380
Created symlink /etc/systemd/system/multi-user.target.wants/redis6380.service → /usr/lib/systemd/system/redis6380.service.
[root@Rocky_100 ~]#systemctl enable --now redis6381
Created symlink /etc/systemd/system/multi-user.target.wants/redis6381.service → /usr/lib/systemd/system/redis6381.service.
[root@Rocky_100 ~]#ss -tnl
State            Recv-Q           Send-Q                      Local Address:Port                       Peer Address:Port           Process           
LISTEN           0                511                             127.0.0.1:6379                            0.0.0.0:*                                
LISTEN           0                511                             127.0.0.1:6380                            0.0.0.0:*                                
LISTEN           0                511                             127.0.0.1:6381                            0.0.0.0:*                                
LISTEN           0                128                               0.0.0.0:22                              0.0.0.0:*                                
LISTEN           0                511                                 [::1]:6379                               [::]:*                                
LISTEN           0                511                                 [::1]:6380                               [::]:*                                
LISTEN           0                511                                 [::1]:6381                               [::]:*                                
LISTEN           0                128                                  [::]:22                                 [::]:*   

Redis 相关工具和客户端连接

安装的相关程序介绍

[root@Rocky_100 ~]#ll /apps/redis/bin/
总用量 24904
-rwxr-xr-x 1 redis redis  6551232 9月  27 22:57 redis-benchmark #性能测试程序
lrwxrwxrwx 1 redis redis       12 9月  27 22:57 redis-check-aof -> redis-server	#AOF文件检查程序
lrwxrwxrwx 1 redis redis       12 9月  27 22:57 redis-check-rdb -> redis-server	#RDB文件检查程序
-rwxr-xr-x 1 redis redis  6767608 9月  27 22:57 redis-cli #客户端程序
lrwxrwxrwx 1 redis redis       12 9月  27 22:57 redis-sentinel -> redis-server #哨兵程序,软连接到服务器端主程序
-rwxr-xr-x 1 redis redis 12176976 9月  27 22:57 redis-server #服务端主程序

客户端程序 redis-cli

#默认为本机无密码连接
redis-cli
#远程客户端连接,注意:Redis没有用户的概念
redis-cli -h <Redis服务器IP> -p <PORT> -a <PASSWORD>

程序连接 Redis

https://redis.io/clients

shell 脚本访问 Redis

[root@Rocky_100 ~]#vim redis_test.sh

  1 #!/bin/bash
  2 #
  3 #********************************************************************
  4 #Author:                zhangxuelong
  5 #QQ:                    1024320609
  6 #Date:                  2022-09-28
  7 #FileName:             redis_test.sh
  8 #URL:                   https://www.cnblogs.com/zxl1024320609/
  9 #Description:          For personal learning
 10 #Copyright (C):        2022 All rights reserved
 11 #********************************************************************
 12 NUM=10
 13 PASS=123456
 14 for i in `seq $NUM`;do
 15 redis-cli -h 127.0.0.1 -a "$PASS" --no-auth-warning set key${i} value${i}
 16 echo "key${i} value${i} 写入完成"
 17 done
 18 echo "$NUM个key写入完成" 
 
[root@Rocky_100 ~]#bash redis_test.sh 
OK
key1 value1 写入完成
OK
key2 value2 写入完成
OK
key3 value3 写入完成
OK
key4 value4 写入完成
OK
key5 value5 写入完成
OK
key6 value6 写入完成
OK
key7 value7 写入完成
OK
key8 value8 写入完成
OK
key9 value9 写入完成
OK
key10 value10 写入完成
10个key写入完成

python 程序连接

python 提供了多种开发库,都可以支持连接访问 Redis

https://redis.io/clients

redis-py库的github :

https://github.com/andymccurdy/redis-py

案例

[root@Rocky_100 ~]#yum info python3-redis
上次元数据过期检查:0:36:03 前,执行于 2022年09月28日 星期三 21时27分19秒。
可安装的软件包
名称         : python3-redis
版本         : 3.5.3
发布         : 1.el8
架构         : noarch
大小         : 142 k
源           : python-redis-3.5.3-1.el8.src.rpm
仓库         : epel
概况         : Python 3 interface to the Redis key-value store
URL          : https://github.com/andymccurdy/redis-py
协议         : MIT
描述         : This is a Python 3 interface to the Redis key-value store.

[root@Rocky_100 ~]#yum -y install python3 python3-redis
[root@Rocky_100 ~]#vim redis_python_test.py

!/usr/bin/python3
import redis
pool = redis.ConnectionPool(host="127.0.0.1",port=6379,password="123456",decode_responses=True)                                                             
c = redis.Redis(connection_pool=pool)
for i in range(10):
	c.set("k%d" % i,"v%d" % i)
	data=c.get("k%d" % i)
	print(data)

图形工具

redis-desktop-manager-0.8.8.384.exe

image-20220928233037616

image-20220928233121872

image-20220928233136828

Redis 配置管理

Redis 配置文件说明

bind 0.0.0.0 #指定监听地址,支持用空格隔开的多个监听IP
protected-mode yes #redis3.2之后加入的新特性,在没有设置bind IP和密码的时候,redis只允许访
问127.0.0.1:6379,可以远程连接,但当访问将提示警告信息并拒绝远程访问
port 6379 #监听端口,默认6379/tcp
tcp-backlog 511 #三次握手的时候server端收到client ack确认号之后的队列值,即全连接队列长度
timeout 0 #客户端和Redis服务端的连接超时时间,默认是0,表示永不超时
tcp-keepalive 300 #tcp 会话保持时间300s
daemonize no #默认no,即直接运行redis-server程序时,不作为守护进程运行,而是以前台方式运行,
如果想在后台运行需改成yes,当redis作为守护进程运行的时候,它会写一个 pid 到
/var/run/redis.pid 文件
supervised no #和OS相关参数,可设置通过upstart和systemd管理Redis守护进程,centos7后都使
用systemd
pidfile /var/run/redis_6379.pid #pid文件路径,可以修改
为/apps/redis/run/redis_6379.pid
loglevel notice #日志级别
logfile "/path/redis.log" #日志路径,示例:logfile "/apps/redis/log/redis_6379.log"
databases 16 #设置数据库数量,默认:0-15,共16个库
always-show-logo yes #在启动redis 时是否显示或在日志中记录记录redis的logo
save 900 1 #在900秒内有1个key内容发生更改,就执行快照机制
save 300 10 #在300秒内有10个key内容发生更改,就执行快照机制
save 60 10000 #60秒内如果有10000个key以上的变化,就自动快照备份
stop-writes-on-bgsave-error yes #默认为yes时,可能会因空间满等原因快照无法保存出错时,会禁
止redis写入操作,生产建议为no
#此项只针对配置文件中的自动save有效
rdbcompression yes #持久化到RDB文件时,是否压缩,"yes"为压缩,"no"则反之
rdbchecksum yes #是否对备份文件开启RC64校验,默认是开启
dbfilename dump.rdb #快照文件名
dir ./ #快照文件保存路径,示例:dir "/apps/redis/data"
#主从复制相关
# replicaof <masterip> <masterport> #指定复制的master主机地址和端口,5.0版之前的指令为
slaveof
# masterauth <master-password> #指定复制的master主机的密码
replica-serve-stale-data yes #当从库同主库失去连接或者复制正在进行,从机库有两种运行方式:
1、设置为yes(默认设置),从库会继续响应客户端的读请求,此为建议值
2、设置为no,除去特定命令外的任何请求都会返回一个错误"SYNC with master in progress"。
replica-read-only yes #是否设置从库只读,建议值为yes,否则主库同步从库时可能会覆盖数据,造成
数据丢失
repl-diskless-sync no #是否使用socket方式复制数据(无盘同步),新slave第一次连接master时需
要做数据的全量同步,redis server就要从内存dump出新的RDB文件,然后从master传到slave,有两种
方式把RDB文件传输给客户端:
1、基于硬盘(disk-backed):为no时,master创建一个新进程dump生成RDB磁盘文件,RDB完成之后由
父进程(即主进程)将RDB文件发送给slaves,此为默认值
2、基于socket(diskless):master创建一个新进程直接dump RDB至slave的网络socket,不经过主
进程和硬盘
#推荐使用基于硬盘(为no),是因为RDB文件创建后,可以同时传输给更多的slave,但是基于socket(为
yes), 新slave连接到master之后得逐个同步数据。只有当磁盘I/O较慢且网络较快时,可用
diskless(yes),否则一般建议使用磁盘(no)
repl-diskless-sync-delay 5 #diskless时复制的服务器等待的延迟时间,设置0为关闭,在延迟时间
内到达的客户端,会一起通过diskless方式同步数据,但是一旦复制开始,master节点不会再接收新slave
的复制请求,直到下一次同步开始才再接收新请求。即无法为延迟时间后到达的新副本提供服务,新副本将排
队等待下一次RDB传输,因此服务器会等待一段时间才能让更多副本到达。推荐值:30-60
repl-ping-replica-period 10 #slave根据master指定的时间进行周期性的PING master,用于监测
master状态,默认10s
repl-timeout 60 #复制连接的超时时间,需要大于repl-ping-slave-period,否则会经常报超时
repl-disable-tcp-nodelay no #是否在slave套接字发送SYNC之后禁用 TCP_NODELAY,如果选
择"yes",Redis将合并多个报文为一个大的报文,从而使用更少数量的包向slaves发送数据,但是将使数据
传输到slave上有延迟,Linux内核的默认配置会达到40毫秒,如果 "no" ,数据传输到slave的延迟将会
减少,但要使用更多的带宽
repl-backlog-size 512mb #复制缓冲区内存大小,当slave断开连接一段时间后,该缓冲区会累积复制
副本数据,因此当slave 重新连接时,通常不需要完全重新同步,只需传递在副本中的断开连接后没有同步的
部分数据即可。只有在至少有一个slave连接之后才分配此内存空间,建议建立主从时此值要调大一些或在低峰
期配置,否则会导致同步到slave失败
repl-backlog-ttl 3600 #多长时间内master没有slave连接,就清空backlog缓冲区
replica-priority 100 #当master不可用,哨兵Sentinel会根据slave的优先级选举一个master,此
值最低的slave会优先当选master,而配置成0,永远不会被选举,一般多个slave都设为一样的值,让其自
动选择
#min-replicas-to-write 3 #至少有3个可连接的slave,mater才接受写操作
#min-replicas-max-lag 10 #和上面至少3个slave的ping延迟不能超过10秒,否则master也将停止
写操作
requirepass foobared #设置redis连接密码,之后需要AUTH pass,如果有特殊符号,用" "引起来,生
产建议设置
rename-command #重命名一些高危命令,示例:rename-command FLUSHALL "" 禁用命令
#示例: rename-command del magedu
maxclients 10000 #Redis最大连接客户端
maxmemory <bytes> #redis使用的最大内存,单位为bytes字节,0为不限制,建议设为物理内存一半,
8G内存的计算方式8(G)*1024(MB)1024(KB)*1024(Kbyte),需要注意的是缓冲区是不计算在maxmemory
内,生产中如果不设置此项,可能会导致OOM
#maxmemory-policy noeviction 此为默认值
# MAXMEMORY POLICY:当达到最大内存时,Redis 将如何选择要删除的内容。您可以从以下行为中选择一
种:
#
# volatile-lru -> Evict 使用近似 LRU,只有设置了过期时间的键。
# allkeys-lru -> 使用近似 LRU 驱逐任何键。
# volatile-lfu -> 使用近似 LFU 驱逐,只有设置了过期时间的键。
# allkeys-lfu -> 使用近似 LFU 驱逐任何键。
# volatile-random -> 删除设置了过期时间的随机密钥。
# allkeys-random -> 删除一个随机密钥,任何密钥。
# volatile-ttl -> 删除过期时间最近的key(次TTL)
# noeviction -> 不要驱逐任何东西,只是在写操作时返回一个错误。
#
# LRU 表示最近最少使用
# LFU 表示最不常用
#
# LRU、LFU 和 volatile-ttl 都是使用近似随机算法实现的。
#
# 注意:使用上述任何一种策略,当没有合适的键用于驱逐时,Redis 将在需要更多内存的写操作时返回错
误。这些通常是创建新密钥、添加数据或修改现有密钥的命令。一些示例是:SET、INCR、HSET、LPUSH、
SUNIONSTORE、SORT(由于 STORE 参数)和 EXEC(如果事务包括任何需要内存的命令)。
#MAXMEMORY POLICY:当达到最大内存时,Redis 将如何选择要删除的内容。可以从下面行为中进行选
择:
# volatile-lru -> 在具有过期集的键中使用近似 LRU 驱逐。
# allkeys-lru -> 使用近似 LRU 驱逐任何键。
# volatile-lfu -> 在具有过期集的键中使用近似 LFU 驱逐。
# allkeys-lfu -> 使用近似 LFU 驱逐任何键。
# volatile-random -> 从具有过期设置的密钥中删除一个随机密钥。
# allkeys-random -> 删除一个随机密钥,任何密钥。
# volatile-ttl -> 删除过期时间最近的key(次TTL)
# noeviction -> 不要驱逐任何东西,只是在写操作时返回一个错误。
#
# LRU 表示最近最少使用
# LFU 表示最不常用
#
# LRU、LFU 和 volatile-ttl 均使用近似实现随机算法。
#
# 注意:使用上述任何一种策略,Redis 都会在写入时返回错误操作,当没有合适的键用于驱逐时。
appendonly no #是否开启AOF日志记录,默认redis使用的是rdb方式持久化,这种方式在许多应用中已经
足够用了,但是redis如果中途宕机,会导致可能有几分钟的数据丢失(取决于dump数据的间隔时间),根据
save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性,Redis会
把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入
内存里,先忽略RDB文件。默认不启用此功能
appendfilename "appendonly.aof" #文本文件AOF的文件名,存放在dir指令指定的目录中
appendfsync everysec #aof持久化策略的配置
#no表示由操作系统保证数据同步到磁盘,Linux的默认fsync策略是30秒,最多会丢失30s的数据
#always表示每次写入都执行fsync,以保证数据同步到磁盘,安全性高,性能较差
#everysec表示每秒执行一次fsync,可能会导致丢失这1s数据,此为默认值,也生产建议值
#同时在执行bgrewriteaof操作和主进程写aof文件的操作,两者都会操作磁盘,而bgrewriteaof往往会
涉及大量磁盘操作,这样就会造成主进程在写aof文件的时候出现阻塞的情形,以下参数实现控制
no-appendfsync-on-rewrite no #在aof rewrite期间,是否对aof新记录的append暂缓使用文件同步
策略,主要考虑磁盘IO开支和请求阻塞时间。
#默认为no,表示"不暂缓",新的aof记录仍然会被立即同步到磁盘,是最安全的方式,不会丢失数据,但是要
忍受阻塞的问题
#为yes,相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不
会造成阻塞(因为没有竞争磁盘),但是如果这个时候redis挂掉,就会丢失数据。丢失多少数据呢?Linux
的默认fsync策略是30秒,最多会丢失30s的数据,但由于yes性能较好而且会避免出现阻塞因此比较推荐
#rewrite 即对aof文件进行整理,将空闲空间回收,从而可以减少恢复数据时间
auto-aof-rewrite-percentage 100 #当Aof log增长超过指定百分比例时,重写AOF文件,设置为0表
示不自动重写Aof日志,重写是为了使aof体积保持最小,但是还可以确保保存最完整的数据
auto-aof-rewrite-min-size 64mb #触发aof rewrite的最小文件大小
aof-load-truncated yes #是否加载由于某些原因导致的末尾异常的AOF文件(主进程被kill/断电等),
建议yes
aof-use-rdb-preamble no #redis4.0新增RDB-AOF混合持久化格式,在开启了这个功能之后,AOF重
写产生的文件将同时包含RDB格式的内容和AOF格式的内容,其中RDB格式的内容用于记录已有的数据,而AOF
格式的内容则用于记录最近发生了变化的数据,这样Redis就可以同时兼有RDB持久化和AOF持久化的优点(既
能够快速地生成重写文件,也能够在出现问题时,快速地载入数据),默认为no,即不启用此功能
lua-time-limit 5000 #lua脚本的最大执行时间,单位为毫秒
cluster-enabled yes #是否开启集群模式,默认不开启,即单机模式
cluster-config-file nodes-6379.conf #由node节点自动生成的集群配置文件名称
cluster-node-timeout 15000 #集群中node节点连接超时时间,单位ms,超过此时间,会踢出集群
cluster-replica-validity-factor 10 #单位为次,在执行故障转移的时候可能有些节点和master断
开一段时间导致数据比较旧,这些节点就不适用于选举为master,超过这个时间的就不会被进行故障转移,不
能当选master,计算公式:(node-timeout * replica-validity-factor) + repl-pingreplica-
period
cluster-migration-barrier 1 #集群迁移屏障,一个主节点至少拥有1个正常工作的从节点,即如果主
节点的slave节点故障后会将多余的从节点分配到当前主节点成为其新的从节点。
cluster-require-full-coverage yes #集群请求槽位全部覆盖,如果一个主库宕机且没有备库就会出
现集群槽位不全,那么yes时redis集群槽位验证不全,就不再对外提供服务(对key赋值时,会出现
CLUSTERDOWN The cluster is down的提示,cluster_state:fail,但ping 仍PONG),而no则可以
继续使用,但是会出现查询数据查不到的情况(因为有数据丢失)。生产建议为no
cluster-replica-no-failover no #如果为yes,此选项阻止在主服务器发生故障时尝试对其主服务器进
行故障转移。 但是,主服务器仍然可以执行手动强制故障转移,一般为no
#Slow log 是 Redis 用来记录超过指定执行时间的日志系统,执行时间不包括与客户端交谈,发送回复等
I/O操作,而是实际执行命令所需的时间(在该阶段线程被阻塞并且不能同时为其它请求提供服务),由于
slow log 保存在内存里面,读写速度非常快,因此可放心地使用,不必担心因为开启 slow log 而影响
Redis 的速度
slowlog-log-slower-than 10000 #以微秒为单位的慢日志记录,为负数会禁用慢日志,为0会记录每个
命令操作。默认值为10ms,一般一条命令执行都在微秒级,生产建议设为1ms-10ms之间
slowlog-max-len 128 #最多记录多少条慢日志的保存队列长度,达到此长度后,记录新命令会将最旧的命
令从命令队列中删除,以此滚动删除,即,先进先出,队列固定长度,默认128,值偏小,生产建议设为1000以上

config 命令实现动态修改配置

config 命令用于查看当前redis配置、以及不重启redis服务实现动态更改redis配置等
注意:不是所有配置都可以动态修改,且此方式无法持久保存

CONFIG SET parameter value
时间复杂度:O(1)
CONFIG SET 命令可以动态地调整 Redis 服务器的配置(configuration)而无须重启。
可以使用它修改配置参数,或者改变 Redis 的持久化(Persistence)方式。
CONFIG SET 可以修改的配置参数可以使用命令 CONFIG GET * 来列出,所有被 CONFIG SET 修改的配
置参数都会立即生效。
CONFIG GET parameter
时间复杂度: O(N),其中 N 为命令返回的配置选项数量。
CONFIG GET 命令用于取得运行中的 Redis 服务器的配置参数(configuration parameters),在
Redis 2.4 版本中, 有部分参数没有办法用 CONFIG GET 访问,但是在最新的 Redis 2.6 版本中,所
有配置参数都已经可以用 CONFIG GET 访问了。
CONFIG GET 接受单个参数 parameter 作为搜索关键字,查找所有匹配的配置参数,其中参数和值以“键-
值对”(key-value pairs)的方式排列。
比如执行 CONFIG GET s* 命令,服务器就会返回所有以 s 开头的配置参数及参数的值:

设置客户端连接密码

[root@Rocky_100 ~]#redis-cli 
#设置连接密码
127.0.0.1:6379> CONFIG SET requirepass 123456
OK
#查看连接密码
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "123456"
127.0.0.1:6379> 

获取当前配置

#奇数行为键,偶数行为值
127.0.0.1:6379>  CONFIG GET *
  1) "rdbchecksum"
  2) "yes"
  3) "daemonize"
  4) "no"
  5) "io-threads-do-reads"
  6) "no"
  7) "lua-replicate-commands"
  8) "yes"
  9) "always-show-logo"
 10) "no"
 11) "protected-mode"
......
#查看bind
127.0.0.1:6379> CONFIG GET bind
1) "bind"
2) "0.0.0.0"
#Redis5.0有些设置无法修改,Redis6.2.6版本支持修改bind
127.0.0.1:6379> CONFIG SET bind 127.0.0.1
OK

设置Redis使用的最大内存量

127.0.0.1:6379> CONFIG SET maxmemory 1022500864
OK
127.0.0.1:6379> CONFIG get maxmemory
1) "maxmemory"
2) "1022500864"

慢查询

image-20220928235127197

SLOW LOG案例

[root@centos8 ~]#vim /etc/redis.conf
slowlog-log-slower-than 1 #指定超过1us即为慢的指令,默认值为10000us
slowlog-max-len 1024 #指定只保存最近的1024条慢记录,默认值为128
127.0.0.1:6379> SLOWLOG LEN #查看慢日志的记录条数
(integer) 14
127.0.0.1:6379> SLOWLOG GET [n] #查看慢日志的n条记录
1) 1) (integer) 14
2) (integer) 1544690617
3) (integer) 4 #第3)行表示每条指令的执行时长
4) 1) "slowlog"
127.0.0.1:6379> SLOWLOG GET 3
1) 1) (integer) 7
2) (integer) 1602901545
3) (integer) 26
4) 1) "SLOWLOG"
2) "get"
5) "127.0.0.1:38258"
6) ""
2) 1) (integer) 6
2) (integer) 1602901540
3) (integer) 22
4) 1) "SLOWLOG"
2) "get"
3) "2"
5) "127.0.0.1:38258"
6) ""
3) 1) (integer) 5
2) (integer) 1602901497
3) (integer) 22
4) 1) "SLOWLOG"
2) "GET"
5) "127.0.0.1:38258"
6) ""
127.0.0.1:6379> SLOWLOG RESET #清空慢日志
OK

Redis 持久化

Redis 是基于内存型的NoSQL, 和MySQL是不同的,使用内存进行数据保存

如果想实现数据的持久化,Redis也也可支持将内存数据保存到硬盘文件中
Redis支持两种数据持久化保存方法

  • RDB:Redis DataBase
  • AOF:AppendOnlyFile

image-20220928235616086

RDB

RDB 工作原理

image-20220928235705536

RDB(Redis DataBase):是基于某个时间点的快照,注意RDB只保留当前最新版本的一个快照
RDB 持久化功能所生成的 RDB 文件是一个经过压缩的二进制文件,通过该文件可以还原生成该 RDB 文
件时数据库的状态。因为 RDB 文件是保存在磁盘中的,所以即便 Redis 服务进程甚至服务器宕机,只要
磁盘中 RDB 文件存在,就能将数据恢复

RDB bgsave 实现快照的具体过程:

image-20220928235901451

首先从redis 主进程先fork生成一个新的子进程,此子进程负责将Redis内存数据保存为一个临时文件tmp-
<子进程pid>.rdb,当数据保存完成后,再将此临时文件改名为RDB文件,如果有前一次保存的RDB文件则
会被替换,最后关闭此子进程
由于Redis只保留最后一个版本的RDB文件,如果想实现保存多个版本的数据,需要人为实现

标签:Rocky,redis,Redis,server,100,root
From: https://www.cnblogs.com/zxl1024320609/p/16746732.html

相关文章

  • win10安装redis
    redis安装新手教程win10​ REmoteDIctionaryServer(Redis)是一个由SalvatoreSanfilippo写的key-value存储系统。​ Redis是一个开源的使用ANSIC语言编写、遵守BSD......
  • 【Redis】五大常见的数据类型之 Hash
    前言我们都知道Redis提供了丰富的数据类型,常见的有五种:String(字符串),Hash(哈希),List(列表),Set(集合)、Zset(有序集合)。今天我们就来详细的聊聊Redis这五大常见的数据类型之一​......
  • Redis主从模式的实现
      前面说到了redis在单机的模式下是可以数据持久化的,但是不可以解决单点失败的问题,当单台redis服务器出现问题时,就可能会造成数据的丢失;想要解决这个问题的话我们可以使用......
  • 如何修改redis配置文件(添加密码验证)
    操作步骤:1:找到redis的配置文件,2:停止redis服务,3:修改配置文件,4启动服务1,找到redis的配置文件首先直接试试whereisredis.conf 看能不能返回路径试过2个不同......
  • docker版redis-cluster模式集群-主从扩容
    3主3从节点在上篇:docker版redis-cluster模式集群搭建(3主3从)1、新建6387、6388两个节点dockerrun-d--nameredis-node-7--nethost--privileged=true-v/data/......
  • docker版redis-cluster模式集群搭建(3主3从)
    开放端口:开放Redis服务的两个TCP端口。譬如Redis客户端连接端口为6379,而Redis服务在集群中还有一个叫集群总线端口,其端口为客户端连接端口加上10000,即6379+10000=......
  • docker版redis-cluster模式集群-主从缩容
    接上篇扩容:docker版redis-cluster模式集群-主从扩容下线6387和63881、从集群中将4号从节点6388删除,并检查结果redis-cli--clusterdel-nodeip:从机端口从机......
  • redis面试题
    一、线程1.1、redis是单线程还是多线程Redis6.0版本以前的单线程是指其网络I/O和键值对读写是由一个线程完成的Redis6.0引入的多线程指的是网络请求过程采用了多线程,而......
  • redis
                                                        ......
  • Redis(六)应用问题解决
    第一章缓存穿透1.1问题描述key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会压到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用......