go 互斥锁和自旋锁的性能对比的问题

Mericusta · · 1868 次点击 · 开始浏览    置顶

最近需要做一个本地缓存的需求,缓存数据从 redis 读取 遂考虑到在大量并发的情况下,减少 go 协程切换的消耗,考虑用自旋锁来实现 大概的思路是: - 大量并发请求 - 自旋锁上锁 - 放一个 goroutine 去 redis 读取数据到本地缓存 - 其他 goroutine 原地自旋等待缓存数据 - 读取的协程读取到数据之后解锁 但是我经过实际测试,发现用自旋锁的速度和用互斥锁的速度要差1~2个数量级,遂很不理解 之后我经过大量测试发现: - 自旋锁在 本地操作(值自增),阻塞操作(sleep 或者 channel recv)时,性能高于互斥锁 - 在 HTTP 操作时性能和互斥锁相当 - 在通过 "github.com/go-redis/redis/v8" 操作 redis 获取数据时,自旋锁的性能和互斥锁要差1个数量级 不知道是否有大佬可以解答一番?不吝赐教 [测试代码在这里](https://github.com/Mericusta/go-foo/tree/main/src/sync-foo)

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1868 次点击  ∙  1 赞  
加入收藏 微博
15 回复  |  直到 2022-09-21 10:21:21
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传