本系列所有文章基于《Redis设计与实现》学习而做的随笔,本文使用的redis源码为3.0版本,以后不再赘述 c语言的字符串 首先,我们都知道,Redis是用c语言实现的,而c语言,有个很大的弊端,那就是没有原生的字符串,字符串,是使用字符数组实现的。 基于这个原因,我们可以分析一下c字符串的缺点。 1. 字符串的拼接需要提前判断空间是否足够,否则可能造成缓冲区溢出。此外还必须进行malloc分配内存占用大量系统资源。 2. 字符串缩短时需要释放空间,否则可能造成内存泄漏。 那么,Redis的第一个要解决的就是实现一个高效的字符串 Redis的SDS 简单动态字符串(simple dynamic string,SDS)的定义如下: sds.h struct sdshdr{ int len; //记录buf中字符串的长度(strlen) int free; //记录buf中未使用的空间大小; char buf[]; //保存字符串的数组 } 继续阅读 >>


李余通 17/12/18 22:56:14
get、post 很简单,直接request.getParameter(“name”) 其他方式 例如delete,put。 如上的方法可能无法获取,找到的原因说可能是tomcat api的问题。 解决办法: BufferedReader br = new BufferedReader(new InputStreamReader(request.getInputStream())); String s = null; String data = ""; while((s = br.readLine()) != null) { data = data.concat(s).concat("\n"); } data = data.substring(0,data.length()-1); System.out.println(data); 获取了类似a=b&c=d的字符串,然后进行分析获得。 在分享一个自己写的分析字符串,接上面的代码 HashMap<Str 继续阅读 >>


李余通 17/12/11 22:05:56
背景 最近在学习restful api的开发,遇到这样的问题,书上使用itsdangerous生成token,但是同一个用户可以短时间内生成多个token,而这些token在有效期内都是可以使用的。现在就是要实现的需求是仅最新的token有效。老的token失效。 说明 假设一共开发了三种客户端:WEB,ANDROID,IOS,同一种客户端的token只保存最新的一份。 思路 使用数据库保存token,每次生成token时仅需更新token,验证时候先验证token是否有效,再去数据库查找是否是最新的token。 设计 数据库使用redis,提高查询速率。 现在需要确定使用hash还是k-v更好一些。 存法: hash: token:uid{ WEB:tokenweb, ANDROID:tokenandroid, IPHONE:tokeniphone, } k-v: token:uid:WEB:tokenweb token:uid:ANDROID:tokena 继续阅读 >>


李余通 17/12/04 17:03:36
定义方法 宏格式: 宏指令名 MACRO 形参 · · · (宏定义体) ENDM 调用 宏名[形参] 作用:MASM.EXE会将调用到宏的地方用宏定义体完全替换。定义宏的地方不会生成机器码。 过程格式: 过程名 PROC [NEAR/FAR] · · · RET · · · 过程名 ENDP 调用:call 过程名 注:过程不能传递参数 作用:定义过程的地方会生成机器码。 来个实例 拿9号功能调用来做一个对比。 9号功能调用 作用> 输出一串字符 实例> a.asm ;9号功能调用演示 data segment str db "this is a string.$" data ends code segmen 继续阅读 >>


李余通 17/12/03 00:04:27
何为http auth? http auth是一种基础的用户验证,原理是将用户名:密码base64加密后放在http的请求头部Authorization 发给服务器。 浏览器的做法 当你访问一个需要http auth验证的资源时,web server会去检查你的http请求头并且比对帐号密码,如果不成功就会相应的所请求的资源,否则就会返回401,浏览器在接收到401时会自动打开一个登陆窗口让你登陆,点击提交后会将输入的用户名密码base64加密后放在请求头部再次发送这次请求。 缺点 很明显,如果别人获取了你的http请求内容,将Authorization请求头解密后就能获得帐号密码,所以一般来说,http auth都是基于https的。 为什么会用到 http auth? restful api restful api 的一个特点即无状态,每次对敏感资源的访问都需要进行登陆验证,可以用http auth来很好的开发restful api。 纯js的ajax实现http au 继续阅读 >>


李余通 17/11/27 19:46:29
request.form及request.args的区别 request.form用来接受post请求参数,request.args接受get请求参数。以requests.form[‘key’],若值不存在,抛出KeyError,会直接返回400错误,可以手动捕获。如下 def login(): try: username = request.args['name'] password = request.form['pass'] except KeyError as e: print(e) request.args同理。 此外,可以使用字典的get方法避免异常。eg.request.form.get('key',none) ‘dict’ object is not callable解决办法 manager.add_command('shell',Shell(make_context=make_shell_context 继续阅读 >>


李余通 17/11/20 14:51:08
建立模型 建立一个简单的用户表,id自增,用户名,密码 from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy(app) class User(db.Model): __tablename__ = 'users' id = db.Column(db.Integer,primary_key=True) username = db.Column(db.String(80),unique=True) password = db.Column(db.String(128)) 可能我们比较懒,虽然用户表有了,但还得去写验证逻辑,不想写,用一些库吧。 pip install flask_login 未完 作者:baidu_35085676 发表于 2017/11/20 14:40:58 原文链接 https 继续阅读 >>


李余通 17/11/20 14:40:58
内存为什么要管理 在OS中,每个运行的进程都会占用内存,那么操作系统势必要做好两件事:内存分配和内存回收。这便是本次实验要做的模拟实验了。 内存分配策略 FF(首次适应算法) 这种策略旨在从最低地址的空闲分区开始找起,找到合适的便进行分配。内存空间按起始地址从小到大排序。 优点:查找速度快 缺点:低地址会留下较多的内存碎片,高地址则会存留大块空闲分区。 BF(最佳适应算法) 这种策略每次分配都将最小块的满足需求空闲分区拿去分配。内存空间按空闲区从小到大排序。 优点:保留大的空闲分区。 缺点:造成很多小的空闲分区。 WF(最差适应算法) 这种策略每次分配都将最大块的满足需求空闲分区拿去分配。内存空间按空闲区从大到小排序。 优点:不会留下许多小的内存碎片。往往可以装入多个大内存程序。 缺点:留下大空闲区的可能减少了。 内存管理实验内容 模拟操作系统,既然是模拟,那么自然比真正的内存分配简单很多。 程序中两个链表: 空闲内存区块表,包含该空闲区的起始地址以及 继续阅读 >>


李余通 17/11/10 18:56:25
Ajax大法好,网站感觉跟高大上,但由于Js的局限,跨域Ajax无法实现,这里,讲一下解决办法,前提是需要能够自己可以控制flask端的响应。 主要技术: 修改服务器相应的相应头,使其可以相应任意域名。and设置响应头,使其能够相应POST方法。 实现代码: 这里先放flask代码: from flask import make_response @app.route('/test',methods=['get','post']) def Test(): if request.method=='GET': rst = make_response('aaa') rst.headers['Access-Control-Allow-Origin'] = '*' #任意域名 return rst else: rst = make_response('bbb') rst.headers['Access-C 继续阅读 >>


李余通 17/10/23 20:21:48
Ajax大法好,网站感觉跟高大上,但由于Js的局限,跨域Ajax无法实现,这里,讲一下解决办法,前提是需要能够自己可以控制flask端的响应。 主要技术: 修改服务器相应的相应头,使其可以相应任意域名。and设置响应头,使其能够相应POST方法。 实现代码: 这里先放flask代码: from flask import make_response @app.route('/test',methods=['get','post']) def Test(): if request.method=='GET': rst = make_response('aaa') rst.headers['Access-Control-Allow-Origin'] = '*' #任意域名 return rst else: rst = make_response('bbb') rst.headers['Access-C 继续阅读 >>


李余通 17/10/23 20:21:48