这是我参与「第五届青训营 」伴学笔记创作活动的第 16 天
视频去重
学习
采取以下方法来避免播放重复视频:
-
实现视频去重逻辑:当用户浏览视频时,应用程序可以记录用户已经播放的视频ID,下次浏览时,可以过滤掉已经播放过的视频。这可以使用缓存技术来实现,将已经播放过的视频ID存储在本地缓存中,每次播放新视频时,先检查该视频ID是否存在于缓存中,如果已经存在,则跳过该视频。
-
使用推荐算法:通过使用推荐算法,应用程序可以向用户推荐与他们喜欢的视频相关的新视频,从而增加他们观看新视频的机会。推荐算法可以基于用户喜好、观看历史、标签等多种因素进行推荐,从而提高用户体验。
-
增加视频来源:应用程序可以集成多个视频来源,如不同的用户上传的视频、官方发布的视频、热门视频等,这可以让用户有更多的视频选择,减少看到重复视频的机会。
-
增加视频过滤机制:应用程序可以设置视频过滤机制,例如,过滤掉过于相似的视频、过短或过长的视频、低质量的视频等,从而提高用户观看体验。
-
优化应用程序性能:优化应用程序性能可以使视频播放更加流畅,降低视频加载时间,从而减少用户看到重复视频的机会。可以采用异步加载、图片压缩、网络优化等技术来优化应用程序性能。
缓存数据一致性
juejin.cn/post/715267… 在有数据变更的地方,同时更新缓存和数据库。 对于读多写少的情况,采用事务(高隔离级别)+先更新数据库再更新缓存 对于并发要求高的且一致性要求高,选择“先更新数据库再删除缓存,并结合删除重试 + 补偿逻辑 + 缓存过期TTL等综合手段”
代码
对于读多写少的情况的代码实现:
func updateDBAndCache(db *sql.DB, cache *redis.Client, data []byte) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer tx.Rollback()
// 更新数据库
stmt, err := tx.Prepare("UPDATE table SET data = ? WHERE id = ?")
if err != nil {
return err
}
defer stmt.Close()
if _, err := stmt.Exec(data, 1); err != nil {
return err
}
if err := tx.Commit(); err != nil {
return err
}
// 更新缓存
err = cache.Set("cache_key", data, 0).Err()
if err != nil {
return err
}
return nil
}
对于并发要求高的且一致性要求高的代码实现:
func updateDBAndDeleteCache(db *sql.DB, cache *redis.Client, data []byte) error {
tx, err := db.Begin()
if err != nil {
return err
}
defer tx.Rollback()
// 更新数据库
stmt, err := tx.Prepare("UPDATE table SET data = ? WHERE id = ?")
if err != nil {
return err
}
defer stmt.Close()
if _, err := stmt.Exec(data, 1); err != nil {
return err
}
if err := tx.Commit(); err != nil {
return err
}
// 删除缓存
err = cache.Del("cache_key").Err()
if err != nil {
return err
}
// 重试 + 补偿逻辑
for i := 0; i < 3; i++ {
_, err = cache.Get("cache_key").Result()
if err == redis.Nil {
break
}
// 进行补偿逻辑,比如重新更新数据库等
// ...
}
return nil
}
docker部署go项目
Dockerfile
# 基础镜像
FROM alpine:3.12
# 维护者
MAINTAINER frank
# docker build 时执行命令 - 创建目录
RUN mkdir -p "/data/app" \
&& ln -sf /dev/stdout /data/app/service.log
# 工作目录
WORKDIR "/data/app"
# 拷贝
COPY hello /data/app/hello
# docker run 时执行命令
ENTRYPOINT ["./hello"]
docker build -t hello:v1.0.0 .
docker images
docker run -d -p 9090:8080 hello:v1.0.0
雪花算法
原理
雪花算法(Snowflake Algorithm)是一种分布式ID生成算法,用于生成全局唯一的ID,它是由Twitter公司的工程师开发的。
它生成的ID是一个64位的整数,其中包含以下部分:
- 第1个41位为毫秒级时间戳,代表当前ID生成的时间;
- 第2个10位为工作节点ID,用于区分不同的服务节点;
- 第3个12位为毫秒内的计数序列,用于在同一时刻内生成多个ID。
使用这样的ID可以确保生成的ID全局唯一,并且时间戳可以直接使用,避免了数据库索引等其他复杂的问题。
总的来说,雪花算法提供了一种可靠且简单的方法来生成全局唯一的ID,在分布式系统中广泛使用。