网上查了一些,但那些文章写的云里雾里(可能是我搜索的关键字不对吧?)
想问问各位大佬是如何做的 ( nodejs+mongodb )
功能计数器: 每有一个请求访问网站就会+1 ,并保存到数据库中(每个页面有自己的计数器,也就是 pv 统计)
伪代码:
// 假设请求服务器的时候 nodejs 会调用这个方法
// id 为页面的唯一表示
function counter(id){
// 如果数据库中没有数据则插入、否则修改并+1
const result = db.select(id)
if(result){
result.pv++
db.update(id, { pv: result.pv })
return result
}
db.insert(id, { pv: 1 })
return { pv:1 }
}
问题 1: 假设一开始数据库中并无某个页面数据,这时突然来了两个(以上)请求(id 相同),那么当调用 counter()
时会先查询数据库中是否有数据,此时第一个请求开始 select
发现数据库中并无数据,但还没来得及 insert
第二个请求就开始了 select
,此时第二个请求也发现数据库并无数据,最后就会执行两个插入操作导致数据重复
实际结果:
[
{_id: 1, id: "A", pv: 1},
{_id: 2, id: "A", pv: 1}
]
期望结果:
[
{_id: 1, id: "A", pv: 2}
]
问题 2: 假设数据库中已有一条数据 [{_id: 1, id: "A", pv: 1}]
,突然来了 3 个(以上)请求,3 个请求都会去查询数据库,得到的结果全部相同 pv 都是 1 ,这 3 个请求都会执行 update
实际结果:
[
{_id: 1, id: "A", pv: 2}
]
期望结果:
[
{_id: 1, id: "A", pv: 4}
]
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.