这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
Redis是什么
随着数据量的增加和业务量的增大,MySQL从单机演进到了集群,面对电商类服务时,当有秒杀活动时,无法支持大量的数据读取操作,我们想用一个类似于缓存的思想将热数据缓存到内存里,如果缓存没有再去数据库寻找。这就是Redis的用途,构建一个数据缓存区,减轻MySQL数据库的压力。
Redis的基本工作原理
-
数据从内存中读写
-
数据保存到硬盘上防止重启数据丢失
储存在内存中的数据会由于服务器的关机而消失,我们如何将数据持久化防止数据丢失时Redis需要解决的问题:
- 增量数据保存到AOF文件
appendonly(RESP协议) - 全量数据保存到RDB文件
dump.RDB
- 增量数据保存到AOF文件
-
单线程处理所有操作命令
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
}
-
连续签到
掘金每日连续签到,用户每日有一次签到的机会,如果断签,连续签到计数将归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) -
消息通知
采用
list作为消息队列,进行消息通知。当文章更新时,将更新后的文章推送到ES,用户就能搜索到最新的文章数据。lpush ————————————————————————————— rpop 文章 ----->|文章10----->文章12----->文章13|-----> 文章14----->获取信息----->推送 —————————————————————————————运行
go run main.go Ex04后,在Redis里面往ex04_list_0里面推入文章,结果会显示在服务器端 -
计数
-
排行榜
-
限流
-
分布式锁