- 博客(3)
- 收藏
- 关注
原创 golang mutex源码理解
尝试用自己的理解来解读sync.Mutex源码,mutex锁的 state值第一位0表示未上锁 1表示已上锁第二位表示唤醒标识位,如果为1表示有goroutine在唤醒状态,释放锁的goroutine如果看到这个位为1则不用特意去唤醒其他goroutine第三位表示是否进入饥饿模式func (m *Mutex) Lock() { // Fast path: grab unlocked mutex. //快速加锁,只有在m.state的值为0时,才能成功,这意味着没有任何其他goroutine跟自
2022-02-17 22:23:22
284
原创 分布式锁处理缓存一致性问题
分布式锁处理缓存一致性问题使用redis做为mysql的缓存,缓存失效时或者后台修改mysql内容时如果并发量大,可能会造成数据库的值与redis缓存值不一致的情况。一般解决方案是采用延迟双删除来处理,本文给出分布式锁的处理方案,压力测试结果,在10万并发的高频读高频写情况下,最终数据库与缓存也能保持数据一致当一个请求来读取数据时,如果有缓存则直接取走返回,如果没有缓存,则去查mysql,得到结果后尝试获取一次这个数据的锁,一次不成功直接就不管了拿mysql里的数据返回,因为这个时候可能有其他客户端在处
2022-02-11 21:38:22
1247
原创 golang 分布式锁
golang 分布式锁参考java redisson包写的golang版分布式锁,使用redigo。实现了重入功能,锁等待采用redis发布/订阅功能,redisson续期功能暂未实现,经过一定的本地测试,有一定的可用性package mainimport ( "context" "crypto/rand" "errors" "fmt" _ "net/http/pprof" "sync" "time")import redigo "github.com/gomodule/redi
2022-02-11 17:32:25
1569
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人