[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