`
Deo
  • 浏览: 32190 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Redis实现访问频率控制

阅读更多

    现在系统中由于各种需要,经常遇到一种场景:需要限定每个IP地址每分钟最大访问次数类似的需求。下面是使用Redis实现范文频率限制的一种方式。

    场景:要限制每分钟每个用户最多只能访问100个页面。

    思路:1. 对每个用户使用一个名为“rate.limiting:用户IP”的字符串类型键;

               2. 每次用户访问,使用INCR命令递增该键的键值

               3. 如果递增后的值是1(第一次访问页面),则同时还要设置该键的生存时间为1分钟

               4. 这样每次访问页面时都读取该键的键值,如果超过了100就表明该用户的访问频率超过了限制

               PS:该键每分钟会自动被删除,所以下一分钟用户的访问次数又会重新计算,这样就达到了限制访问频率的目的。

 

    上述流程的伪代码如下:

$isKeyExists = EXISTS rate.limiting:$IP
if $isKeyExists is 1
    $times = INCR rate.limiting:$IP
    if $times > 100
        print 访问频率超过了限制,请稍后再试
        exit
else
    INCR rate.limiting:$IP
    EXPIRE $keyName, 60

 

    上面的这段代码存在一个不太明显的问题:加入程序执行完倒数第二行后,因为某种原因突然退出了,没能够为该键值设置生存时间,那么该键会永久存在,导致使用对应IP的用户最多只能访问系统100次,除非管理员手动删除该键。这是一个很严重的问题,但是可以结合Redis的事务功能解决该问题,修改后的伪代码如下:

$isKeyExists = EXISTS rate.limiting:$IP
if $isKeyExists is 1
    $times = INCR rate.limiting:$IP
    if $times > 100 
elsee
    EXPIRE $keyName, 60
    EXEC

 

    访问频率限制到此基本上已经实现,但是仍然有细节地方可以改进。

    场景:一个用户在1分钟的第1秒访问了1次系统,在同一分钟的最后1秒访问了99次;又在下一分钟的第一秒访问了100次系统,这种情况用户实际上在2秒内访问了199次系统,这与每个用户每分钟只能访问100次的限制的差距较大。

        尽管这种情况比较极端,但是在一些场合中还是需要粒度更小的控制方案。

    问题解决思路:如果要精确的保证每分钟最多访问100次,需要记录下每次访问的时间。因此对每个用户,我们使用一个列表类型的键来记录他最近100次访问时间,一旦键中的元素超过100个,就判断时间最早的元素距离现在的时间是否小于1分钟。如果是则表示最近1分钟内的访问次数超过了100次;如果不是就讲现在的时间加入到列表中,同时把最早的元素删除。

    上述流程的伪代码如下:

$listLength = LLEN rate.limiting:$IP
if $listLength < 100
    LPUSH rate.limiting:$IP, now()
else
    $time = LINDEX rate.limiting:$IP, -1
    if now() - $time < 60
        print 访问频率超过了限制,请稍后再试
    else
        LPUSH rate.limiting:$IP, now()
        LTRIM rate.limiting:$IP, 0, 99

    上述代码中用now()函数获得当前的Unix时间。由于需要记录每次访问的时间,所以当要限制“单位时间最多访问N次” 时,如果N的数值越大,此方法占用的存储空间就越多,实际使用时还需要开发者自己去权衡。除此之外,该方法也会出现竞态条件,使用时请注意。

 

 

 

 

 

 

分享到:
评论

相关推荐

    《Redis设计和实现 黄建宏著》配套 Redis 3.0 中文注释版源码

    7. LRU(最近最少使用)和LFU(最不经常使用)驱逐策略:为了控制内存使用,Redis提供了根据访问频率或时间来淘汰过期键的策略。 8. 集群模式:虽然集群功能在Redis 3.0之前就已经引入,但在这个版本中进一步完善,...

    mybatis+redis实现二级缓存

    它支持丰富的数据结构如字符串、哈希表、列表、集合和有序集合,适合存储临时性的、高访问频率的数据。将MyBatis的二级缓存与Redis相结合,可以利用Redis的高速读写能力,提高应用的响应速度。 项目集成Redis的过程...

    SpringBoot 接口访问频率限制(一)

    本文将深入探讨如何在Spring Boot应用中实现接口访问频率限制。 Spring Boot是Java生态中的一个流行框架,它简化了创建独立、生产级别的基于Spring的应用程序。当我们谈论"频率控制代码",通常是指一种策略,即限制...

    redis百万并发访问数据库测试

    由于其数据结构丰富、响应速度快,处理高并发访问能力出色,因此在互联网行业中广泛应用于解决大数据量、高访问频率的问题。 在"redis百万并发访问数据库测试"中,我们关注的核心知识点主要包括以下几个方面: 1. ...

    Redis缓存url访问次数(SpringBoot拦截器)

    这个技术方案通常用于网站性能优化,通过记录和分析访问频率,可以优化热点数据的处理,减轻数据库压力。 首先,我们需要理解SpringBoot的核心特性。SpringBoot是Spring框架的一个简化版,它内置了Tomcat服务器,...

    redis-5.0.8

    此外,Redis 5.0 还引入了 LRU(Least Recently Used)算法的替代方案,称为 LFU(Less Frequently Used),可以根据项的访问频率来决定何时进行缓存淘汰,从而更好地适应动态变化的工作负载。 在集群方面,Redis ...

    tomcat-redis依赖jar包

    常见的策略有基于时间的过期、基于访问频率的缓存等。 - 缓存失效:当数据库数据发生变化时,需要同步更新Redis中的缓存,可以使用监听模式或主动刷新策略。 - 分布式锁:在多线程或多服务器环境下,Redis可以作为...

    redismanger连接redis工具

    对于有权限控制需求的用户,Redis Manager支持配置访问控制,确保只有授权的用户才能进行特定的操作。 9. **多语言支持**: 考虑到全球用户的使用习惯,该工具通常提供多种语言界面,包括中文,使得非英语用户也...

    Redis 6.2.6安装包

    3. ACL(访问控制列表)增强:6.2.6版本增强了用户权限管理,提供了更细粒度的访问控制,允许管理员精确地定义每个用户可执行的操作。 4. LRU算法优化:Redis采用LRU(最近最少使用)策略进行内存管理,新版本对这...

    Django REST framework 如何实现内置访问频率控制

    下面将详细介绍如何在DRF项目中实现访问频率控制。 #### 1. 理解访问频率控制的基本概念 访问频率控制是指限制客户端在一个特定时间窗口内向服务器发送请求的次数。这种限制可以通过多种方式实现,例如基于IP地址...

    超详细Redis数据库入门教程.docx

    Redis 配置可以配置密码和访问控制。 Redis 配置 – 限制 Redis 配置可以配置最大内存和连接数。 Redis 配置 – 追加模式 Redis 配置可以配置追加模式的方式。 Redis 配置 – LUA 脚本 Redis 配置可以配置 LUA ...

    Redis--工具

    7. **限流**:Redis可以用来进行速率限制,控制服务的访问频率。 Redis Desktop Manager作为一款Redis客户端,主要特点有: 1. **多服务器管理**:用户可以在同一界面下管理多个Redis服务器,方便切换和对比。 2. *...

    Redis 6.0的Windows版本(64位)

    2. **ACL (Access Control Lists)**: Redis 6.0新增了细粒度的权限控制,通过ACL可以更安全地管理不同用户的访问权限,增强了系统的安全性。 3. **模块系统增强**: Redis 6.0的模块系统得到了加强,使得开发人员...

    redis官网最新客户端

    10. **安全设置**:客户端也可能包含管理Redis服务器认证和授权的功能,比如设置和修改密码、管理访问控制列表。 综上所述,"redis官网最新客户端"提供了全面的Redis操作功能,不仅便于日常的数据操作,还为开发和...

    redis-server:5.0.14.1 windows版本

    3. **安全考虑**: 由于Redis默认是不安全的,建议在生产环境中使用时配置密码认证和访问控制,避免未授权访问。 4. **监控和性能调优**: 使用工具定期检查Redis的性能指标,如内存使用情况、命令执行速率等,以便...

    redis桌面管理工具

    同时,通过设置访问控制,可以确保只有授权的用户才能对Redis服务器进行操作。 总之,"redis桌面管理工具"是开发和运维人员的得力助手,它简化了Redis的日常管理工作,提高了数据管理的效率,同时也是排查问题和...

    60道关于Redis的常见面试题.pdf

    - **LFU**:适用于数据访问频率差异较大的场景。 - **TTL**:适用于数据过期时间固定的场景。 #### 24. Redis 的持久化方式有哪些优点和缺点?你在项目中如何选择适合的持久化方式? - **选择依据**: - **RDB*...

    Redis使用实例

    - **限流**:通过限制某个键的请求频率,实现流量控制,防止DDoS攻击。 解压后的"Redis实例"文件应包含示例代码,你可以参考这些代码了解如何在实际项目中使用Redis。学习和理解这些实例,将有助于你更高效地利用...

Global site tag (gtag.js) - Google Analytics