(面试题)Redis实现 IP 维度滑动窗口限流实践
引言在开发高并发系统时,限流是一个绕不开的话题。无论是为了保护后端服务不被突发流量打垮,还是为了防爬虫、防恶意攻击,限流都是最常用的手段之一。常见的限流算法有计数器(固定窗口)、滑动窗口、漏桶、令牌桶等。今天我们就来聊一聊如何用 Redis 的有序集合(ZSET)实现一个滑动窗口限流,并以 IP 维度限制 60 秒内最多 100 次请求为例,给出完整的设计思路和代码。
需求描述假设我们有一个公开的 API,需要根据调用方的 IP 地址进行限流:
任意时刻向前推 60 秒(滑动窗口)
同一个 IP 最多允许 100 次请求
这里强调”任意时刻”,意味着我们不能用固定时间窗口(比如每分钟重置一次),因为固定窗口在边界处可能允许瞬间两倍的流量。比如:
12:30:59 请求了 100 次
12:31:00 又请求了 100 次
那么在 12:30:30 ~ 12:31:30 这 60 秒内,实际发生了 200 次请求,显然违背了我们的限制。所以必须用滑动窗口来精确控制。
为什么不用 INCR 做固定窗口?很多初学者会想到用 Redis 的 INCR 配合过期时间来实现限流:
12IN ...
PaddlePaddle 飞桨实现GAN生成对抗网络生成MINIST手写数字图像
1234import paddlefrom paddle.nn import Conv2D, MaxPool2D, Linear, BatchNorm, Upsampleimport numpy as npimport matplotlib.pyplot as plt
1234train_reader = paddle.vision.datasets.MNIST(mode='train')print("训练集样本数:", len(train_reader))print("样本形状:", np.array(train_reader[0][0]).shape)print("标签形状:", np.array(train_reader[0][1]).shape)
123训练集样本数: 60000样本形状: (28, 28)标签形状: (1,)
1234567891011121314151617181920# 噪声维度Z_DIM = 100BATCH_SIZE = 128paddle.vision.set_im ...
别玩手机 图像分类比赛
浙大宁波理工学院数据科学与大数据专业 别玩手机图像分类比赛
1 选手禁止互相抄袭,发现结果雷同者将取消成绩;
2 请在基线模型基础上修改代码,不允许使用第三方封装库、套件或者其他工具,否则做 0 分处理;
3 每位同学请独立完成比赛,不允许就比赛技术问题进行相互交流,更不允许索要代码,请自觉遵守规则,保持良好的品格;
4 晚上 12:00 以后不允许递交,否则做 0 分处理;
5 结果文件必须是程序生成,不允许手动修改或者后期处理。
赛题背景如今,手机已成为大众离不开的生活工具,而且它的迅速发展使得它的功能不再以通讯为主,手机逐渐发展为可移动的大众传播媒体终端设备,甚至可以比作为第五媒体。当今的大学生群体是智能手机使用者中的一支巨大的的队伍,零零后大学生在进入大学以来,学习生活中过度的依赖手机,甚至上课时忘记携带手机便会手足无措,神情恍惚。本比赛要求通过监控摄像头等拍摄到的画面判断画面中的人物是否正在使用手机
数据集介绍本比赛采用的数据集中,训练集共 2180 张使用手机的图片(位于目录 data/data146247/train/0_phone ...
解决PaddlePaddle飞桨在迁移学习使用预训练模型时更改num_classes参数出现警告
当我们使用 PaddlePaddle 进行迁移学习的时候,直接导入模型虽然是可以的,但是总是会有个警告
如直接用官方的 resnet101 并加载预训练模型的话
1model = paddle.vision.models.resnet101(pretrained=True, num_classes=2)
会提示这些信息:
1234567model = paddle.vision.models.resnet101(pretrained=True, num_classes=2)W0508 14:42:41.530314 1313 device_context.cc:447] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1W0508 14:42:41.535259 1313 device_context.cc:465] device: 0, cuDNN Version: 7.6./opt/conda/envs/python35 ...
PaddlePaddle 自动求导
自动求导在 PaddlePaddle 中使用自动求导来计算导数。
要求:,绘制 和 的图像,不能使用
in[1]
12345678910111213141516import paddleimport numpy as npimport matplotlib.pyplot as plt%matplotlib inlinex = paddle.to_tensor(np.arange(-5, 5, 0.01), dtype="float32", stop_gradient=False)y = paddle.sin(x)paddle.autograd.backward(y)dydx = x.gradx, y, dydxplt.plot(x, y)plt.plot(x, dydx)plt.show()
output[1]
APIbackwardpaddle.autograd.backward(tensors, grad_tensors=None, retain_graph=False)
计算给定的 Tensors 的反向梯度。
参数
tensors (list[Te ...