Redis课堂笔记 | 青训营笔记

65 阅读2分钟

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

Redis是什么

随着数据量的增加和业务量的增大,MySQL从单机演进到了集群,面对电商类服务时,当有秒杀活动时,无法支持大量的数据读取操作,我们想用一个类似于缓存的思想将热数据缓存到内存里,如果缓存没有再去数据库寻找。这就是Redis的用途,构建一个数据缓存区,减轻MySQL数据库的压力。

Redis的基本工作原理

  • 数据从内存中读写

  • 数据保存到硬盘上防止重启数据丢失

    储存在内存中的数据会由于服务器的关机而消失,我们如何将数据持久化防止数据丢失时Redis需要解决的问题:

    • 增量数据保存到AOF文件appendonly(RESP协议)
    • 全量数据保存到RDB文件dump.RDB
  • 单线程处理所有操作命令

Redis应用案例

首先初始化一个redis客户端,用全局变量RedisClient表示,这里要注意定义变量时首字母必须要大写,因为Go语言通过首字母的大小写来控制访问权限。 无论是方法,变量,常量或是自定义的变量类型,如果首字母大写,则可以被外部包访问,反之则不可以。

 package example
 import (
     "github.com/go-redis/redis/v9"
 )
 var RedisClient *redis.Client
 ​
 func init() {
     rdb := redis.NewClient(&redis.Options{
         Addr: "0.0.0.0:6379",
     })
     RedisClient = rdb
 }
 ​
  1. 连续签到

    掘金每日连续签到,用户每日有一次签到的机会,如果断签,连续签到计数将归0。

     key: uid
     value: 签到计数
     expireTime: 过期时间,后天的0点
    

    输出签到的用户号,采用自增函数Incr给用户号对应的key即cc_uid_userId加1,并更新失效时间,主要代码如下:

     // 连续签到+1
     err := RedisClient.Incr(ctx, key).Err()
     // 更新过期时间为后天
     expAt := beginningOfDay().Add(48 * time.Hour)
     // 获取连续签到的天数:获取value并转换为int64类型
     days, err := RedisClient.Get(ctx, key).Result()
     daysInt, err := strconv.ParseInt(days, 10, 64)
    
  2. 消息通知

    采用list作为消息队列,进行消息通知。当文章更新时,将更新后的文章推送到ES,用户就能搜索到最新的文章数据。

         lpush  ————————————————————————————— rpop
     文章 ----->|文章10----->文章12----->文章13|-----> 文章14----->获取信息----->推送
                —————————————————————————————
    

    运行go run main.go Ex04后,在Redis里面往ex04_list_0里面推入文章,结果会显示在服务器端

  3. 计数

  4. 排行榜

  5. 限流

  6. 分布式锁