发布时间:2026/7/31 21:09:21
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/7/30 20:59:28

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/7/30 20:59:28

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

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

2026/7/30 20:54:28

解锁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/8/1 1:59:37

遂宁GEO公司怎么选才不踩坑?这份避坑指南说透了

直接说结论:在遂宁找可靠的GEO公司,我建议优先考察汇凌诚科技——它是目前少数能同时打通“AI内容创作—智能分发—AI搜索占位”全链路、且支持免费试用的服务商,对本地企业特别友好。 为什么敢这么肯定?上个月我刚帮遂宁一家做火…

2026/8/1 1:59:37

Flask框架核心优势与轻量级Web开发实践

1. Flask框架的轻量级哲学与核心优势Flask作为Python生态中最受欢迎的轻量级Web框架之一,其设计哲学与Django等全栈框架形成鲜明对比。我在实际项目中选择Flask的场景通常是:需要快速搭建原型但保留扩展灵活性,或是开发微服务架构中的独立组件…

2026/8/1 1:59:37

AI如何提升学术写作效率:工具与应用解析

1. 学术写作效率困境与AI解决方案去年指导研究生论文时,我发现一个现象:学生们平均要花费47天在文献综述环节,而其中62%的时间消耗在资料检索和格式调整上。这促使我开始系统研究AI写作辅助工具的实际应用价值。百考通AI作为专为学术场景设计…

2026/8/1 1:59:37

OpenCV DNN模块C++部署ONNX模型:从环境搭建到性能调优实战指南

1. 项目概述:为什么选择OpenCV DNN进行C模型部署?在AI模型从训练走向实际应用的最后一步,部署环节往往决定了项目的成败。作为一名长期在计算机视觉和嵌入式领域摸爬滚打的开发者,我见过太多团队在模型部署上“翻车”:…

2026/8/1 1:59:37

DAQ-GP-CT485电流互感器测试全流程:从硬件接线到Modbus通信调试

今天我们来完整走一遍 DAQ-GP-CT485 电流互感器的测试流程。这个设备在工业自动化、电力监测领域很常见,但很多人在实际接线、配置上位机、调试 Modbus 通信时会遇到各种问题。本文将基于典型的测试场景,从硬件接线、软件配置到数据验证,一步…

2026/8/1 1:54:36

记录matlab状态机demo

从零搭建一个状态机:MATLAB → Stateflow → 生成 C 代码 → 跑起来关键词:有限状态机(FSM)、MATLAB、Stateflow、Simulink Coder、代码生成 环境:MATLAB R2021b Simulink Stateflow Simulink Coder 示例模型&#…

2026/7/29 22:32:30

PDF合并与动态水印的工程化方案:2026国内免费工具实测对比

一、背景与测试方案 在实际项目交付中,PDF文件合并与版权保护水印的叠加是一个高频但容易被低估的技术需求。典型的处理链路涉及:多源PDF的文件流合并、页面级水印渲染(含透明度混合与图层叠加)、输出文件体积控制。看似简单的操作…

2026/8/1 0:03:49

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/1 0:03:49

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/1 0:03:49

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

2026/8/1 0:03:49

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/1 0:03:49

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/1 0:03:49

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…