openresty写入用户唯一标识(cookie)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 前言 最近打算在blog里面,增加个性化推荐,以增加访问量。这一切的前提是,我要能够标识出每个用户,以及记录用户的浏览记录。这里笔者采用openresty在cookie中写入用户标识,然后在日志中记录下用户的浏览记录,供后续分析使用 2. 详解 1)nginx 配置 upstream blog { server 127.0.0.1:8080; } server { listen 80; #端口 server_name blog.vearne.cc; location ^~ /archives/ { rewrite_by_lua_file 'conf/lua/set-ck.lua'; proxy_pass http://blog; } location /{ proxy_pass http://blog; } } 2)Lua脚本 set-ck.lua 如果用户没有对应的cookie "UT_ID", 则注入cookie的同时,返回一个302临时跳转, 客户再次访问时,由于已经拥有响应cookie,所以可以直接访问后端服务 local cookie_name = "cookie_UT_ID" local request_uri = ngx.var.request_uri if ngx.var[cookie_name] == nil then local uuid = io.open("/proc/sys/kernel/random/uuid", "r"):read() local mycookie = string.format("UT_ID=%s; Expires=%s", uuid, ngx.cookie_time(ngx.time() + 86400 * 1000)) ngx.header["Set-Cookie"] = mycookie ngx.header["Location"] = request_uri ngx.exit(302) end 这里另一个有趣的地方是,可以直接通过读取文件 "/proc/sys/kernel/random/uuid" 来生成一个uuid ...

November 5, 2018 · 1 min

如何生成全局唯一ID

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 前言 在分布式环境中,生成全局唯一ID是非常需求。本文将介绍几种常见生成方法,并对它们的优缺点做出点评。 0. 8个字节 语言或数据库 内建类型 Golang uint64 Java long Python int MySQL bigint unsigned 2 ^ 32(4个字节)最多只有40多亿,对于高并发的系统,肯定不是够的。 以新浪微博为例,每天的新增的微博量都过亿,所以考虑到ID的容量,这个ID的长度至少是8个字节 1. UUID 长度: 为16 bytes, 128 bits 44e91a8a58d111e8ae84784f43a6cab8 见参考资料1: 5种版本 时间的版本 DCE Security MD5哈希 (伪)随机数 SHA-1哈希 以Version 1为例子 time_inc + clk_seq + node points time_inc时间精度为100 ns 即使在100ns以内,2次生成的time_inc也不会重复,因为会自动加1 clk_seq 为2个bytes一般是随机数(2 ^ 16 为65536) 协议文档中写明,此字段可以用来防止时钟回拨,但是在高并发情况下,也很难保证不出现冲突。 node取mac地址 下面是python的uuid库生成的一组ID a7748921-58d9-11e8-a727-784f43a6cab8 a70b016e-58d9-11e8-8a8c-784f43a6cab8 a6991957-58d9-11e8-8874-784f43a6cab8 a5b143ba-58d9-11e8-9600-784f43a6cab8 2. snowflake 长度: 8 bytes ...

May 16, 2018 · 2 min