feat:为ListByFollowing方法添加上redis缓存

This commit is contained in:
Leon
2025-12-24 13:04:38 +08:00
parent f0411b4577
commit 94140c3c13
4 changed files with 41 additions and 7 deletions

View File

@@ -35,8 +35,8 @@ type ListLikesCountRequest struct {
}
type LikesCountCursor struct {
LikesCount int64
ID uint
LikesCount int64
ID uint
}
type ListLikesCountResponse struct {
@@ -47,7 +47,8 @@ type ListLikesCountResponse struct {
}
type ListByFollowingRequest struct {
Limit int `json:"limit"`
Limit int `json:"limit"`
LatestTime int64 `json:"latest_time"`
}
type ListByFollowingResponse struct {

View File

@@ -101,7 +101,11 @@ func (f *FeedHandler) ListByFollowing(c *gin.Context) {
if err != nil {
viewerAccountID = 0
}
feedItems, err := f.service.ListByFollowing(c.Request.Context(), req.Limit, viewerAccountID)
var latestTime time.Time
if req.LatestTime > 0 {
latestTime = time.Unix(req.LatestTime, 0)
}
feedItems, err := f.service.ListByFollowing(c.Request.Context(), req.Limit, latestTime, viewerAccountID)
if err != nil {
c.JSON(500, gin.H{"error": err.Error()})
return

View File

@@ -49,7 +49,7 @@ func (repo *FeedRepository) ListLikesCountWithCursor(ctx context.Context, limit
return videos, nil
}
func (repo *FeedRepository) ListByFollowing(ctx context.Context, limit int, viewerAccountID uint) ([]*video.Video, error) {
func (repo *FeedRepository) ListByFollowing(ctx context.Context, limit int, viewerAccountID uint, latestBefore time.Time) ([]*video.Video, error) {
var videos []*video.Video
query := repo.db.WithContext(ctx).Model(&video.Video{}).
Order("create_time DESC")
@@ -60,6 +60,9 @@ func (repo *FeedRepository) ListByFollowing(ctx context.Context, limit int, view
Where("follower_id = ?", viewerAccountID)
query = query.Where("author_id IN (?)", followingSubQuery)
}
if !latestBefore.IsZero() {
query = query.Where("create_time < ?", latestBefore)
}
if err := query.Limit(limit).Find(&videos).Error; err != nil {
return nil, err
}

View File

@@ -96,8 +96,27 @@ func (f *FeedService) ListLikesCount(ctx context.Context, limit int, cursor *Lik
return resp, nil
}
func (f *FeedService) ListByFollowing(ctx context.Context, limit int, viewerAccountID uint) (ListByFollowingResponse, error) {
videos, err := f.repo.ListByFollowing(ctx, limit, viewerAccountID)
func (f *FeedService) ListByFollowing(ctx context.Context, limit int, latestBefore time.Time, viewerAccountID uint) (ListByFollowingResponse, error) {
var cacheKey string
if viewerAccountID != 0 && f.cache != nil {
before := int64(0)
if !latestBefore.IsZero() {
before = latestBefore.Unix()
}
cacheKey = fmt.Sprintf("feed:listByFollowing:limit=%d:accountID=%d:before=%d", limit, viewerAccountID, before)
cacheCtx, cancel := context.WithTimeout(ctx, 50*time.Millisecond)
defer cancel()
b, err := f.cache.GetBytes(cacheCtx, cacheKey)
if err == nil {
var cached ListByFollowingResponse
if err := json.Unmarshal(b, &cached); err == nil {
return cached, nil
}
}
}
videos, err := f.repo.ListByFollowing(ctx, limit, viewerAccountID, latestBefore)
if err != nil {
return ListByFollowingResponse{}, err
}
@@ -117,6 +136,13 @@ func (f *FeedService) ListByFollowing(ctx context.Context, limit int, viewerAcco
NextTime: nextTime,
HasMore: hasMore,
}
if cacheKey != "" {
if b, err := json.Marshal(resp); err == nil {
cacheCtx, cancel := context.WithTimeout(ctx, 50*time.Millisecond)
defer cancel()
_ = f.cache.SetBytes(cacheCtx, cacheKey, b, f.cacheTTL)
}
}
return resp, nil
}