Redis 数据库安装

452 阅读10分钟

[TOC]

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统。

Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。它通常被称为数据结构服务器,因为值(value)可以是字符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

Redis 默认端口

Redis 默认端口为 6379,sentinel.conf 配置器端口为 26379

一、系统环境

二、安装依赖

# yum install gcc gcc-c++ -y

三、安装 Redis

解压
# tar xvf redis-4.0.10.tar.gz
进入 redis 目录
# cd redis-4.0.10
编译
# make PREFIX=/usr/local/redis MALLOC=libc(可以不加,默认是 jemalloc) install
安装
# make install

注意:Redis 并没有自己实现内存池,没有在标准的系统内存分配器上再加上自己的东西。

redis-2.4 以上自带 jemalloc,你不需要加任何参数,通过 zmalloc.c 源码中我们可以看到,Redis 在编译时,会先判断是否使用 tcmalloc,如果是,会用 tcmalloc 对应的函数替换掉标准的 libc 中的函数实现。其次会判断jemalloc 是否使得,最后如果都没有使用才会用标准的 libc 中的内存管理函数。所以用 tcmalloc 优化请谨慎使用,这两着分配器碎片率相差不大,建议用自带 jemalloc。

redis 安装后,在 /usr/local/redis/bin 下有几个以 redis 开头的可执行文件,称为 redis shell,这些可执行文件可以做很多事情。

文件名称 作用
redis-server 启动 redis
redis-cli redis 命令行工具
redis-benchmark 基准测试工具
redis-check-aof AOF 持久化文件检测工具和修复工具
redis-check-rdb RDB 持久化文件检测工具和修复工具
redis-sentinel 启动 redis-sentinel

四、配置 Redis

