谁能给个思路?技术问题

时间:2021-04-07 05:10:11
我做了一个网站,上面有好多商品,每一个商品就是一个页面,我现在需要在每个商品的下面显示浏览过这个商品的用户还浏览过其他商品!
显示出来8个就行!
而且要实时的现实数据!
我需要怎么做!
我个人认为这个问题看似简单其实不简单!
因为如果有百万人浏览百万个商品,那要怎么记录这个数据?

或者不记录,那应该咋们处理呢?

166 个解决方案

#1


我试图通过当客户每浏览一个就往数据库或者文件写入一次的办法,但是都不行!考虑到性能和速度!

#2


首先你得有个浏览记录表:

主键(id)
商品ID(s_id)
用户ID(u_id)
浏览时间...等参数

显示8条这个不难吧? 不用说了吧 直接select top(8) from 浏览表 order by 浏览时间 desc 取出最新的8条

至于你的实时显示这个好像很少有网站这样做 迅雷在线影视有个你观看记录也不是实时的 对以http协议要实现实时可能性能会消耗
如果你非得做可以考虑一下dwr的方向ajax和用ajax定时去刷新浏览记录

至于你说你有上百万记录 这个你得考虑做数据库和程序的集群了!

#3


up!!~

#4


这个放入session中不行吗?
跟购物车很像,可以先创建一个空的购物车,每浏览一页就自动把商品放入到此购物车中,并且取session中的值。
如果重复,你判断一下,该怎么显示。

#5


用ArrayList装载客户浏览的商品
把ArrayList放到session中

愚见
不知道是否可行

#6


我觉得可以放入到session中

#7


放在服务器端就用session,放在客户端就用cookie

#8


该回复于2009-07-18 00:18:55被版主删除

#9


引用 4 楼 zhong19860904 的回复:
这个放入session中不行吗? 
跟购物车很像,可以先创建一个空的购物车,每浏览一页就自动把商品放入到此购物车中,并且取session中的值。 
如果重复,你判断一下,该怎么显示。 

我也是想到了Session,只有8个商品,数据量又不大,没必要走到数据库层

#10


2楼的方案还可行,用session不太好吧。估计你的频繁操作session。

#11


二楼朋友:
应该是
商品主键对应商品主键吧!
关系是1个对应8个的。

因为是浏览过这个商品的所有用户还浏览过那些商品!


所以是商品底下显示的是商品!


如果插入数据库,那将是一个庞大的数据流!
例如有商品 1, 2, 3,4,5,6,7,8,9
有一个用户把这九个都浏览了!

商品1到9的每个页面上应该显示
于自己不同的其他8个


我说的百万有些夸大了!呵呵!

#12


那就走cookie吧

#13


我仔细考虑了一下不管是数据库还是session 都很消耗资源!

我想到当用户session创建了以后就开始记录他浏览过的商品,
只记录商品ID然后当session销毁的时候把这些ID再进行整理进行物理存储

#14


cookie 是客户端的!这个貌似行不通!
数据要保留在服务端的!
这样方便下一个用户一进来就很直观的能看到这个商品
底下的一些商品!


我刚才说的那个方法现在还是存在问题!呵呵!
这个问题是个弯弯绕的问题!

看来大家这么有热情我这就去给帖子加分!

#15



不好意思!
呵呵

发帖一天后太刻意加分的!

#16


你只显示8条。那就按浏览时间排序最近的8条吧,那么表中只保留一段时间数据就足够了

#17


我觉得用这种方式用cookie在客户端先记录好当前浏览了哪些产品,以及次数
在退出你网站的时候把客户端cookie存的数据返回服务器并消灭当前cookie
服务端创建session对象获取用户传过来的商品ID+次数
隔一定的时间来执行sql语句更新数据库
服务端你产品表里面搞张对应表 增加个字段
这样做对服务端应该说压力不大
 

#18


没必要做时时交互,可以半自动呵呵

#19


关注

#20


用session.

#21


引用楼主 luoxinabc12345 的帖子:
我做了一个网站,上面有好多商品,每一个商品就是一个页面,我现在需要在每个商品的下面显示浏览过这个商品的用户还浏览过其他商品! 
显示出来8个就行! 
而且要实时的现实数据! 
我需要怎么做! 
我个人认为这个问题看似简单其实不简单! 
因为如果有百万人浏览百万个商品,那要怎么记录这个数据? 

