Redis - 大厂程序员是怎么用的| 青训营笔记

57 阅读2分钟

这是我参与「第五届青训营 」笔记创作活动的第11天

Redis基本工作原理

redis启动时首先加载 dump.Rdb文件,加载完成后随后加载 appendonly,对比appendonly是不是还有数据没有被执行。 set uuu =l image.png 增量数据保存到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"))
      }
   }
}

image.png 对key设置过期,如果一个key过期后.

文章推送

String的数据结构

image.png 二进制安全:实际存储的是二进制数据,能够节约空间而且能够尽快把数据读取出来。

// 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)
   }
}

掘金连续签到,需要了解GET/SET,Key过期

掘金用户计数,使用到HASH

排行榜ZSET

使用SETNX实现分布式锁