ASP.NET 求文章自动到期后自动取消置顶技术方案

时间:2021-02-12 13:21:01
置顶字段 :toTop, startTime, endTime

设置置顶,toTop 为1 ,到期为0,endTime 为null

各位大咖觉得用哪个方案实现比较好,SQL作业,还是JQUERY 定时扫描,最好是能减少资源占用的方案

14 个解决方案

#1


windows计划任务

#2


为什么要用作业 扫描  你不是有一个结束时间么,为什么不能用两个字段去控制 ASP.NET 求文章自动到期后自动取消置顶技术方案

#3


至于你后续的数据更改  用SQL作业或者一个后台的同步服务不就行了啊 不牵扯Jquery定时扫描吧 ASP.NET 求文章自动到期后自动取消置顶技术方案

#4




引用 3 楼 woainixinxin521 的回复:
至于你后续的数据更改  用SQL作业或者一个后台的同步服务不就行了啊 不牵扯Jquery定时扫描吧 ASP.NET 求文章自动到期后自动取消置顶技术方案


谢谢大咖们的帮助!
置顶是可以成功的,就是到期不知采用哪个方式最佳

SQL作业没用过,同步服务是怎样,有代码或者案例分享下吗

#5


不一定用作业,就是能自动恢复endTime = null 就好,不占资源的

#6


额,你又不是要生成静态页面
所以这个东西随取随用就行,过期了就过期没人访问谁也看不见,有人访问了,把数据库update一下就成(也不用每次访问更新,1天更新一次就够)

#7


你可以在前端页面展示这样的一个列表时,异步地去通知一下服务器端来判断。这个不需要在服务器端搞什么“计划任务”。

而在服务器端,会将“某个版面最后一次判断置顶帖子”的时间放到数据 Cache 中(设置 Duration 为 10分钟),也就是说首先从缓存中查询有没有这个时间记录,如果有则不去真的去处理(也就不访问数据库)。

#8


例如,你可以写一个查询方法
private List<文章> 获取置顶文章列表(string 栏目)
{
    var cache = HttpRuntime.Cache;
    var key = string.Format("栏目_{0}_的置顶文章列表", 栏目);
    var res = (List<文章>)cache[key];
    if (res == null)
    {
        res = 查询数据库返回置顶文章列表(栏目);
        cache.Insert(key, res, null, DateTime.Now.AddMinutes(10), Cache.NoSlidingExpiration);
    }
    return res;
}
这里,只有当缓存里没有置顶文章列表时,才会真正去数据库查询。而去数据库查询时,那个方法中,会首先将那些过期的文章的字段改掉(改为不置顶的)。

因此假设在10分钟内有5万个请求,并不会读取数据库,而是都是直接拿缓存结果输出。当缓存过期,就会自动去修改数据库。

而这个输出的 res,可以序列化为 json 格式,返回给前端页面。例如页面上使用 ajax.get 方式读取这样一个文章里列表 js 对象集合,并且自动插入到文章列表的顶部,都可以异步完成。在加载页面之后再瞬间地加载文章置顶,并不会“卡”页面加载过程。

#9


哪里用得着jquery、定期作业啥的?
页面请求时:

if(当前时间>=文章置顶的过期时间)
    文章.置顶=false

#10


引用 9 楼 freeflying1222 的回复:
哪里用得着jquery、定期作业啥的?


lz 之所以能问出“哪个方案实现比较好,SQL作业,还是JQUERY 定时扫描”这样的问题,那么它的置顶文章列表接下来也不希望不断地、反复地去查询数据库。

#11


其实不去做批量计划任务设计,这可以!   但是同时要满足他希望能批量定时处理(而不是每一个请求都去查询数据库并且将过期的内容改掉)的需求

#12


引用 10 楼 sp1234 的回复:
Quote: 引用 9 楼 freeflying1222 的回复:

哪里用得着jquery、定期作业啥的?


lz 之所以能问出“哪个方案实现比较好,SQL作业,还是JQUERY 定时扫描”这样的问题,那么它的置顶文章列表接下来也不希望不断地、反复地去查询数据库。


这个得题主自己权衡了,做profile,看哪种效率更高。
我觉得一般来说,我的方案就够了。得到请求之后,反正都要去查的。

#13


谢谢大家的关注以及献计献策,问题已经解决,并发布上线