或者不记录,那应该咋们处理呢?


如果通过数据库的话 那么只能在该商品表里加个关联表 记录该商品的友好商品信息 当然 友好商品信息是随时可以更换的(根据用户的浏览)

LZ想要实时的数据 那样的话貌似每个用户来都得进行一次记录 那么 说下我的个人建议吧:

一个商品对应16个友好商品 关联表的字段只有两个 一个是友好商品的ID 一个是该友好商品的点击次数 排序根据点击次数排出前8条记录显示在前台 至于剩下那八条 则是为了让该商品动态的替换而留的 每次有一个浏览过该商品又浏览了其他商品的情况出现 都会进行更新(正常情况下商品表里最好也加个查看次数) 如果两条友好商品的查看次数都是1 那我们根据该商品的查看次数决定他的去留(不是在关联表里的查看次数 而是商品表的查看次数 这里LZ也可以适当的变通一下 比如  根据时间比较 或者是其他的什么)



-------------------------------------------------------------------------------------------------------------

第二种方案(如果您能看到这里那我很感激你...)

这个方案实际上很简单 效率上也很好 就是每个商品加一个类别和一个点击查看次数 每点商品一次就增加查看次数一次 友好商品列表里就输出前8个 或者 根据你所点的商品的点击次数 来获得友好商品的点击次数(比如该商品点击次数为5 那么可以根据5来获得一个范围 就点击次数5到10的 因为一般点击次数比较少的话 说明曾经有个用户浏览了所有的商品...当然 猜测而已)

用这个方法最大的好处就是效率 而且比较好实现(虽然看起来只是获得点击次数高的商品记录...但是如果用范围的获取方法 那么效果说不定会有些...)


累死偶咯 偶的回答如果帮不上您的忙的话.... 总之 我尽力了 后面的帮顶啊! 

#22


另外 如果不想通过更新数据库的方式来获得的话 还有一种办法 就是appliaction 当用户点击某样商品的时候 同时更新APPLIACTION里的关于该商品的点击信息(APPLIACTION里放该商品的类别和点击次数) 这个方法也比较简单

#23


引用 22 楼 BearKin 的回复:
另外 如果不想通过更新数据库的方式来获得的话 还有一种办法 就是appliaction 当用户点击某样商品的时候 同时更新APPLIACTION里的关于该商品的点击信息(APPLIACTION里放该商品的类别和点击次数) 这个方法也比较简单


补充下: 所谓的用户我觉得只是一个不存在的东西 如果说LZ一定要坚持查看某些用户浏览过的商品的话 那么每个商品难道都要加个最近浏览用户的表表? 每个用户都有个最近浏览商品的表表?期待高人解答

#24


理解不了,不知道如何实现啊

#25


楼主没有给用户提供他近期浏览过的商品的情况吗  如果这样但就关联商品表恐怕不行吧  这个效果似乎和xunleikankan里面的一样

#26


就是和迅雷看看的那个“最近浏览过的大片”一个效果!

#27


引用 24 楼 leongod 的回复:
理解不了,不知道如何实现啊

!

#28




就是和迅雷看看的那个“看过该片的人还看过”一个效果! 

#29


21楼的朋友:
真是太感谢你了!
你说的很有道理!我尝试去做一下!
说不定会碰到一些新的问题!
还需要再来请教你!


说真的!这个问题真不简单那!

希望后来的朋友能提出更好的建议,和自己的见解!

期待中!!!

明天给该贴加分!!!

#30


学习下 我也不会 呵呵

#31


小弟的建議是使用DB

step 1.
開一個Table 紀錄 memberid和 bookid,

step 2.
寫一個SQL procedure 一天跑一次
ex. 
insert into book_browser(memberid, bookid, cnt)
select bookid,memberid,count(*) as cnt
from book_browser_record
group by bookid,memmberid
order by bookid, count(*)

step 3.
select top 8 memberid from book_browser where bookid =?

#32