1、redis 启动方法

  • 第一种方法:

    # redis-server		# 前台启动
    # redis-server &	# 后台启动
    
  • 第二种方法:

    修改 redis.conf 配置文件,从源码目录复制过来修改
    # cp /usr/local/src/redis-4.0.10/redis.conf /usr/local/redis/
    daemonize yes		# 以后台启动 redis
    requirepass redis123	# 设置 redis 登陆密码
    # bind 127.0.0.1		# 注释此行
    protected-mode no		# 设置为 no
    logfile "/usr/local/redis/logs/redis.log"	# 设置日志文件
    dir ./		# 数据目录路径
    
    
    启动服务
    redis-server /usr/local/redis/redis.conf
    

    配置文件详解:

    # 指定 redis 只接收来自于该 IP 地址的请求,如果不进行设置,那么将处理所有请求,在生产环境中最好设置该项,如果只绑定 127.0.0.1 的话,就只有本机可以使用,外部无法访问;实际上,应该 bind 的是 redis所在服务器网卡的 ip。也就是说,如果你的 redis 服务器有两张网卡,一张是 ip-1,另一张是 ip-2,如果你 bind ip-1.那么只有请求 ip-1 的请求会被受理。
    bind 127.0.0.1 172.18.223.15
    # redis 的一种安全机制,在这个机制开启情况下 protected-mode yes,如果你 bind 127.0.0.1 客户端也是连接不上的。
    # 在这个机制关闭情况下 protected-mode no,如果你 bind 127.0.0.1 客户端也是连接不上的,这个 bind 127.0.0.1 限定了 redis 只是监听本地回环的网络请求。
    # 如果是这样的配置 bind 127.0.0.1 192.168.0.5 和 protected-mode no 局域网可以连接;
    # 如果是这样的配置 bind 127.0.0.1 192.168.0.5 和 protected-mode yes 配置, 局域网也可以连接;
    # 综上感觉 protected-mode 参数配置感觉没什么用。所以保留为默认配置 protected-mode yes
    protected-mode yes
    # 监听端口
    port 63790
    # TCP 最大连接数(这里我改为和 linux 内核相同的值了,如果大型应用需要将内核的值修改到 2048 左右以应对更多的连接),默认是 511。
    # 在 高请求/秒 的环境中,为了避免客户端连接问题的缓慢,您需要大量的积压。
    # 请注意,Linux 内核将会悄悄地将其截断为 /proc/sys/net/core/somaxconn 的值,因此要确保提高somaxconn 和 tcpmaxsynbacklog 的值,以获得预期的效果。
    tcp-backlog 128
    # 设置最大客户端连接数
    maxclients 10000
    # 表示客户端空闲多长时间后关闭连接,如指定 0,表示该超时机制关闭。
    timeout 0
    tcp-keepalive 300
    # 说明 redis 进程是后台运行还是前台运行,yes 表示后台运行,no 表示前台运行
    daemonize yes
    # 设置访问 redis 的口令
    requirepass sfm@redis
    supervised no
    pidfile /mydata/redis/6379.pid
    # 指定日志记录级别,指定日志记录级别,Redis 总共支持四个级别:debug、verbose、notice、warning,默认为 notice
    loglevel notice
    logfile "/mydata/redis/logs/redis.log"
    # redis 数据库个数(默认 16 个)
    databases 16
    always-show-logo yes
    # 900秒(15分钟) 内有 1 条数据发生了变化,将数据 dump 到磁盘
    save 900 1
    # 300秒(5分钟) 内有 10 条数据发生了变化,将数据 dump 到磁盘
    save 300 10
    # 69秒(1分钟) 内有 10000 条数据发生了变化,将数据 dump 到磁盘
    save 60 10000
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes
    # 设置 RDB 持久化保存的文件名
    dbfilename 6379.rdb
    # 设置 RDB 持久化保存的路径
    dir /mydata/redis/
    slave-serve-stale-data yes
    slave-read-only yes
    repl-diskless-sync no
    repl-diskless-sync-delay 5
    repl-disable-tcp-nodelay no
    slave-priority 100
    maxmemory-policy allkeys-lru
    lazyfree-lazy-eviction no
    lazyfree-lazy-expire no
    lazyfree-lazy-server-del no
    slave-lazy-flush no
    # 启用 Append Only Mode 持久化文件
    appendonly yes
    # 设置 AOF 持久化文件名
    appendfilename "6379.aof"
    # fsync 持久化策略
    appendfsync everysec
    # AOF 重写期间是否禁止 fsync;如果开启该选项,可以减轻文件重写时 CPU 和硬盘的负载(尤其是硬盘),但是可能会丢失 AOF 重写期间的数据;需要在负载和安全性之间进行平衡
    no-appendfsync-on-rewrite no
    # AOF 文件重写触发条件之一
    auto-aof-rewrite-percentage 100
    # AOF 文件重写触发条件之一
    auto-aof-rewrite-min-size 64mb
    # 如果 AOF 文件结尾损坏,Redis 启动时是否仍载入 AOF 文件
    aof-load-truncated yes
    aof-use-rdb-preamble no
    lua-time-limit 5000
    slowlog-log-slower-than 10000
    slowlog-max-len 128
    latency-monitor-threshold 0
    notify-keyspace-events ""
    hash-max-ziplist-entries 512
    hash-max-ziplist-value 64
    list-max-ziplist-size -2
    list-compress-depth 0
    set-max-intset-entries 512
    zset-max-ziplist-entries 128
    zset-max-ziplist-value 64
    hll-sparse-max-bytes 3000
    activerehashing yes
    client-output-buffer-limit normal 0 0 0
    client-output-buffer-limit slave 256mb 64mb 60
    client-output-buffer-limit pubsub 32mb 8mb 60
    hz 10
    aof-rewrite-incremental-fsync yes
    
  • 以 systemd 的方法来管理 redis 服务

    新建 redis 用户,不要以 root 用户启动 redis

    # useradd -M -s /sbin/nologin redis
    

    在 /usr/lib/systemd/system/ 目录下新建 redis.service 文件,文件内容如下:

    [Unit]
    Description=Redis-4.0.10
    # Documentation=man:mysqld(8)
    # Documentation=http://dev.mysql.com/doc/refman/en/using-systemd.html
    After=network.target
    After=syslog.target
    
    [Install]
    WantedBy=multi-user.target
    
    [Service]
    User=redis
    Group=redis
    Type=forking
    Restart=always
    ExecStart=/usr/local/redis-4.0.10/bin/redis-server /usr/local/redis-4.0.10/redis.conf
    ExecStop=/usr/local/redis-4.0.10/bin/redis-cli -h 127.0.0.1 -p 6379 -a redis123 shutdown
    LimitNOFILE=65535
    

    这样就可以使用 systemctl start | stop | status | restart redis.service 命令来管理 redis 服务了

    注意:redis 使用的 data 目录及 logs 目录需要给 redis 权限

2、持久化设置

