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

相关内容

    暂无相关文章