要求:定义一个web服务器,帮我们计算阶乘。服务器会提供缓存,已经计算过的就存起来,下次直接读取。
定义阶乘服务对象
class factserver():
def __init__(self):
self.catch={} #字典记录已经计算过的阶乘
def catc(self,n): #计算阶乘
if n in self.catch: #已存在时,直接返回
return self.catch[n]
s=1
for i in range(1,n):
s*=i
self.catch[n]=s #记录计算结果
return s
定义hander业务逻辑
class facthander(tornado.web.RequestHandler):
fact = factserver() # 实例化一个服务对象
def get(self):
n=int(self.get_argument('n')) #获取url中的参数n
self.write(str(self.fact.catc(n))) #使用阶乘服务
使用服务时,不可以直接write(self.fact.catc(n)),需要转化成字符串,否则会提示错误。
注册路由
def make_app():
return tornado.web.Application([(r'/fact',facthander)])
结果展示:
弊端:
在本地另起一个新端口,访问服务,需重新计算阶乘。
因为:本地内存无法跨进程或跨机器共享。
redis优化
用hash结构存储计算结果,并返回一个标志布尔值,代表是否被存储过
class factserver():
def __init__(self):
# self.catch={} #字典记录已经计算过的阶乘
self.catch=redis.StrictRedis('localhost',6379) #用redis缓存
self.key='factresult'
def catc(self,n): #计算阶乘
if self.catch.hexists(self.key,str(n)): #查看n在字段是否已存在
return str(self.catch.hget(self.key,str(n))),True
s=1
for i in range(1,n):
s*=i
self.catch.hset(self.key,str(n),str(s)) #记录计算结果
return str(s),False
打印成json形式:
class facthander(tornado.web.RequestHandler):
fact = factserver() # 实例化一个服务对象
def get(self):
n = int(self.get_argument('n')) # 获取url中的参数n
result,catch=self.fact.catc(n)
ppp={
'n':n,
'result':result,
'catch':catch
}
self.set_header('Content_Type','application/json;charset=utf-8')
self.write(json.dumps(ppp))
结果展示:
存储过的:
未存储过的