cookie是肯定不能用的,cookie可以是用于之前自己浏览过哪些商品
session也是不能用的,session是会爆的,一般都只用来存用户信息,不然什么都塞,哪吃的消。
关键是数据库的表结构设计,以及性能的优化,或者做缓存,但是要设计一个良好的更新数据方案。
只是有一点,是一定要存DB的,然后定时同步DB和缓存,不然服务重启,你记录啥都没有。DB读取要到哪个频繁度,这个都是要具体考虑的。
你做一个商品对应客户的一对多,还是多对多表都没关系,因为这个一定不是实时的。
一个用户的浏览记录都存进去,可以先放缓存,再定时读缓存到DB,然后做一个分析的线程,可以在凌晨做一次,或者一天中午一次,晚上一次这样子,调用成堆的sql语句也好,一个存储过程也好,把数据分析好存到一张表,这个表的结果是很明了的,一条简单的sql语句就能实现查询要求的那种。具体是基于商品分析客户,还是基于客户分析商品,这个看你需求,你的侧重点究竟是在哪里,因为看过这个商品的其他用户不可能只有一个,你是取谁的8个,还是取平均量的8个,重复了怎么办,等等

#33


我觉得还是session还可以
记录到数据库不现实
因为这是一个意义不大的功能
如果要记录到数据库,时间一长,数据积攒将非常大
而且不停的连接数据库对程序的运行效率影响比较大
建议还是用session吧

#34


表格结构,id自增:T(id,uid,pid)
查询,应该针对产品做短时间缓存:select top 8 distinct pid from T where uid in (select uid from T where pid=@pid) and pid<>@pid order by id desc
定时清理:delete T where id<(select top 1 id from (select top 9 id from T as t1 where uid=T.uid order by id desc) as t2 order by id)
如果定时时间段内的用户量比较小于用户总数的一半时加条件:uid in (select distinct uid from T where id>@lastId)--说明@lastId是上次清理时的最大id

#35


建议去看一下QQ空间的访客是怎么做的,和楼主要实现的功能应该是相同的

#36


新人报道,来跟各位学习学习。

#37


应该是在两件商品之间建立一种联系,假设是A商品和B商品,这种联系是顾客从A商品浏览后是否直接跳转浏览B商品,而统计这种联系的就用一个整形数据类型的字段(假设是count)来概括,如果顾客在A与B之间建立了联系(即用户浏览A后直接跳转浏览B),那么count加1.你也可以在这些前提下设置一个条件,如count必须大于多少时才显示B:"浏览A商品的顾客还浏览过B,...".数据库可以这样建:

ID 主键
firstGoodsID 形如A商品的ID
secondGoodsID 形如B商品的ID
count 统计字段

#38


搞错了,应该是表可以那样建!

#39


引用楼主 luoxinabc12345 的帖子:
我做了一个网站,上面有好多商品,每一个商品就是一个页面,我现在需要在每个商品的下面显示浏览过这个商品的用户还浏览过其他商品! 
显示出来8个就行! 
而且要实时的现实数据! 
我需要怎么做! 
我个人认为这个问题看似简单其实不简单! 
因为如果有百万人浏览百万个商品,那要怎么记录这个数据? 

或者不记录,那应该咋们处理呢?

对题目还有点不是很理解,感觉有点歧义:
我现在需要在每个商品的下面 显示浏览过这个商品的用户还浏览过其他商品! 
我有如下两种理解:
先定义一个词:用户浏览集---一个用户浏览过的所有商品的集合

理解1:你要是显示的商品只属于一个用户浏览集
理解2:你要显示的商品属于所有用户浏览集的集合

不过,不论哪种理解,觉得解决方法差不多,个人愚见如下:
建议在商品的表结构中增加一个字段:浏览过的用户集,来存放所有浏览过该商品的用户ID,
在用户的表结构中增加一个字段:浏览过的商品集合,来存放该用户浏览过的商品的ID。

如果按理解1,则解决方法如下:
从该商品浏览用户中随机取一个用户ID,然后,再显示改用户所浏览过的8种商品。

如果按理解2,则解决方法如下:
则浏览过该商品的所有用户的ID都取出来,然后根据这些用户ID,一一取出他们所浏览过的商品的ID,显示8种商品。

#40


呵呵!我觉得是我没把问题描述清楚!让大家走了弯路!

其实我就要迅雷看看那个效果!

就是和迅雷看看的那个“看过该片的人还看过”一个效果!




#41


.....

#42


只能说拿分。,晕死

#43


.

#44


mark

#45


session应该不行吧!

#46


