单节点安装搭建
- 下载redis安装包
- 确认环境安装gcc没有,没有的话执行如下
gcc --version
yum -y install gcc
yum -y install gcc-c++
- 解压redis安装包,进入解压后的文件夹,执行
make && make test && make install
- 可能会有如下报错
- 遇到的错误1解决方法:make MALLOC=libc
cd src && make all
make[1]: 进入目录“/usr/local/redis/redis-5.0.8/src”
CC Makefile.dep
make[1]: 离开目录“/usr/local/redis/redis-5.0.8/src”
make[1]: 进入目录“/usr/local/redis/redis-5.0.8/src”
CC adlist.o
In file included from adlist.c:34:0:
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
#include <jemalloc/jemalloc.h>
^
编译中断。
make[1]: *** [adlist.o] 错误 1
make[1]: 离开目录“/usr/local/redis/redis-5.0.8/src”
make: *** [all] 错误 2
- 遇到的错误2解决方法:yum install -y tcl
make[1]: 离开目录“/usr/local/redis/redis-5.0.8/src”
cd src && make test
make[1]: 进入目录“/usr/local/redis/redis-5.0.8/src”
You need tcl 8.5 or newer in order to run the Redis test
make[1]: *** [test] 错误 1
make[1]: 离开目录“/usr/local/redis/redis-5.0.8/src”
make: *** [test] 错误 2
- 备份并修改redis.conf配置文件
[root@zhh-node10 ~]# vi /usr/local/redis/redis-5.0.8/redis.conf
[root@zhh-node10 ~]# cd /usr/local/redis/redis-5.0.8
[root@zhh-node10 redis-5.0.8]# cp redis.conf redis.conf.bak
[root@zhh-node10 redis-5.0.8]# ls -l
总用量 340
-rw-rw-r--. 1 root root 118338 3月 12 23:07 00-RELEASENOTES
-rw-rw-r--. 1 root root 53 3月 12 23:07 BUGS
-rw-rw-r--. 1 root root 2381 3月 12 23:07 CONTRIBUTING
-rw-rw-r--. 1 root root 1487 3月 12 23:07 COPYING
drwxrwxr-x. 6 root root 192 3月 24 17:56 deps
-rw-rw-r--. 1 root root 11 3月 12 23:07 INSTALL
-rw-rw-r--. 1 root root 151 3月 12 23:07 Makefile
-rw-rw-r--. 1 root root 6888 3月 12 23:07 MANIFESTO
-rw-rw-r--. 1 root root 20555 3月 12 23:07 README.md
-rw-rw-r--. 1 root root 61797 3月 12 23:07 redis.conf
-rw-r--r--. 1 root root 61797 3月 28 11:28 redis.conf.bak
-rwxrwxr-x. 1 root root 275 3月 12 23:07 runtest
-rwxrwxr-x. 1 root root 280 3月 12 23:07 runtest-cluster
-rwxrwxr-x. 1 root root 373 3月 12 23:07 runtest-moduleapi
-rwxrwxr-x. 1 root root 281 3月 12 23:07 runtest-sentinel
-rw-rw-r--. 1 root root 9710 3月 12 23:07 sentinel.conf
drwxrwxr-x. 3 root root 8192 3月 24 17:56 src
drwxrwxr-x. 11 root root 182 3月 12 23:07 tests
drwxrwxr-x. 8 root root 4096 3月 12 23:07 utils
[root@zhh-node10 redis-5.0.8]# vi redis.conf
修改配置项
bind 0.0.0.0 -指定 redis 只接收来自于该IP地址的请求,如果不进行设置,那么将处理所有请求
port 6379 -redis服务端口号,默认6379
daemonize yes -是否后台启动,默认为no
pidfile /var/run/redis_6379.pid -服务进程文件位置
logfile /usr/local/redis/logs/redis_6379.log -日志文件所在位置
dir /usr/local/redis/data -RDB文件存储位置
dbfilename redis_6379.rdb -RDB文件的名称
- 启动redis服务
redis-server redis.conf
- 客户端连接
语法:redis-cli -h host -p port -a password
#本地连接
redis-cli
#远程连接(关闭redis服务器防火墙或开放6379端口)
[root@zhh-node10 ~]# redis-cli -h 192.168.56.10 -p 6379 -a ""
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
192.168.56.10:6379> set user:name zhanghh
OK
192.168.56.10:6379> del user:name
(integer) 1
192.168.56.10:6379> quit
redis服务运行:redis-cli shutdown关闭redis服务
- 实际生产如何启动redis
# 复制脚本到/etc/init.d目录,并重命名为redis_6379
# 保持redis_6379脚本里面的端口号和配置文件的端口号一致
[root@zhh-node10 ~]# cp /usr/local/redis/redis-5.0.8/utils/redis_init_script /etc/init.d/
[root@zhh-node10 ~]# mv /etc/init.d/redis_init_script /etc/init.d/redis_6379
# 创建目录/etc/redis,并复制配置文件到这个目录里面,并重命名为6379.conf
[root@zhh-node10 ~]# mkdir /etc/redis
[root@zhh-node10 ~]# cp /usr/local/redis/redis-5.0.8/redis.conf /etc/redis/
[root@zhh-node10 ~]# mv /etc/redis/redis.conf /etc/redis/6379.conf
# 执行脚本启动redis服务
[root@zhh-node10 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@zhh-node10 ~]# ps -ef|grep redis
root 5567 1 0 13:41 ? 00:00:00 /usr/local/bin/redis-server 0.0.0.0:6379
root 5572 5254 0 13:41 pts/3 00:00:00 grep --color=auto redis
# 添加到开机启动服务
[root@zhh-node10 init.d]# chkconfig --add redis_6379
[root@zhh-node10 init.d]# chkconfig redis_6379 on
持久化方案:RDB和AOF
持久化的意义在于故障恢复,redis是内存数据库,无法应对灾难性故障,比如机房停电、redis服务器挂掉等,持久化可以快速重建redis内存数据。将内存数据写到磁盘文件中,对磁盘文件进行备份到亚马逊S3或国内的云厂商上。
介绍
RDB对redis内存数据进行周期性的持久化,保存某一时刻redis的完整数据快照。
AOF对每条写入命令作为日志,以append-only的方式写入到日志文件中,重启redis时,通过回放AOF日志的写入指令来重新构建数据。命令写入到操作系统缓存,间隔调用操作系统的fsync操作,写入到AOF日志文件。
RDB优缺点
优点:
- 生成多个数据文件,每个文件代表某个时刻redis的数据,非常适合做冷备份,以预定好的备份策略将数据文件备份到云上。
- 对redis对外提供的读写性能影响小,可以让redis保持高性能,因为redis只要主进程fork一个子进程来进行IO即可
- 相对于AOF,RDB文件进行重启和恢复redis服务更快
缺点:
- 相对于AOF来说,出现故障时会丢失更多的数据
- RDB每次fork子进程生成RDB文件时,如果数据文件特别大,会影响redis服务对外提供停数毫秒或数秒
AOF优缺点
优点:
- AOF可以更好保证数据不会丢失,一般会1秒执行一次fsync,如果丢,也只丢1秒的数据
- 以只追加方式写入,没有寻址开销,写入性能高,且文件不易破损,即使文件尾部破损,也有工具可以恢复
- 日志文件过大,会自动进行rewrite操作
- AOF的日志通过非常可读的方式进行记录,非常适合做误删除操作的紧急恢复
缺点:
- 对于同一份数据来说,AOF文件比RDB大很多
- AOF开启后,redis的QPS会比RDB低,但是性能还是很高
- AOF恢复容易有bug,以前出现恢复没有恢复出一模一样的数据出来,相对一份完整数据快照,AOF容易有bug
持久化配置
RDB配置
修改/etc/redis/6379.conf配置
save 60 1000 # 表示60s内有1000个key发生变化,执行一次rdb快照保存
手工保存rdb快照
save命令或bgsave命令,通常用bgsave异步保存,save为同步保存,会阻塞所有客户端
RDB工作流程
- redis会根据配置尝试生成rdb数据文件
- fork一个子进程出来,将数据dump到一个临时的rdb数据文件
- 完成快照文件生成后,就替换掉原来的快照文件
RDB备份试验
- 在redis中保存几个key,然后kill -9掉redis进程,重启redis看这几个key还在不在。---- 保存的key会丢失,只能kill进程,如果stop的话,redis stop前会生成一下快照文件
- 修改配置文件save 5 1,启动redis后,设置几个key,等5秒后一样kill掉进程,再重启redis。
AOF配置
AOF相关配置项
appendonly yes - 是否打开AOF,默认为no
appendfilename "appendonly.aof" - aof日志文件名称
# aof记录写日志策略
# appendfsync always - 写一条数据,记录一条日志,性能差,可能就千级QPS
appendfsync everysec - 每秒把os cache的日志fsync到日志文件,性能很好
# appendfsync no - 不控制,由操作系统自己决定
no-appendfsync-on-rewrite no - 控制bgrewrite aof日志文件和主进程写aof同时发生时,采取的策略,no表示不会丢失数据,但是要忍受阻塞的问题,yes表示相当于将appendfsync设置为no,这说明并没有执行磁盘操作,只是写入了缓冲区,因此这样并不会造成阻塞(因为没有竞争磁盘),可能会造成数据30秒的丢失
auto-aof-rewrite-percentage 100 - 比上一次aof日志文件大小大100%时,rewrite
auto-aof-rewrite-min-size 64mb - aof文件的大小至少要64m才会rewrite
# 比如上次16M,现在写入到32M了,超过100%,但是还没64M,不会rewrite
# 比如上次32M,现在写入到64M了,超过100%,且大于等于64M,会rewrite
AOF工作流程
- 写命令到达redis时,会写入到os cache,根据策略刷新到aof日志文件
- 如果发生rewrite时,会fork一个子进程,将redis内存数据构建成日志写入临时文件
- redis主进程接收到新的写操作时,会将写操作日志写入到内存中和旧的aof文件
- 等子进程写完新的AOF日志文件,主进程会将内存中的日志追加写入到新的AOF日志
- 用新的替换掉旧的
AOF文件破损修复
redis-check-aof --fix aof文件
AOF和RDB如果同时工作
- 生成RBD快照数据和AOF日志文件rewrite不会同时进行
- 如果在生成RDB快照数据的同时,手工bgrewrite AOF日志文件,会等到快照文件生成后再执行
- redis重启时,优先用AOF恢复内存数据
ps:观看龙果学院中华石杉视频整理的笔记
Redis客户端API
对于Java客户端,官方推荐十几种客户端,其中标星的主要有三种:Jedis、Lettuce、Redisson(比较参考资料)。
- Jedis:是Redis的Java实现客户端,提供了比较全面的Redis命令的支持
- Redisson:实现了分布式和可扩展的Java数据结构
- Lettuce:高级Redis客户端,用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器
版权声明:本文为weixin_42486134原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。