redis 的默认持久化策略是快照的方式

  • RDB 持久化配置

    Redis 会将数据集的快照 dump 到 dump.rdb 文件中。此外,我们也可以通过配置文件来修改 Redis 服务器 dump 快照的频率,在打开 redis.conf 文件之后,我们搜索 save,可以看到下面的配置信息:

    save 900 1		# 在 900 秒(15分钟)之后,如果至少有 1 个 key 发生变化,则 dump 内存快照。
    save 300 10		# 在 300 秒(5分钟)之后,如果至少有 10 个 key 发生变化,则 dump 内存快照。
    save 60 10000	# 在 60 秒(1分钟)之后,如果至少有 10000 个 key 发生变化,则 dump 内存快照。
    

    默认 RDB 方式保存的是dump.rdb 文件,恢复也是识别的是dump.rdb

    保存目录也在配置文件中可配置,默认当前位置

    # Note that you must specify a directory here, not a file name.
    dir ./		# 默认 dump.rdb 文件保存位置
    
  • AOF 方式持久化配置

    如果把

    appendonly no 修改为
    appendonly yes	
    

    则表示启用 AOF 方式持久化(这种机制安全,保存的数据最为健全,但要牺牲部分性能)

    配置生成的 aof 文件名

    appendfilename "appendonly.aof"
    
    appendfsync everysec | always | no
    # no 表示不执行 fsync,由操作系统保证数据同步到磁盘,速度最快。
    # always 表示每次写入都执行 fsync,以保证数据同步到磁盘。
    # everysec 表示每秒执行一次 fsync,可能会导致丢失这 1 秒的数据。
    
    appendfsync no
    

五、管理

1、交互方式

可以使用两种方式连接 redis 服务器。

  • 第一种:交互式方式

    # redis-cli -h {host} -p {port}      ## 以这种方式连接,然后所有的操作都是在交互的方式实现,不需要再执行 redis-cli 了。
    
  • 第二种:命令方式

    # redis-cli -h {host} -p {port} {command}   ## 直接得到命令的返回结果。
    

    命令方式常用参数:

    参数 作用 用例
    -r 代表将命令重复执行多次 $ redis-cli -r 3 ping # ping 命令可用于检测 redis 实例是否存活,如果存活则显示 PONG
    -i 每隔几秒(如果想用 ms,如 10ms 则写成 0.01)执行一次命令,必须与 -r 一起使用 $ redis-cli -r 10 -i 1 info | grep used_memory_human # 每隔 1 秒输出内存的使用量,一共输出 10 次。
    -x 代表从标准输入读取数据作为该命令的最后一个参数。 $ echo "world" |redis-cli -x set hello
    -c 连接集群结点时使用,此选项可防止 moved 和 ask 异常。
    -a 如配置了密码,可用 a 选项。 $ redis-cli -a 123456 -r 10 -i 1 info | grep used_memory_human
    --rdb 会请求 redis 实例生成并发送 RDB 持久化文件,保存在本地。可做定期备份。

2、常用命令

1、查看服务器的信息和统计:info
2. 删除所有数据库内容:flushall
3. 刷新数据库:flushdb
4. 看所有键:KEYS *,使用 select num 可以查看键值数据。
5. 设置变量:set test "who am i"
6. config set dir dirpath 设置路径等配置
7. config get dir/dbfilename 获取路径及数据库配置信息
8. save 保存
9. get 变量,查看变量名称
10. time:返回当前服务器时间
11. client list: 返回所有连接到服务器的客户端信息和统计数据  参见http://redisdoc.com/server/client_list.html
12. client kill ip:port:关闭地址为 ip:port 的客户端
13. save:将数据同步保存到磁盘
14. bgsave:将数据异步保存到磁盘
15. lastsave:返回上次成功将数据保存到磁盘的Unix时戳
16. shundown:将数据同步保存到磁盘,然后关闭服务
17. config resetstat:重置info命令中的某些统计数据
18. config get:获取配置文件信息
19. config set:动态地调整 Redis 服务器的配置(configuration)而无须重启,可以修改的配置参数可以使用命令 CONFIG GET * 来列出
20. config rewrite:Redis 服务器时所指定的 redis.conf 文件进行改写
21. monitor:实时转储收到的请求   
22. slaveof:改变复制策略设置

Redis 主从复制配置

1、master 的 redis 配置文件只需要设置好 bind、requirepass 等即可

2、slave 的 redis 配置文件中添加以下行:

slaveof x.x.x.x 6379    # Master 的 IP 地址及端口号
masterauth redis123     # 如果 Master 上设置有密码的话,这里需要设置跟 Master 上一样的密码
或者动态修改设置:
通过 redis-cli 连接到从节点服务器,执行下面命令即可。
slaveof x.x.x.x 6379