redis也提供事务,但是和传统的数据库有着一些区别。 事务 用MULTI开启事务,EXEC关闭事务。 redis的事务主要是保证命令要么执行,要么都不执行(原子性)。 其实就是把命令刚开始只是发送到远程,但是并没有运行,直到收到EXEC,把刚刚的所有命令都一次性运行。 在MULTI和EXEC中,如果过程中的代码出现了错误,将有2种可能的情况。 1.如果编译上的错误,那么所有命令都不会被执行。 2.如果是运行上的错误,那么除了错误的那条命令,其他所有命令都会被执行。 redis并没有提供回滚的函数。 通常可以考虑打日志,然后用业务来做到回滚。 所以我们可以发现,redis并不能太好的保证一致性,所以用redis来做强一致性的事情,本来就是非常不符合设计的! 乐观锁(WATCH) WATCH可以用来监视一个key。 监视之后,在之后出现的第一个事务中,如果这个key的值在这个事务外被修改了,那么执行EXEC时将失败。所以通常都会设置retry(注意这里redis没有自动回滚这套操作,所以可能要注意一点)。 其实WATCH就是一个乐观锁。在WATCH一个key时,会记录下这个key的版本号。 之后
发表于 2017-08-28 20:12:43 | 条评论 | 阅读次数:189
常常会有这样的验证问题: 一个post表单,虽然有的位置规定了是int,但是用户总是尝试自己发送post数据,来模拟实际情况。所以是不能相信用户的输入的,故我们需要在views层收到数据时,对数据进行检验和转换。 这里推荐marshmallow,非常的方便强大。 dict格式化成dict from marshmallow import Schema, fields, post_loadfrom marshmallow.validate import OneOf# required表示这个参数必须要有,然后会先转换对应的类型,再通过validate函数验证class UserLoginSchema(Schema): username = fields.String(required=True) # 如果不指定required, 默认为False password = fields.String(required=True, validate=lambda x: len(x) > 0) phone = fields.Method('get_prefix_phone_code')
发表于 2017-08-28 17:43:10 | 条评论 | 阅读次数:182
主要是一些基础函数的处理,如如何处理和区分未登录的用户,如何记录已经登录的信息(即session),如何实现长久保存账号登录,如何处理异常等一些flask框架的基础问题。 一个维护性可用性高的网站,需要建立在一个好的运行平台的基础之上~ 目录 .gitignore app初始化 返回处理和错误处理 manager管理 登录模块的处理 视图层 目录 /app/consts/ #用来存放常量/app/database/ #用来放数据库的表/app/celery/ #用来存放一些schedule的代码/app/models/ #model层/app/libs/ #封装比较关键的库/app/utils/ #一些类似工具的代码/app/views/ #view层/app/templates/ #偶尔也会存在一些模板/app/tests/ #单元测试/app/__init__.py #放app的初始化的内容/cmd/ #存放一些bash脚本,如网站启动的脚本等/scripts/ #日常维护的python脚本config.py #配置,通常在.gitignore中config_template.py
发表于 2017-08-25 14:52:12 | 条评论 | 阅读次数:222
docker可以很方便的一键部署应用,非常的实用,学习一下,顺便看能不能作为OnlineJudge的编译容器。 概念 镜像Image: 说白了就是类似.iso文件 容器Container: 说白了就是把.iso安装在虚拟机里,成为一个虚拟主机 说白了,docker就是把做好的镜像,直接运行,变成得到临时的容器,容器通常都是一次性的,用完后自动销毁所有的数据。 sudo yum -y install docker # 安装sudo service docker start # 运行# 之后所有的操作,都必须是用管理员的权限运行的docker images # 查看已经下载的镜像docker ps -a # 查看容器docker restart [name or id] # 对于已经exit的容器,重启继续运行docker exec -it [name or id] /bin/sh # 对于正在运行的容器,进入shelldocker search xxxx # 搜索镜像docker pull xxxx # 下载镜像docker commit 5d8413f3d030 new_name
发表于 2017-08-25 13:05:30 | 条评论 | 阅读次数:96
grafana其实是一款web端的图形界面,主要是用来查看报表的。 influxdb是存储的数据库。 StatsClient是python的一款influxdb的客户端,用来往influxdb数据库中发数据。 利用StatsClient来写statsd类(之后再把这个类的代码放上来QAQ) 今天这个主要是记录如何配置grafana的图表,感觉这块网上资料比较少。 这个是效果图。 其实往里面输入点东西,之后就会显示数据库中所有的条数了 这样设置来检测访问量,time可以设置多长时间聚合成一个点,一定要设置fill,不然图可能不能正常的显示。 这样可以设置这一段时间内,的平均耗时,如果把mean改成max, 就能检测这段时间内的极端耗时了 这path这边还能设置路由路径,能精确到某一具体的网页
发表于 2017-08-16 20:22:38 | 条评论 | 阅读次数:114
思路 1.记ans = INF 2.从任意点,用prim做最大生成树,记录最后一次加入到生成树中的点记为s,以及最后一次加入到生成树中的边记为e,记录e的另一端为t。 3.把与s节点相连的所有边权值相加记录为sum,去与ans取最小值更新ans 4.把s和t节点合并,若s和t都对r节点有边,合并后新的节点则是对r有重边。 5.回到步骤2,继续,直到只剩下了1个节点为止。 证明 定理1:sum就是上述的s和t的最小割。 证明 设与s相连的边分别是e1,e2,...,ene_1, e_2,...,e_ne​1​​,e​2​​,...,e​n​​,这些边的另一端分别为p1,p2,...,pnp_1, p_2, ..., p_np​1​​,p​2​​,...,p​n​​ 我们拿第一条边来举例子: 由于已经做了最大生成树,所以p1p_1p​1​​到ttt一定是可以通过最大生成树上的边到达的。 那么,考虑sss经过e1e_1e​1​​到达ttt,这条路径我们现在要让它断开。 可以分成两种情况,第一种情况是断开e1e_1e​1​​,第二种情况是断开p1p_1p​1​​与ttt不通过sss时的其他所有路径。 由于
acm
发表于 2017-08-08 10:01:23 | 条评论 | 阅读次数:115
Copyright © 2017 - 2018 qwb's blog
blog.csustacm.com All Rights Reserved
Powered by qwb Contact me