LoadSessionsFromDB的实现,为何不直接将 RetrieveAllSessions的返回值赋值给sessionMap?

来源:3-16 api之session处理与实现(下)

pu2chyh

2019-04-10

请问:
func RetrieveAllSessions() (*sync.Map, error) {}
这个函数的返回值就有sync.Map,为何LoadSessionsFromDB()在调用的时候,不是直接把RetrieveAllSessions的返回值赋给sessionMap,而是要用range方法去取一遍k,v,然后再用sessionMap.Store(k,v)来操作呢?

写回答

2回答

艾文西

2019-04-17

这实际上是为了扩展性而做的设计。

表面上来看RetrieveAllSessions返回的Map结构和我们的cache是一致的,但是不能直接赋值,因为LoadSessionFromDB不一定只是在我们服务重启的时候会被调用,当DB宕机时,恢复DB数据的时候也是需要调用的。因此如果出现DB和cache的数据不一致,我们不能简单粗暴的把DB所有的数据直接赋值,这样在线上的新生成的session就会失效。

至于这部分容灾的内容,由于课程内容原因没有添加业务处理,因此这里只有一个简单的通用性的处理方法。

2
2
pplegend
回复
pu2chyh
你看懂了?RetrieveAllSessions 和 LoadSessionsFromDB 都是从DB获取数据,哪里来的不一致?
2020-02-04
共2条回复

慕桂英0528577

2020-12-07

老师 ,对于这位同学的问题 ,我还是有同样的问题。能否简单讲下调用流程 ,或者是在什么情况下 DB和cache 的数据会不一致

0
0

Go语言实战流媒体视频网站,高效学习Go高性能开发

从零开始,全面掌握Go语言编码的架构风格和开发Web的关键技能

996 学习 · 268 问题

查看课程