session是不可能的 这种数据要么放到库中 要么放到APPLIACTION中

#47


数据仓库?

#48


用 j2EE做 连接数据库  然后做分页 再进行判断,
在分页上可以按一定的顺序排列!

#49


up

#50


学习了,帮顶。

#1


我试图通过当客户每浏览一个就往数据库或者文件写入一次的办法,但是都不行!考虑到性能和速度!

#2


首先你得有个浏览记录表:

主键(id)
商品ID(s_id)
用户ID(u_id)
浏览时间...等参数

显示8条这个不难吧? 不用说了吧 直接select top(8) from 浏览表 order by 浏览时间 desc 取出最新的8条

至于你的实时显示这个好像很少有网站这样做 迅雷在线影视有个你观看记录也不是实时的 对以http协议要实现实时可能性能会消耗
如果你非得做可以考虑一下dwr的方向ajax和用ajax定时去刷新浏览记录

至于你说你有上百万记录 这个你得考虑做数据库和程序的集群了!

#3


up!!~

#4


这个放入session中不行吗?
跟购物车很像,可以先创建一个空的购物车,每浏览一页就自动把商品放入到此购物车中,并且取session中的值。
如果重复,你判断一下,该怎么显示。

#5


用ArrayList装载客户浏览的商品
把ArrayList放到session中

愚见
不知道是否可行

#6


我觉得可以放入到session中

#7


放在服务器端就用session,放在客户端就用cookie

#8


该回复于2009-07-18 00:18:55被版主删除

#9


引用 4 楼 zhong19860904 的回复:
这个放入session中不行吗? 
跟购物车很像,可以先创建一个空的购物车,每浏览一页就自动把商品放入到此购物车中,并且取session中的值。 
如果重复,你判断一下,该怎么显示。 

我也是想到了Session,只有8个商品,数据量又不大,没必要走到数据库层

#10


2楼的方案还可行,用session不太好吧。估计你的频繁操作session。

#11


二楼朋友:
应该是
商品主键对应商品主键吧!
关系是1个对应8个的。

因为是浏览过这个商品的所有用户还浏览过那些商品!


所以是商品底下显示的是商品!


如果插入数据库,那将是一个庞大的数据流!
例如有商品 1, 2, 3,4,5,6,7,8,9
有一个用户把这九个都浏览了!

商品1到9的每个页面上应该显示
于自己不同的其他8个


我说的百万有些夸大了!呵呵!

#12


那就走cookie吧

#13


我仔细考虑了一下不管是数据库还是session 都很消耗资源!

我想到当用户session创建了以后就开始记录他浏览过的商品,
只记录商品ID然后当session销毁的时候把这些ID再进行整理进行物理存储

#14


cookie 是客户端的!这个貌似行不通!
数据要保留在服务端的!
这样方便下一个用户一进来就很直观的能看到这个商品
底下的一些商品!


我刚才说的那个方法现在还是存在问题!呵呵!
这个问题是个弯弯绕的问题!

看来大家这么有热情我这就去给帖子加分!

#15



不好意思!
呵呵

发帖一天后太刻意加分的!

#16


你只显示8条。那就按浏览时间排序最近的8条吧,那么表中只保留一段时间数据就足够了

#17


我觉得用这种方式用cookie在客户端先记录好当前浏览了哪些产品,以及次数
在退出你网站的时候把客户端cookie存的数据返回服务器并消灭当前cookie
服务端创建session对象获取用户传过来的商品ID+次数
隔一定的时间来执行sql语句更新数据库
服务端你产品表里面搞张对应表 增加个字段
这样做对服务端应该说压力不大
 

#18


没必要做时时交互,可以半自动呵呵

#19


关注

#20


用session.

#21


引用楼主 luoxinabc12345 的帖子:
我做了一个网站,上面有好多商品,每一个商品就是一个页面,我现在需要在每个商品的下面显示浏览过这个商品的用户还浏览过其他商品! 
显示出来8个就行! 
而且要实时的现实数据! 
我需要怎么做! 
我个人认为这个问题看似简单其实不简单! 
因为如果有百万人浏览百万个商品,那要怎么记录这个数据? 

或者不记录,那应该咋们处理呢?


如果通过数据库的话 那么只能在该商品表里加个关联表 记录该商品的友好商品信息 当然 友好商品信息是随时可以更换的(根据用户的浏览)

