OpenRestyベストプラクティス学習--実戦演習ノート(4)

17755 ワード

この記事ではopenrestyがredisデータベースとキャッシュに接続されているものを簡単に記録し、基本的には公式サイトのいくつかの例と知識であり、整理として自分の後続の回顧を便利にします!
Openresty接続redis
ローカルサーバにredisがインストールされているので、ここではredisに接続するプロセスだけを簡単に記録します!
1.redisサービスの起動
[root@localhost ~]# /usr/local/bin/redis-server /root/dufy/redis/redis-3.0.4/redis.conf
[root@localhost ~]# 
[root@localhost ~]# ps -ef | grep redis
root      1925     1  0 22:46 ?        00:00:00 /usr/local/bin/redis-server *:6379                                 
root      1929  1915  0 22:46 pts/0    00:00:00 grep redis
[root@localhost ~]# 

[root@localhost ~]# /usr/local/bin/redis-cli -p 6379
127.0.0.1:6379> set hello 123
OK
127.0.0.1:6379> get hello
"123"
127.0.0.1:6379> 


2.openrestyにおけるredisを接続するコードのopenrestyの/opt/openresty/nginx/conf/以下のnginxを構成する.conf http->serverで構成され、以下の構成は公式ドキュメントにあります:lua-resty-redis Synopsis!
 #    redis
    location /redis {
            content_by_lua_block {
                local redis = require "resty.redis"  #  redis,   java  import
                local red = redis:new()

                red:set_timeout(1000) -- 1 sec

                -- or connect to a unix domain socket file listened
                -- by a redis server:
                --     local ok, err = red:connect("unix:/path/to/redis.sock")

                local ok, err = red:connect("127.0.0.1", 6379)
                if not ok then
                    ngx.say("failed to connect: ", err)
                    return
                end

                ok, err = red:set("dog", "an animal")
                if not ok then
                    ngx.say("failed to set dog: ", err)
                    return
                end

                ngx.say("set result: ", ok)

                local res, err = red:get("dog")
                if not res then
                    ngx.say("failed to get dog: ", err)
                    return
                end

                if res == ngx.null then
                    ngx.say("dog not found.")
                    return
                end

                ngx.say("dog: ", res)

                red:init_pipeline()
                red:set("cat", "Marry")
                red:set("horse", "Bob")
                red:get("cat")
                red:get("horse")
                local results, err = red:commit_pipeline()
                if not results then
                    ngx.say("failed to commit the pipelined requests: ", err)
                    return
                end

                for i, res in ipairs(results) do
                    if type(res) == "table" then
                        if res[1] == false then
                            ngx.say("failed to run command ", i, ": ", res[2])
                        else
                            -- process the table value
                        end
                    else
                        -- process the scalar value
                    end
                end

                -- put it into the connection pool of size 100,
                -- with 10 seconds max idle time
                local ok, err = red:set_keepalive(10000, 100)
                if not ok then
                    ngx.say("failed to set keepalive: ", err)
                    return
                end

                -- or just close the connection right away:
                -- local ok, err = red:close()
                -- if not ok then
                --     ngx.say("failed to close: ", err)
                --     return
                -- end
            }
        }

3.テスト接続(1)Openrestyの起動
[root@localhost ~]# sudo /opt/openresty/nginx/sbin/nginx -c /opt/openresty/nginx/conf/nginx.conf -p /opt/openresty/nginx/

nginx: [alert] lua_code_cache is off; this will hurt performance in /opt/openresty/nginx/conf/nginx.conf:46
[root@localhost ~]# 
[root@localhost ~]# 
[root@localhost ~]# ps -ef | grep nginx
root      1957     1  0 22:56 ?        00:00:00 nginx: master process /opt/openresty/nginx/sbin/nginx -c /opt/openresty/nginx/conf/nginx.conf -p /opt/openresty/nginx/
nobody    1958  1957  0 22:56 ?        00:00:00 nginx: worker process                                                                           
root      1960  1915  0 22:56 pts/0    00:00:00 grep nginx
[root@localhost ~]# 