做法跟 @sp1234 朋友的建议那样,在具体的页面才触发事件,减少对数据库的访问,@freeflying1222朋友的建议也挺好的

#14


SQL作业+存储过程

#1


windows计划任务

#2


为什么要用作业 扫描  你不是有一个结束时间么,为什么不能用两个字段去控制 ASP.NET 求文章自动到期后自动取消置顶技术方案

#3


至于你后续的数据更改  用SQL作业或者一个后台的同步服务不就行了啊 不牵扯Jquery定时扫描吧 ASP.NET 求文章自动到期后自动取消置顶技术方案

#4




引用 3 楼 woainixinxin521 的回复:
至于你后续的数据更改  用SQL作业或者一个后台的同步服务不就行了啊 不牵扯Jquery定时扫描吧 ASP.NET 求文章自动到期后自动取消置顶技术方案


谢谢大咖们的帮助!
置顶是可以成功的,就是到期不知采用哪个方式最佳

SQL作业没用过,同步服务是怎样,有代码或者案例分享下吗

#5


不一定用作业,就是能自动恢复endTime = null 就好,不占资源的

#6


额,你又不是要生成静态页面
所以这个东西随取随用就行,过期了就过期没人访问谁也看不见,有人访问了,把数据库update一下就成(也不用每次访问更新,1天更新一次就够)

#7


你可以在前端页面展示这样的一个列表时,异步地去通知一下服务器端来判断。这个不需要在服务器端搞什么“计划任务”。

而在服务器端,会将“某个版面最后一次判断置顶帖子”的时间放到数据 Cache 中(设置 Duration 为 10分钟),也就是说首先从缓存中查询有没有这个时间记录,如果有则不去真的去处理(也就不访问数据库)。

#8


例如,你可以写一个查询方法
private List<文章> 获取置顶文章列表(string 栏目)
{
    var cache = HttpRuntime.Cache;
    var key = string.Format("栏目_{0}_的置顶文章列表", 栏目);
    var res = (List<文章>)cache[key];
    if (res == null)
    {
        res = 查询数据库返回置顶文章列表(栏目);
        cache.Insert(key, res, null, DateTime.Now.AddMinutes(10), Cache.NoSlidingExpiration);
    }
    return res;
}
这里,只有当缓存里没有置顶文章列表时,才会真正去数据库查询。而去数据库查询时,那个方法中,会首先将那些过期的文章的字段改掉(改为不置顶的)。

因此假设在10分钟内有5万个请求,并不会读取数据库,而是都是直接拿缓存结果输出。当缓存过期,就会自动去修改数据库。

而这个输出的 res,可以序列化为 json 格式,返回给前端页面。例如页面上使用 ajax.get 方式读取这样一个文章里列表 js 对象集合,并且自动插入到文章列表的顶部,都可以异步完成。在加载页面之后再瞬间地加载文章置顶,并不会“卡”页面加载过程。

#9


哪里用得着jquery、定期作业啥的?
页面请求时:

if(当前时间>=文章置顶的过期时间)
    文章.置顶=false

#10


引用 9 楼 freeflying1222 的回复:
哪里用得着jquery、定期作业啥的?


lz 之所以能问出“哪个方案实现比较好,SQL作业,还是JQUERY 定时扫描”这样的问题,那么它的置顶文章列表接下来也不希望不断地、反复地去查询数据库。

#11


其实不去做批量计划任务设计,这可以!   但是同时要满足他希望能批量定时处理(而不是每一个请求都去查询数据库并且将过期的内容改掉)的需求

#12


引用 10 楼 sp1234 的回复:
Quote: 引用 9 楼 freeflying1222 的回复:

哪里用得着jquery、定期作业啥的?


lz 之所以能问出“哪个方案实现比较好,SQL作业,还是JQUERY 定时扫描”这样的问题,那么它的置顶文章列表接下来也不希望不断地、反复地去查询数据库。


这个得题主自己权衡了,做profile,看哪种效率更高。
我觉得一般来说,我的方案就够了。得到请求之后,反正都要去查的。

#13


谢谢大家的关注以及献计献策,问题已经解决,并发布上线

做法跟 @sp1234 朋友的建议那样,在具体的页面才触发事件,减少对数据库的访问,@freeflying1222朋友的建议也挺好的

#14


SQL作业+存储过程