LZ想要实时的数据 那样的话貌似每个用户来都得进行一次记录 那么 说下我的个人建议吧:

一个商品对应16个友好商品 关联表的字段只有两个 一个是友好商品的ID 一个是该友好商品的点击次数 排序根据点击次数排出前8条记录显示在前台 至于剩下那八条 则是为了让该商品动态的替换而留的 每次有一个浏览过该商品又浏览了其他商品的情况出现 都会进行更新(正常情况下商品表里最好也加个查看次数) 如果两条友好商品的查看次数都是1 那我们根据该商品的查看次数决定他的去留(不是在关联表里的查看次数 而是商品表的查看次数 这里LZ也可以适当的变通一下 比如  根据时间比较 或者是其他的什么)



-------------------------------------------------------------------------------------------------------------

第二种方案(如果您能看到这里那我很感激你...)

这个方案实际上很简单 效率上也很好 就是每个商品加一个类别和一个点击查看次数 每点商品一次就增加查看次数一次 友好商品列表里就输出前8个 或者 根据你所点的商品的点击次数 来获得友好商品的点击次数(比如该商品点击次数为5 那么可以根据5来获得一个范围 就点击次数5到10的 因为一般点击次数比较少的话 说明曾经有个用户浏览了所有的商品...当然 猜测而已)

用这个方法最大的好处就是效率 而且比较好实现(虽然看起来只是获得点击次数高的商品记录...但是如果用范围的获取方法 那么效果说不定会有些...)


累死偶咯 偶的回答如果帮不上您的忙的话.... 总之 我尽力了 后面的帮顶啊! 

#22


另外 如果不想通过更新数据库的方式来获得的话 还有一种办法 就是appliaction 当用户点击某样商品的时候 同时更新APPLIACTION里的关于该商品的点击信息(APPLIACTION里放该商品的类别和点击次数) 这个方法也比较简单

#23


引用 22 楼 BearKin 的回复:
另外 如果不想通过更新数据库的方式来获得的话 还有一种办法 就是appliaction 当用户点击某样商品的时候 同时更新APPLIACTION里的关于该商品的点击信息(APPLIACTION里放该商品的类别和点击次数) 这个方法也比较简单


补充下: 所谓的用户我觉得只是一个不存在的东西 如果说LZ一定要坚持查看某些用户浏览过的商品的话 那么每个商品难道都要加个最近浏览用户的表表? 每个用户都有个最近浏览商品的表表?期待高人解答

#24


理解不了,不知道如何实现啊

#25


楼主没有给用户提供他近期浏览过的商品的情况吗  如果这样但就关联商品表恐怕不行吧  这个效果似乎和xunleikankan里面的一样

#26


就是和迅雷看看的那个“最近浏览过的大片”一个效果!

#27


引用 24 楼 leongod 的回复:
理解不了,不知道如何实现啊

!

#28




就是和迅雷看看的那个“看过该片的人还看过”一个效果! 

#29


21楼的朋友:
真是太感谢你了!
你说的很有道理!我尝试去做一下!
说不定会碰到一些新的问题!
还需要再来请教你!


说真的!这个问题真不简单那!

希望后来的朋友能提出更好的建议,和自己的见解!

期待中!!!

明天给该贴加分!!!

#30


学习下 我也不会 呵呵

#31


小弟的建議是使用DB

step 1.
開一個Table 紀錄 memberid和 bookid,

step 2.
寫一個SQL procedure 一天跑一次
ex. 
insert into book_browser(memberid, bookid, cnt)
select bookid,memberid,count(*) as cnt
from book_browser_record
group by bookid,memmberid
order by bookid, count(*)

step 3.
select top 8 memberid from book_browser where bookid =?

#32