(2)redisがOKかどうかをテストする
[root@localhost ~]# curl http://localhost:8080/redis
set result: OK
dog: an animal
[root@localhost ~]# 

Openrestyキャッシュの簡単な説明
Openrestyはどのようにキャッシュしますか?
1.shared_dict辞書キャッシュ
-純メモリ、複数のWorkerの間で共有され、ロックされた操作があり、原子性を保証します.-プリセットキャッシュのサイズ–APIはもっと多いです.
(1)nginx,conf lua_の修正shared_dict my_cache 128m;
(2)luaコードにおけるfunction get_from_cache(key) local my_cache = ngx.shared.my_cache local value = my_cache:get(key) return value end
注意:本番環境では、ビジネス機能の違いに応じて、複数のshared_を分割します.dict! ロックの競合を回避!
2.lua_resty_lrucache
–最近のアルゴリズムの最小使用–プリセットキャッシュキーの数–ワークごとに個別に使用することで、ロックの競合を減らすことができますが、メモリの使用量を増やすことができます–lrucache APIは特に簡単になりました
local lrucache = require "resty.lrucache"
local c = lrucahce.new(200) --allow up to 200 items in the cache

if not c then 
    return error("failed to create the cahce : " .. (err or "unknownb"))
end

c:set("dog",32)
ngx.say("dog :" , c:get("dog"))

3.高性能のキャッシュサーバ、考慮–キャッシュ失効嵐(キャッシュ雪崩)local value=get_from_cache(key) if not value then value = query_db(sql) set_to_cache(value,timeout = 100) end return value
lua-resty-lock公式ドキュメントについて詳しく紹介します!
例:キャッシュ不要とキャッシュ使用の比較
nginx.conf (1)
#---
    # lua_code_cache :   on   ,    ,         ,  off;          ,       
    #---
    lua_code_cache on;

(2)
 #  openresty   
    location /get_value{
        content_by_lua_file learn_lua/cache/get_value.lua;
    }

(3)新規get_value.lua/learn_lua/cache/get_value.lua
local redis = require "resty.redis"
local red = redis:new()

red:set_timeout(1000) -- 1 sec

-- or connect to a unix domain socket file listened
-- by a redis server:
--     local ok, err = red:connect("unix:/path/to/redis.sock")

local ok, err = red:connect("127.0.0.1", 6379)
if not ok then
    ngx.say("failed to connect: ", err)
    return
end

function set_to_cache(key,value,exptime)
    if not exptime then
            exptime = 0
    end
    local cache_ngx = ngx.shared.caceh_ngx
    local succ,err,forcible = cache_ngx:set(key,value,exptime)
    return succ
end

function get_from_cache( key )
    local cache_ngx = ngx.shard.cache_ngx
    local value = cache_ngx:get(key)

    if not value then
        value = get_from_redis(key)
        set_to_cache(key,value)
    end
    return value
end

function get_from_redis( key )
    local res,err = red:get(key)
    if res then 
            return 'yes'
    else
            return 'no'
    end
end

local res = get_from_redis('dog')
ngx.say(res)

(4)圧力テスト!get_の使用from_redis結果:
ab -n 100000 -c 100 http://127.0.0.1:8080/get_value
get_の使用from_Cache、使用前にnginxが必要です.confのhttpでの構成
 #openresty     
  lua_shared_dict cache_ngx 128m;

Openrestyを再起動!
もしこのブログがあなたに役に立つと思ったら、「いいね」をクリックしてください.ありがとうございます.
もしかっこいい(美しい)、英知(聡明)が、私と同じように簡単で善良なあなたがこのブログに問題があるのを見たら、私は謙虚にあなたが私を成長させた批判を受け入れて、読んでくれてありがとうと指摘してください.今日は楽しかったですね.
私のcsdnブログへようこそ、私たちは一緒に成長します!
「何をするにしても、続けていくだけで違う!道で、卑屈ではない!」
ブログ:http://blog.csdn.net/u010648555