【问题标题】:What is the best way to store ip addresses in application?在应用程序中存储 IP 地址的最佳方式是什么?
【发布时间】:2012-07-26 05:58:52
【问题描述】:

我正在开发一个基于 Spring 和 JSF 2.0 的应用程序。需要记住在过去 3 分钟内来自特定 IP 地址的客户端尝试提交表单的次数。如果在 3 分钟内记录了超过 3 次提交尝试,则应显示验证码。

我正在考虑使用 ConcurrentMap<String, ConcurrentLinkedQueue<Long>> 存储 IP 地址 (String) 并在队列 (ConcurrentLinkedQueue<Long>) 中提交时间 (milis)。 Quartz 将每隔 3 分钟清理一次队列(超过 3 分钟的 milis 将被删除)。要检查是否显示验证码,我将检查队列大小是否 > 3。

这是正确的方法吗?你有更好的想法吗?

【问题讨论】:

  • 是否需要按 IP 范围搜索?

标签: java spring jsf-2


【解决方案1】:

Java 提供了一个特殊的类来存储 IP 地址:java.net.InetAddress。与Long 不同,它除了可以处理 32 位地址之外,还能够处理 128 位地址,并且就它使用的内存而言,它不像String 那样浪费,这在非常高的应用中可能变得很重要。音量情况。

【讨论】:

  • 好的,在 ConcurrentLinkedQueue 中存储提交时间并由 Quartz 每隔 3 分钟清理一次的概念怎么样,可以吗?
  • @michal777 不,您应该每分钟清理一次,而不是每三分钟清理一次。考虑一下:在清理作业运行时,您有一个两分钟前的请求,该请求保留在队列中。再过两分钟,该请求将保留在队列中,即使它现在已有四分钟了。除了检查队列大小是否大于 3 之外,另一种方法是测试队列中项目的年龄。
【解决方案2】:

就我个人而言,我将我的 IP 存储为 Longs 而不是 Strings。

您将看到性能提升。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-14
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-20
    相关资源
    最近更新 更多