cookie是肯定不能用的,cookie可以是用于之前自己浏览过哪些商品
session也是不能用的,session是会爆的,一般都只用来存用户信息,不然什么都塞,哪吃的消。
关键是数据库的表结构设计,以及性能的优化,或者做缓存,但是要设计一个良好的更新数据方案。
只是有一点,是一定要存DB的,然后定时同步DB和缓存,不然服务重启,你记录啥都没有。DB读取要到哪个频繁度,这个都是要具体考虑的。
你做一个商品对应客户的一对多,还是多对多表都没关系,因为这个一定不是实时的。
一个用户的浏览记录都存进去,可以先放缓存,再定时读缓存到DB,然后做一个分析的线程,可以在凌晨做一次,或者一天中午一次,晚上一次这样子,调用成堆的sql语句也好,一个存储过程也好,把数据分析好存到一张表,这个表的结果是很明了的,一条简单的sql语句就能实现查询要求的那种。具体是基于商品分析客户,还是基于客户分析商品,这个看你需求,你的侧重点究竟是在哪里,因为看过这个商品的其他用户不可能只有一个,你是取谁的8个,还是取平均量的8个,重复了怎么办,等等

#33


我觉得还是session还可以
记录到数据库不现实
因为这是一个意义不大的功能
如果要记录到数据库,时间一长,数据积攒将非常大
而且不停的连接数据库对程序的运行效率影响比较大
建议还是用session吧

#34


表格结构,id自增:T(id,uid,pid)
查询,应该针对产品做短时间缓存:select top 8 distinct pid from T where uid in (select uid from T where pid=@pid) and pid<>@pid order by id desc
定时清理:delete T where id<(select top 1 id from (select top 9 id from T as t1 where uid=T.uid order by id desc) as t2 order by id)
如果定时时间段内的用户量比较小于用户总数的一半时加条件:uid in (select distinct uid from T where id>@lastId)--说明@lastId是上次清理时的最大id

#35


建议去看一下QQ空间的访客是怎么做的,和楼主要实现的功能应该是相同的

#36


新人报道,来跟各位学习学习。

#37


应该是在两件商品之间建立一种联系,假设是A商品和B商品,这种联系是顾客从A商品浏览后是否直接跳转浏览B商品,而统计这种联系的就用一个整形数据类型的字段(假设是count)来概括,如果顾客在A与B之间建立了联系(即用户浏览A后直接跳转浏览B),那么count加1.你也可以在这些前提下设置一个条件,如count必须大于多少时才显示B:"浏览A商品的顾客还浏览过B,...".数据库可以这样建:

ID 主键
firstGoodsID 形如A商品的ID
secondGoodsID 形如B商品的ID
count 统计字段

#38


搞错了,应该是表可以那样建!

#39


引用楼主 luoxinabc12345 的帖子:
我做了一个网站,上面有好多商品,每一个商品就是一个页面,我现在需要在每个商品的下面显示浏览过这个商品的用户还浏览过其他商品! 
显示出来8个就行! 
而且要实时的现实数据! 
我需要怎么做! 
我个人认为这个问题看似简单其实不简单! 
因为如果有百万人浏览百万个商品,那要怎么记录这个数据? 

或者不记录,那应该咋们处理呢?

对题目还有点不是很理解,感觉有点歧义:
我现在需要在每个商品的下面 显示浏览过这个商品的用户还浏览过其他商品! 
我有如下两种理解:
先定义一个词:用户浏览集---一个用户浏览过的所有商品的集合

理解1:你要是显示的商品只属于一个用户浏览集
理解2:你要显示的商品属于所有用户浏览集的集合

不过,不论哪种理解,觉得解决方法差不多,个人愚见如下:
建议在商品的表结构中增加一个字段:浏览过的用户集,来存放所有浏览过该商品的用户ID,
在用户的表结构中增加一个字段:浏览过的商品集合,来存放该用户浏览过的商品的ID。

如果按理解1,则解决方法如下:
从该商品浏览用户中随机取一个用户ID,然后,再显示改用户所浏览过的8种商品。

如果按理解2,则解决方法如下:
则浏览过该商品的所有用户的ID都取出来,然后根据这些用户ID,一一取出他们所浏览过的商品的ID,显示8种商品。

#40


呵呵!我觉得是我没把问题描述清楚!让大家走了弯路!

其实我就要迅雷看看那个效果!

就是和迅雷看看的那个“看过该片的人还看过”一个效果!




#41


.....

#42


只能说拿分。,晕死

#43


.

#44


mark

#45


session应该不行吧!

#46


session是不可能的 这种数据要么放到库中 要么放到APPLIACTION中

#47


数据仓库?

#48


用 j2EE做 连接数据库  然后做分页 再进行判断,
在分页上可以按一定的顺序排列!

#49


up

#50


学习了,帮顶。