go redis 计数

发布时间:2026/11/11 22:27:39

go redis 计数 在 Go 中使用 Redis 做计数最常用的库是github.com/redis/go-redis/v9。以下是核心用法和常见场景1. 基础计数操作gopackage main import ( context fmt github.com/redis/go-redis/v9 ) func main() { ctx : context.Background() rdb : redis.NewClient(redis.Options{ Addr: localhost:6379, }) key : page:view:home // INCR - 自增 1 val, err : rdb.Incr(ctx, key).Result() fmt.Println(INCR:, val, err) // INCRBY - 自增指定数值 val, err rdb.IncrBy(ctx, key, 10).Result() fmt.Println(INCRBY:, val, err) // DECR - 自减 1 val, err rdb.Decr(ctx, key).Result() fmt.Println(DECR:, val, err) // DECRBY - 自减指定数值 val, err rdb.DecrBy(ctx, key, 5).Result() fmt.Println(DECRBY:, val, err) }2. 带过期时间的计数如每日统计go// 每日点赞数凌晨自动过期 func incrDailyLike(ctx context.Context, rdb *redis.Client, itemID string) (int64, error) { key : fmt.Sprintf(like:daily:%s:%s, time.Now().Format(2006-01-02), itemID) // 使用 Pipeline 原子执行 INCR EXPIRE pipe : rdb.Pipeline() incr : pipe.Incr(ctx, key) pipe.Expire(ctx, key, 25*time.Hour) // 留点余量 _, err : pipe.Exec(ctx) return incr.Val(), err }3. 限流计数滑动窗口go// 固定窗口限流每分钟内最多 100 次 func rateLimit(ctx context.Context, rdb *redis.Client, userID string) (bool, error) { key : fmt.Sprintf(ratelimit:%s:%d, userID, time.Now().Unix()/60) current, err : rdb.Incr(ctx, key).Result() if err ! nil { return false, err } if current 1 { // 第一次访问设置过期时间 rdb.Expire(ctx, key, time.Minute) } return current 100, nil }4. Hash 字段计数多维度统计go// 统计文章的多维度数据 rdb.HIncrBy(ctx, post:stats:123, views, 1) rdb.HIncrBy(ctx, post:stats:123, likes, 1) rdb.HIncrBy(ctx, post:stats:123, comments, 1) // 获取全部 stats, _ : rdb.HGetAll(ctx, post:stats:123).Result()5. 批量计数Pipelinegopipe : rdb.Pipeline() for i : 0; i 1000; i { pipe.Incr(ctx, fmt.Sprintf(counter:%d, i)) } _, err : pipe.Exec(ctx)关键注意点表格问题方案并发安全Redis 单线程INCR 天然原子无需加锁首次计数key 不存在时 INCR 自动从 0 开始返回 1溢出Redis 整数上限为 64 位有符号整数2^63-1持久化若数据极重要建议开启 AOF 或定期落库如果你有具体场景比如高并发计数、去重计数、分布式 ID 生成可以告诉我我给出更针对性的方案。在 Go 中使用go-redis获取计数值主要用GET系列命令。以下是常见场景的完整示例1. 基础获取gopackage main import ( context fmt strconv github.com/redis/go-redis/v9 ) func main() { ctx : context.Background() rdb : redis.NewClient(redis.Options{Addr: localhost:6379}) // 获取单个计数 val, err : rdb.Get(ctx, page:view:home).Result() if err redis.Nil { fmt.Println(key 不存在计数为 0) } else if err ! nil { panic(err) } else { count, _ : strconv.ParseInt(val, 10, 64) fmt.Println(当前计数:, count) } // 直接获取 int64推荐 count, err : rdb.Get(ctx, page:view:home).Int64() if err redis.Nil { count 0 } fmt.Println(计数:, count) }2. 批量获取多个计数go// MGET 一次性获取多个 key keys : []string{counter:a, counter:b, counter:c} vals, err : rdb.MGet(ctx, keys...).Result() // vals 是 []interface{}不存在的 key 对应 nil for i, v : range vals { if v nil { fmt.Printf(%s 0 (不存在)\n, keys[i]) } else { fmt.Printf(%s %v\n, keys[i], v) } }3. Hash 结构中的计数获取go// HGET 获取单个字段 views, _ : rdb.HGet(ctx, post:stats:123, views).Int64() // HMGET 获取多个字段 fields : []string{views, likes, comments} vals, _ : rdb.HMGet(ctx, post:stats:123, fields...).Result() // HGETALL 获取全部字段 all, _ : rdb.HGetAll(ctx, post:stats:123).Result() fmt.Println(all[views], all[likes])4. 获取并设置过期时间原子操作go// 获取计数同时刷新过期时间如会话活跃统计 pipe : rdb.Pipeline() get : pipe.Get(ctx, session:active:1001) pipe.Expire(ctx, session:active:1001, 30*time.Minute) _, err : pipe.Exec(ctx) count, _ : get.Int64()5. 获取时的类型转换方法go-redis的StringCmd提供了便捷转换表格方法说明.Result()返回(string, error).Int64()直接转int64key 不存在返回redis.Nil错误.Uint64()转uint64.Float64()转float64用于浮点计数.Bool()转bool6. 完整工具函数示例go// GetCounter 安全获取计数key 不存在返回 0 func GetCounter(ctx context.Context, rdb *redis.Client, key string) int64 { n, err : rdb.Get(ctx, key).Int64() if err redis.Nil { return 0 } if err ! nil { // 可打日志或上报 return 0 } return n } // GetCounters 批量获取返回 map[key]count func GetCounters(ctx context.Context, rdb *redis.Client, keys ...string) map[string]int64 { result : make(map[string]int64, len(keys)) if len(keys) 0 { return result } vals, err : rdb.MGet(ctx, keys...).Result() if err ! nil { return result } for i, v : range vals { if v ! nil { if n, ok : v.(string); ok { result[keys[i]], _ strconv.ParseInt(n, 10, 64) } } else { result[keys[i]] 0 } } return result }核心注意点Redis 中INCR等命令存储的是字符串Get返回的是字符串需用.Int64()转换key 不存在时Get返回redis.Nil错误不是返回0。
延伸阅读

更多相关文章

2026/11/11 4:31:31

sql优化建议

SELECT count(*) FROM "fsrs_cards" WHERE "fsrs_cards"."deleted_at" IS NULL and exist (select 1 from vocab_words where vocab_id 1001 and obj_id word_id and deleted_at is null) AND (user_id 1983799923358830592) AND (要分析这条S…

2026/11/11 19:29:13

RAGFlow、LightRAG 还是 GraphRAG?9 个维度帮你一次选对

从文档解析、关系推理到全局归纳,三套方案选型不靠参数对比,靠看清自己的核心约束 你的场景决定选哪个,没有银弹。 一、为什么需要它们:传统 RAG 的三道坎 问一句「过去半年设计评审中团队的主要分歧是什么」,传统 RA…

2026/11/10 18:26:45

解锁AMD Ryzen隐藏潜力:SMUDebugTool硬件调试完全指南

解锁AMD Ryzen隐藏潜力:SMUDebugTool硬件调试完全指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gi…

2026/11/11 22:22:59

商南县高压电工证通过率揭秘:外省证书能转吗?手把手教你解决

商南县高压电工证通过率揭秘:外省证书能转吗?手把手教你解决 之前考的证在外省能不能转过来?这个问题,我听得太多了,不管是刚入行的新人,还是打算转行的同行,几乎每个人都会问。商南县高压电工证的通过率到底怎么样?有没有什么隐藏门槛?今天我就以多…

2026/11/11 22:22:59

北京电工证体检通过率揭秘:别被中介坑了,这几点你必须知道

北京电工证体检通过率揭秘:别被中介坑了,这几点你必须知道 不知道去哪报名怕被中介坑?北京电工证体检报名流程复杂,很多人被各种中介忽悠,花了不少冤枉钱。今天咱们就来聊聊 北京电工证体检 这件事,从真实案例出发,揭秘背后的操作流程和避坑经验,…

2026/11/11 22:22:59

蒙自电工证培训资料怎么准备才不白交钱?网上查询最靠谱

蒙自电工证培训资料怎么准备才不白交钱?网上查询最靠谱 怕考不过白交培训费?现在电工证培训资料五花八门,很多人一上来就花钱报班,结果一到考试就懵圈,后悔不已。其实,只要选对资料,提前规划好复习节奏,考过完全不是问题。尤其像蒙自电工证培训资料这…

2026/11/11 22:22:59

恩施电工证电话怎么转异地?郑州报考避坑指南

恩施电工证电话怎么转异地?郑州报考避坑指南 之前考的证在外省能不能转过来?这是很多持证人最关心的问题,尤其是在恩施考的电工证,现在工作地点换到郑州或其他地方,很多人就犯了愁,怕证书不能用,更怕在异地重新考一遍。今天我们就来聊聊…

2026/11/11 22:22:59

电监会停办电工证原因你知道吗?郑州报考避坑指南全在这

电监会停办电工证原因你知道吗?郑州报考避坑指南全在这 证书过期了不知道怎么复审延期,这种情况在特种作业人员中很常见。尤其是南阳地区的建筑工人,很多都经历过证书过期后找不到正规渠道复审的问题。其实,电监会停办电工证背后的原因,和整个行业的发展…

2026/11/11 22:17:59

邢台考电工证的地方怎么复审延期?电子证书过期了怎么办

邢台考电工证的地方怎么复审延期?电子证书过期了怎么办 证书过期了不知道怎么复审延期,是很多电工从业者最头疼的问题。尤其在邢台考电工证的地方,很多人拿到低压电工证或高压电工证后,一忙就忘了复审,等到发现证书已经失效时,才慌了神。其实电子证书的…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/11 0:02:26

考低压电工证通过率考试真题与备考技巧

低压电工证通过率高不高?学历不高也能考,值不值得考? 你是不是总听说电工证能帮你找高薪工作,但又担心自己学历不够,考不上?其实,低压电工证考试门槛并没有你想象中那么高,关键是方法对不对。这篇文章就告诉你, 考低压电工证通过率到底有多高 ,…

2026/11/11 0:02:26

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名

低压电工证学时千万别踩坑,濮阳毕业生怎么避坑报名 你是不是也和我一样,刚毕业就听说低压电工证学时必须达标才能上岗?可一打听,发现报名机构五花八门,价格参差不齐, 不知道去哪报名怕被中介坑…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