上述的漏斗限流算法,在Redis的模块中已经内置实现了一个,具体介绍请参见Github redis-cell详细介绍 笔者安装在MacOS上,基本没有问题:

# 下载mac版本安装包

https://github.com/brandur/redis-cell/releases

# 解压

tar -zxf redis-cell-*.tar.gz

# 复制可执行文件

cp libredis_cell.dylib /your_redis_server_localtion

# 重启redis-server,把libredis_cell.dylib加载上

redis-server --loadmodule /path/to/modules/libredis_cell.dylib

1

2

3

4

5

6

7

8

安装重启后,可以在redis中执行 CL.THROTTLE 命令:

# CL.THROTTLE user123 15 30 60 1和实现算法中的配置类似,user123表示限流key,15: capacity,30: total,60: duration,

127.0.0.1:6379> CL.THROTTLE user123 15 30 60 1

1) (integer) 0 # 0表示允许,1表示拒绝

2) (integer) 16 # 漏斗容量 max_burst + 1 = 15 +1 =16

3) (integer) 15 # 漏斗剩余容量

4) (integer) -1 # 如果被拒绝,多少秒后重试

5) (integer) 2 # 多长时间后漏斗完全漏空

1

2

3

4

5

6

7

但是redis-cell没有找到对应的sdk

Python Bound method

# python 3.x

def func():

pass

class A:

@classmethod

def method_cls(cls):

pass

def method_a(self):

pass

class B(A):

pass

a, b = A(), B()

print(func) # <function func at 0x10ee8a1e0>

print(a.method_a) # <bound method A.method_a of <__main__.A object at 0x10ef11978>>

print(b.method_cls) # <bound method A.method_cls of <class '__main__.B'>>

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

对于上文中 func就是一个函数对象,而method_a 和 method_cls 是归属类A的所以,是一个bound method,那么如何查看一个 bound method的归属呢?

Python 2.x中提供了 im_func,im_class,im_self三个属性:

im_func is the function object.

im_class is the class the method comes from.

im_self is the self object the method is bound to.

Python3.x中

__func__ replace im_func

__self__ replace im_self

2.x中的 im_class取消

# python 3.x

print(a.method_a.__self__)

print(b.method_cls.__self__)

# print(func.__self__) error func 无 __self__

print(b.method_cls.__self__.__name__)

# print(b.method_cls.__self__.__name__) error b.method_cls.__self__是一个实例,无__name__属性

1

2

3

4

5

6

关于 __name__ 和 __qualname__ 请参见 PEP 3155

————————————————