有一个不是项目问题的问题

高手们,能否指点一下,如何对用户发送消息条数和时间间隔进行判断,也就是说能否限制用户回复超过多少条之后,系统就不再对其服务,不然用户,使劲发消息,一个劲的查询,导致其他用户查询受阻。我的想法是存取用户的username 存起来,然后设置一个map 用户每发一次消息就更新一下这个map中对应的username的count值,然后根据count值的大小来做控制。不知道这样能不能行的通。请高手指点一二。

评论区

jiaoshuren

2016-07-24 18:13

现在想知道,将存储用户的这个map应该怎么存储。如果在jfinal启动之后,在afterjfinalstart 中初始化一个map,然后在 weixinmsgcontroller 中获取这个map,然后根据tousername来更新这个map,这样能行的通吗?

JFinal

2016-07-24 18:18

如果是要控制某个用户在某个时间段内发送的消息数量,给个简单的方案:
1:使用 jfinal 提供的 EhcachePlugin 插件,记录用户发送消息的数量

2:关键在于配置缓存的空闲时间,假定需要控制用户在 10 分钟内的发送总量
a:配置 timeToIdleSeconds = 600,表示该缓存空闲 10 分钟后会自动清除,所谓空闲是指缓存没有被使用过的时间段。在你的业务中,也即表示用户没有在发送消息的时间长度的过期时间
b:配置 timeToLiveSeconds = 0,表示缓存最大存活时间为无穷大,也即表示过期时间全部交给前面的 timeToIdelSencond 来控制

3:当用户发消息过来时,先用Integer msgCount = CacheKit.get("msgCount", userName) 获取到的是用户发送的消息总量,如果超出允许的消息数量,则阻止发送,
否则允许发送。

4:使用 CacheKit.put("msgCount", msgCount + 1) 将发送量加 1 并缓存,当 msgCount 为 null 时,取值为 0 即可。

5:此方案的好处是既控制了发送量,也兼顾了时间段控制,如果用户超过 10 分钟没有再发送,缓存会自动失效,又再重头记数。此方案还有一个好处是时间段是动态的,时间段总是与最近的空闲时间关联,而不是与过去某个固定的时间点关联,也控制了一直在发消息的行为

jiaoshuren

2016-07-26 01:34

@JFinal 非常感谢,正愁不知道怎么解决呢,明天起来研究一下,我暂时用数据库记录了

热门反馈

扫码入社