gin入门之redis的使用| 青训营

138 阅读3分钟

redis的用法有哪些

Redis有许多常用的用法,以下是一些主要的用途:

  1. 缓存: Redis常被用作高速缓存,可以将热门数据存储在内存中,以提高读取速度,从而减轻数据库负载。
  2. 会话存储: Redis可以用来存储用户会话数据,特别是在分布式系统中,以确保用户在不同服务之间的状态一致性。
  3. 消息队列: Redis的发布订阅机制可以实现消息队列,用于解耦系统中不同模块的通信。
  4. 计数器: Redis的原子递增操作使其成为计数器的理想选择,用于记录访问次数、点赞数等。
  5. 排行榜: 通过有序集合数据结构,可以实现排行榜功能,记录分数和成员的关系,用于实时排名。
  6. 地理位置: Redis的地理位置数据结构可以用来存储地理位置信息,执行附近位置的查找等功能。
  7. 分布式锁: Redis提供了原子操作,可以用来实现分布式锁,保证在分布式系统中的数据一致性。
  8. 持久化: Redis支持将数据持久化到磁盘上,以便在重启后恢复数据,有助于防止数据丢失。
  9. BitMap和HyperLogLog: Redis提供了BitMap和HyperLogLog等数据结构,用于位图操作和基数估计,适用于统计和分析场景。

在极简版抖音中,redis可以怎么用

  1. 缓存热门视频: 将热门视频的数据存储在Redis缓存中,以提高视频的访问速度,减轻数据库负载。
  2. 用户会话管理: 使用Redis存储用户会话信息,包括登录状态、用户ID等,确保用户在不同请求之间的状态保持一致。
  3. 点赞、评论和分享计数: 使用Redis的计数功能,记录视频的点赞数、评论数和分享数,以实现实时更新和显示。
  4. 实时排行榜: 基于Redis的有序集合数据结构,可以实现热门视频的实时排名,根据点赞数或播放次数进行排行。
  5. 用户关注列表: 使用Redis的集合数据结构,存储用户的关注列表,以便在推送和内容定制时使用。
  6. 消息队列: 用Redis的发布-订阅机制,实现实时通知用户新的点赞、评论或关注等互动。
  7. 用户行为限制: 利用Redis的过期功能,可以记录用户的行为次数,例如每日发视频次数的限制。
  8. 视频播放记录: 存储用户观看视频的记录,以便在推荐系统中使用,提供个性化的推荐内容。
  9. 短时有效数据: 存储短时有效的数据,如临时验证码、用户临时状态等,以减轻数据库的压力。

在项目中,如果使用session存储用户会话信息,可以用redis进行session的分布式管理,我们在这里先学习一些redis的简单使用。

redis实现点赞和关注功能

初始化redis连接

func init() {
    rdb = redis.NewClient(
       &redis.Options{
          Addr:     fmt.Sprintf("%s:%d", config.Global.RDB.IP, config.Global.RDB.Port),
          Password: "", //没有设置密码
          DB:       config.Global.RDB.Database,
       })
}

设置点赞状态接口

// UpdateVideoFavorState 更新点赞状态,state:true为点赞,false为取消点赞
func (i *ProxyIndexMap) UpdateVideoFavorState(userId int64, videoId int64, state bool) {
    key := fmt.Sprintf("%s:%d", favor, userId)
    if state {
       rdb.SAdd(ctx, key, videoId)
       return
    }
    rdb.SRem(ctx, key, videoId)
}

获取点赞状态接口

func (i *ProxyIndexMap) GetVideoFavorState(userId int64, videoId int64) bool {
    key := fmt.Sprintf("%s:%d", favor, userId)
    ret := rdb.SIsMember(ctx, key, videoId)
    return ret.Val()
}

设置关注状态接口

func (i *ProxyIndexMap) UpdateUserRelation(userId int64, followId int64, state bool) {
    key := fmt.Sprintf("%s:%d", relation, userId)
    if state {
       rdb.SAdd(ctx, key, followId)
       return
    }
    rdb.SRem(ctx, key, followId)
}

获取关注状态接口

func (i *ProxyIndexMap) GetUserRelation(userId int64, followId int64) bool {
    key := fmt.Sprintf("%s:%d", relation, userId)
    ret := rdb.SIsMember(ctx, key, followId)
    return ret.Val()
}