redis的用法有哪些
Redis有许多常用的用法,以下是一些主要的用途:
- 缓存: Redis常被用作高速缓存,可以将热门数据存储在内存中,以提高读取速度,从而减轻数据库负载。
- 会话存储: Redis可以用来存储用户会话数据,特别是在分布式系统中,以确保用户在不同服务之间的状态一致性。
- 消息队列: Redis的发布订阅机制可以实现消息队列,用于解耦系统中不同模块的通信。
- 计数器: Redis的原子递增操作使其成为计数器的理想选择,用于记录访问次数、点赞数等。
- 排行榜: 通过有序集合数据结构,可以实现排行榜功能,记录分数和成员的关系,用于实时排名。
- 地理位置: Redis的地理位置数据结构可以用来存储地理位置信息,执行附近位置的查找等功能。
- 分布式锁: Redis提供了原子操作,可以用来实现分布式锁,保证在分布式系统中的数据一致性。
- 持久化: Redis支持将数据持久化到磁盘上,以便在重启后恢复数据,有助于防止数据丢失。
- BitMap和HyperLogLog: Redis提供了BitMap和HyperLogLog等数据结构,用于位图操作和基数估计,适用于统计和分析场景。
在极简版抖音中,redis可以怎么用
- 缓存热门视频: 将热门视频的数据存储在Redis缓存中,以提高视频的访问速度,减轻数据库负载。
- 用户会话管理: 使用Redis存储用户会话信息,包括登录状态、用户ID等,确保用户在不同请求之间的状态保持一致。
- 点赞、评论和分享计数: 使用Redis的计数功能,记录视频的点赞数、评论数和分享数,以实现实时更新和显示。
- 实时排行榜: 基于Redis的有序集合数据结构,可以实现热门视频的实时排名,根据点赞数或播放次数进行排行。
- 用户关注列表: 使用Redis的集合数据结构,存储用户的关注列表,以便在推送和内容定制时使用。
- 消息队列: 用Redis的发布-订阅机制,实现实时通知用户新的点赞、评论或关注等互动。
- 用户行为限制: 利用Redis的过期功能,可以记录用户的行为次数,例如每日发视频次数的限制。
- 视频播放记录: 存储用户观看视频的记录,以便在推荐系统中使用,提供个性化的推荐内容。
- 短时有效数据: 存储短时有效的数据,如临时验证码、用户临时状态等,以减轻数据库的压力。
在项目中,如果使用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()
}