Short URL based on OpenResty,
Short URL based on OpenResty,
为什么80%的码农都做不了架构师?>>>
基于OpenResty + Redis进行短网址服务开发,目前只是流程阶段,未考虑细节问题。
- 使用62进制计数,进行KV存储
local cjson = require "cjson"
local source = ngx.req.get_uri_args().source
if not source then
ngx.say(cjson.encode({success=false,message="请输入源网址"}))
return
end
local ELEMENTS = {"q","w","e","r","t","y","u","i","o","p","a","s","d","f","g","h","j","k","l","z","x","c","v","b","n","m","0","1","2","3","4","5","6","7","8","9","Q","W","E","R","T","Y","U","I","O","P","A","S","D","F","G","H","J","K","L","Z","X","C","V","B","N","M"}
local function _10_2_62(number)
local rest = number
local result = ""
while rest > 0 do
local temp = math.floor(rest / 62)
result = ELEMENTS[rest - temp * 62 + 1] .. result
rest = temp
end
return result
end
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.say(err)
return
end
local key = "DWZ_ID"
local res, err = red:incr(key)
local dwzKey = _10_2_62(res)
ok, err = red:set(dwzKey, source)
if not ok then
ngx.say(err)
return
end
red:set_keepalive(10000, 100)
local prefix = "http://192.168.0.103:8080/"
ngx.say(cjson.encode({success=true,dwz=prefix..dwzKey}))
- 根据短网址,进行转发
local cjson = require "cjson"
local redis = require "resty.redis"
local red = redis:new()
red:set_timeout(1000)
local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
ngx.say(err)
return
end
local res, err = red:get(ngx.var.dwz)
red:set_keepalive(10000, 100)
if res == ngx.null then
ngx.header.content_type = 'application/json'
ngx.say(cjson.encode({success=false,message="未找到短网址"}))
return
end
return ngx.redirect(res)
转载于:https://my.oschina.net/geek4j/blog/1817831
评论暂时关闭