魏长东

weichangdong

redis zset初结识

最近的项目使用redis的hash实现了,但是有一点瑕疵,就想着改用zset,结果改完之后,发现这个瑕疵避免不了。如是终止了。不过在这个过程中,对redis有了更加深刻的认识,觉得还是很强大的。

最近开发的新项目

前一阵子开发了360天气,本来打算用lua的,最后感觉进度很紧,就还用php了,用了新的php框架yaf,第一次用,然后主要是redis和elastic search。es主要的geo经纬度的定位和搜索,算是es入了门。

最近有开发了新的项目,播客。这个api我用lua的openresty、lor,redis。后台我用php的thinkphp框架,这个框架接触很久了,用在实际工作中,也是第一次。然后还用到了mongodb,这个算是第二次使用,估计仅仅算是入了门,mysql。也催的非常紧。这次尝试使用lua,感觉适合做api的开发。但是这次没有采用加密,如果使用的话,不知道这个lua能调试通不,360天气使用的aes的加密。

Mac 上安装phpstorm

http://www.cnblogs.com/redirect/p/6112168.html

这个网址的方法可行。

mac还需要好久熟悉啊 。。。。

post请求转发

post请求转发
server {
		listen       80;
        server_name  www.fenglangjuxu.com;
        access_log  /var/log/php-fpm/5.6/lang.log  main;
        root   "/work/wcd/public";
		#location / {
		#       index  index.php;
		#       try_files $uri $uri/ /index.php?$args;
		#}
         location / {
                proxy_pass http://123.456.789.123;
         }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
}

lua的lor学习

最近学习lua,看到了lor框架。然后找了几套代码,然后部署在了虚拟机上。算是入了门。

 

第一个,可以登录,亮点是可以markdown写文章,还可以预览、

litle_blog.png

 

 

 

 

 

 

»»阅读全文

nginx location匹配规则

location匹配命令

~      #波浪线表示执行一个正则匹配,区分大小写
~*    #表示执行一个正则匹配,不区分大小写
^~    #^~表示普通字符匹配,如果该选项匹配,只匹配该选项,不匹配别的选项,一般用来匹配目录
=      #进行普通字符精确匹配
@     #"@" 定义一个命名的 location,使用在内部定向时,例如 error_page, try_files

 

location 匹配的优先级(与location在配置文件中的顺序无关)
= 精确匹配会第一个被处理。如果发现精确匹配,nginx停止搜索其他匹配。
普通字符匹配,正则表达式规则和长的块规则将被优先和查询匹配,也就是说如果该项匹配还需去看有没有正则表达式匹配和更长的匹配。
^~ 则只匹配该规则,nginx停止搜索其他匹配,否则nginx会继续处理其他location指令。
最后匹配理带有"~"和"~*"的指令,如果找到相应的匹配,则nginx停止搜索其他匹配;当没有正则表达式或者没有正则表达式被匹配的情况下,那么匹配程度最高的逐字匹配指令会被使用。

location 优先级官方文档

  1. Directives with the = prefix that match the query exactly. If found, searching stops.
  2. All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.
  3. Regular expressions, in order of definition in the configuration file.
  4. If #3 yielded a match, that result is used. Else the match from #2 is used.
  1. =前缀的指令严格匹配这个查询。如果找到,停止搜索。
  2. 所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。
  3. 正则表达式,在配置文件中定义的顺序。
  4. 如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用。

 

»»阅读全文

编写高性能的Lua代码

使用Local

在代码运行前,Lua会把源码预编译成一种中间码,类似于Java的虚拟机。这种格式然后会通过C的解释器进行解释,整个过程其实就是通过一个 while循环,里面有很多的 switch...case语句,一个 case对应一条指令来解析。

自Lua 5.0之后,Lua采用了一种类似于寄存器的虚拟机模式。Lua用 来储存其寄存器。每一个活动的函数,Lua都会其分配一个栈,这个栈用来储存函数里的活动记录。每一个函数的栈都可以储存至多250个寄存器,因为栈的长度是用8个比特表示的。

有了这么多的寄存器,Lua的预编译器能把所有的local变量储存在其中。这就使得Lua在获取local变量时其效率十分的高。

举个栗子: 假设a和b为local变量, a = a + b的预编译会产生一条指令:

;a是寄存器0 b是寄存器1
ADD 0 0 1

但是若a和b都没有声明为local变量,则预编译会产生如下指令:

GETGLOBAL    0 0    ;get a
GETGLOBAL    1 1    ;get b
ADD          0 0 1  ;do add
SETGLOBAL    0 0    ;set a

所以你懂的:在写Lua代码时, 你应该尽量使用local变量

以下是几个对比测试,你可以复制代码到你的编辑器中,进行测试。

a = os.clock()
for i = 1,10000000 do
  local x = math.sin(i)
end
b = os.clock()
print(b-a) -- 1.113454

把math.sin赋给local变量sin:

a = os.clock()
local sin = math.sin
for i = 1,10000000 do
  local x = sin(i)
end
b = os.clock()
print(b-a) --0.75951

直接使用 math.sin,耗时1.11秒;使用local变量 sin来保存 math.sin,耗时0.76秒。可以获得30%的效率提升!

»»阅读全文

lua七宗罪

因为擅长写php,而且lua刚学,所以有些估计是我水平不够才会这么认为的。

第一宗 不能很好的计算table长度。比如这样的

local all_sids = {

        ['1'] = 'Facebook',

        ['2'] = 'API',

        ['3'] = 'Google',

        ['16'] = 'MV',

['27'] = 'Mopub',

}

第二宗 函数默认值不能放在参数上,需要写到函数里面。

这是错的

function wcd(n=2)

end

需要这样

function wcd(n)

n = n or 2

end

第三宗 table数字变量,必须加方括号单引号,不然没法访问。

这样是错的

local all_sids = {

        1 = 'Facebook',

        2 = 'API',

        3 = 'Google',

        16 = 'MV',

27 = 'Mopub',

}

正确的见第一宗例子

第四宗 luasql循环的数据直接insert到table,结果不是预期的

local select_sql = "select "..fields.." from wcd where ".. where .. group

print(select_sql)

cur = conn:execute(select_sql)  

row = cur:fetch({},"a")

local re = {}

local total_data = {}

local  fuck ={}

while row do

-- 这是正确的

fuck = {s_id=row['s_id'],show =row['show'],income=row['income'],click=row['click']}

-- 这是错误的

table.insert(re,row)

end

第五宗 不方便判断是否一个值存在于一个数组

第六宗 【或许不算什么罪过,但是使用php习惯了,觉得这样停变态的】定义变量,不要全局变量和局部变量混着来,否则你不根本不知道问题出在哪里

要是觉得不变态,可以帮我理解下下面的代码么,根本不懂什么upvalue啊

local data = 100;

 

local function fun1()

   print(data);

   data = data+50;

 

end

 

data = 200;

 

local data = 300; -- 重新定义一个局部变量

 

local function fun2()

   print(data);

   data = data+50;

end

 

data = 400;

--调用

fun1(); -- 200

fun2(); -- 400

fun1(); -- 250

第七宗 table pairs输出,不按照预定顺序,是不是感觉很恶心啊。

local all_mid_8 = {

['147'] = '147加速',

['148'] = '148页',

['149'] = '149成页',

['118'] = '118屏保',

['153'] = '153功能卡片',

['154'] = '154一键',

}

for mid,mid_name in pairs(all_mid_8) do

print(mid..'==='..mid_name)

end