redis安装和使用

安装

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. 初始时间,设置策略"1 2"
redis-cli config set save "1 2"

初始修改时间:

$ stat -f "%Sm" dump.rdb 
Sep 16 16:32:54 2021
  1. 写入一个key:
set a 10

查看修改时间, 未变,此时时间虽然超过1s,但是变化的key的数量不足以触发备份。

$ stat -f "%Sm" dump.rdb 
Sep 16 16:32:54 2021
  1. 再写入一个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发生了变化怎么办?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值