这是我参与「第五届青训营 」笔记创作活动的第11天
Redis基本工作原理
redis启动时首先加载 dump.Rdb文件,加载完成后随后加载 appendonly,对比appendonly是不是还有数据没有被执行。
set uuu =l
增量数据保存到AOF文件。
样例,set lll 4324,
全量数据RDB文件
红框内即为RESP协议
单线程处理执行命令
2.3.1 熟悉以下命令的操作 GET/SET/DEL/INCR/SETNX HSET/HGET/HINCRBY LPUSH/RPOP/LRANGE ZADD/ZRANGEBYSCORE/ZREVRANGE/ZINCRBY/ZSCORE
案例
连续签到
用户每一天在掘金上点击立即签到,签到完成后,天数+1,如果断签,签到天数归零,每个自然日0:00:00-23:59:59必须有签到
// addContinuesDays 为用户签到续期
func addContinuesDays(ctx context.Context, userID int64) {
key := fmt.Sprintf(continuesCheckKey, userID)
// 1. 连续签到数+1
err := RedisClient.Incr(ctx, key).Err()
if err != nil {
fmt.Errorf("用户[%d]连续签到失败", userID)
} else {
expAt := beginningOfDay().Add(48 * time.Hour)
// 2. 设置签到记录在后天的0点到期
if err := RedisClient.ExpireAt(ctx, key, expAt).Err(); err != nil {
panic(err)
} else {
// 3. 打印用户续签后的连续签到天数
day, err := getUserCheckInDays(ctx, userID)
if err != nil {
panic(err)
}
fmt.Printf("用户[%d]连续签到:%d(天), 过期时间:%s", userID, day, expAt.Format("2006-01-02 15:04:05"))
}
}
}
对key设置过期,如果一个key过期后.
文章推送
String的数据结构
二进制安全:实际存储的是二进制数据,能够节约空间而且能够尽快把数据读取出来。
// ex04ConsumerPop 使用rpop逐条消费队列中的信息,数据从队列中移除
// 生成端使用:lpush ex04_list_0 AA BB
func ex04ConsumerPop(ctx context.Context, cInstParam common.CInstParams) {
routine := cInstParam.Routine
for {
items, err := RedisClient.BRPop(ctx, 0, ex04ListenList).Result()
if err != nil {
panic(err)
}
fmt.Println(common.LogFormat(routine, "读取文章[%s]标题、正文,发送到ES更新索引", items[1]))
// 将文章内容推送到ES
time.Sleep(1 * time.Second)
}
}