安装
https://redis.io/download下载redis源码,然后进行安装:
wget https://download.redis.io/releases/redis-6.0.9.tar.gz
tar xzf redis-6.0.9.tar.gz
cd redis-6.0.9
make distclean # 可选,如果更新了源代码则需要执行
make
构建会在src
目录下生成redis-cli
,redis-server
等可执行文件。
基于https://github.com/redis/redis构建:
git clone https://github.com/redis/redis
cd redis
git fetch --all
git checkout 6.2.4 # 选择一个版本
git checkout dev-6.2.4 # 如果本地要修改源代码,则开一个分支
make distclean # 可选,如果更新了源代码则需要执行
make
配置和启动
redis
使用redis.conf
作为配置文件,参考https://redis.io/topics/config
下面给出一个简单的配置:
bind 0.0.0.0
port 6379
# 如果没有配置密码和bind,当protected-mode yes时,只接受127.0.0.1的连接
protected-mode no
# 客户端链接空闲多久可以主动断开链接
timeout 0
# 是否开启后台模式,测试时设置:no
daemonize no
# 当daemonize yes时,pid文件
pidfile /var/run/redis_6379.pid
启动:
./redis redis.conf
./src/redis-server redis.conf # 源代码构建的二进制位于src/redis-server
客户端:
./src/redis-cli #
127.0.0.1:6379>
cmdline
$ echo -ne 'PING\r\n'|nc localhost 6379
+PONG
nodejs client
https://github.com/NodeRedis/node-redis
npm install redis
const redis = require("redis");
const client = redis.createClient({host:"127.0.0.1", port:6379});
client.on("error", function(error) {
console.error(error);
});
client.set("key", "value", redis.print);
client.get("key", redis.print);
// promisify
const { promisify } = require("util");
const getAsync = promisify(client.get).bind(client);
// ...
RDB文件测试
redis配置:
save 60 1000
或者
redis-cli config set save "60 1000" # 注意60 1000必须包含在引号内
含义:每60s备份一次,如果有1000个key发生了变化;要求:时间和key变化数量都要满足。
另外,可以通过SAVE
, BGSAVE
手动触发RDB文件备份。
简单测试:
- 初始时间,设置策略"1 2"
redis-cli config set save "1 2"
初始修改时间:
$ stat -f "%Sm" dump.rdb
Sep 16 16:32:54 2021
- 写入一个key:
set a 10
查看修改时间, 未变,此时时间虽然超过1s,但是变化的key的数量不足以触发备份。
$ stat -f "%Sm" dump.rdb
Sep 16 16:32:54 2021
- 再写入一个key:
set b 20
查看修改时间, 发生了变化,证明save "1 2"
的策略生效
$ stat -f "%Sm" dump.rdb
Sep 16 16:34:49 2021
也就是要两个条件都满足,对于策略SAVE T N
: 1.自上次备份的时间大于等T 2.自上至备份的变化key数量大于等于N
所以,SAVE的机制表明备份最小间隔时间,而不是最大间隔时间。
AOF文件测试
关闭RDB,启用AOF
通过redis配置关闭RDB,开启AOF:
# redis.conf
appendonly yes
save ""
或者通过redis-cli动态关闭:
redis-cli config set appendonly yes
redis-cli config set save ""
配置fsync策略
配置每秒fsync一次:
appendfsync everysec
测试命令
每次set或incr等修改命令之后,等待1s都可以看到appendonly.aof
文件内容更新:
命令:
set a 10000
incrby a 20
incrby a 900
AOF文件内容:
*2 // SELECT 0
$6
SELECT
$1
0
*3
$3
set // set a 10000
$1
a
$5
10000
*3
$6
incrby // incrby a 20
$1
a
$2
20
*3
$6
incrby // incrby a 900
$1
a
$3
900
最终a的值是10920.
手动触发AOF重写
BGREWRITEAOF
重写后的AOF文件内容:
我们可以看到,重写后的AOF文件,与RDB文件完全一致,没有可读的命令,而是将内存中的所有key都dump到AOF文件的aof-preamble部分。
RDB和AOF差异:
可以看到,RDB实际上使用了aof-preamble的字样,所以它们的内容都是一样的。可能唯一的区别来自于文件尾部,用于区分RDB文件或AOF文件。
问题: AOF重写时,如果key发生了变化怎么办?