2. Lua 모듈 의 공유 메모리

이전 절 에 서 는 워 커 프로 세 스 의 공유 메모리 에 대해 설명 하 였 으 며, 풍부 한 명령 을 이용 하여 데이터 의 캐 시 작업 을 매우 간단 하 게 만 들 었 으 나, 단점 도 있 습 니 다.
1. 워 커 프로 세 스 간 에 잠 금 경쟁 이 있 고 높 은 병행 상황 에서 성능 비용 이 증가 합 니 다.2. Lua 불 값, 숫자, 문자열, nil 형식의 데이터 만 지원 하고 table 형식의 데 이 터 는 지원 할 수 없습니다.3. 데 이 터 를 읽 을 때 역 직렬 화 작업 이 있 으 면 CPU 비용 이 증가 합 니 다.
공유 메모리 NgxLua 에 서 는 캐 시 도구 로 도 뛰 어 납 니 다.필 자 는 생산 환경 에서 lua 를 여러 차례 사용 한 적 이 있다.shared_dict 의 각종 특성 은 뚜렷 한 성능 문제 가 존재 한 다 는 것 을 느끼 지 못 했다.그러나 독자 가 이러한 단점 을 개의 치 않 거나 더 복잡 한 데 이 터 를 캐 시 해 야 한다 면 lua - resty - lrucache 를 사용 할 수 있다.
10.2.1 lua - resty - lrucache 설치
lua - resty - lrucache 는 Ngx 기반Lua 의 캐 시 이기, 다음 과 같은 장점 을 가지 고 있 습 니 다.
1. 더 풍부 한 데이터 형식 을 지원 하고 table 을 value 에 저장 할 수 있 습 니 다. 이것 은 데이터 구조 가 복잡 한 업무 에 매우 유용 합 니 다.
2. key 의 수량 을 미리 분배 할 수 있 습 니 다. 고정된 메모리 공간 을 설정 하지 않 아 도 메모리 사용 에 있어 더욱 유연 합 니 다.
3. 모든 워 커 프로 세 스 가 독립 적 으로 캐 시 되 어 있 기 때문에 워 커 프로 세 스 가 같은 키 를 동시에 읽 을 때 잠 금 경쟁 이 존재 하지 않 습 니 다.
하지만 그것 과 luashared_dict 에 비해 서도 단점 이 있 습 니 다.
1. 데이터 가 worker 사이 에 공유 되 지 않 기 때문에 데 이 터 를 업데이트 할 때 데이터 가 같은 시간의 다른 worker 프로 세 스에 서 완전히 일치 하 는 것 을 보장 할 수 없습니다.
2. 복잡 한 데이터 구 조 를 지원 할 수 있 지만 사용 할 수 있 는 명령 은 매우 적다. 예 를 들 어 메시지 큐 기능 을 지원 하지 않 는 다.
3. Nginx 설정 을 다시 불 러 올 때 캐 시 데 이 터 를 잃 어 버 립 니 다.lua 를 사용 하면shared_dict, 그 럴 리 가 없어 요.
유리 하면 폐단 이 있 고 독 자 는 사용 할 때 자신의 수요 에 따라 선택 할 수 있다.lua - resty - lrucache 의 설치 방식 은 다른 lua - resty 모듈 과 마찬가지 로 다음 과 같다.
# git clone https://github.com/openresty/lua-resty-lrucache.git
# cp -r lua-resty-lrucache/lib/resty/lrucache* \
 /usr/local/nginx_1.12.2/conf/lua_modules/resty/

10.2.2 lua - resty - lrucache 를 사용 하여 캐 시 하 는 방법
아래 의 예 를 통 해 lua - resty - lrucache 의 사용 방식 을 알 아 보 려 면 먼저 모듈 을 불 러 와 야 합 니 다. 방법 은 다음 과 같 습 니 다. local lrucache = require "resty. lrucache" local lrucache "local lrucache = require" resty. lrucache "local lrucache = require" resty. lrucache. pureffi "독자 가 lua - resty - lrucache 를 불 러 올 때 위의 2 개의 파일 을 luapackage_path 가 설정 한 경로 에 있 습 니 다.이들 의 역할 은 같 지만 성능 은 차이 가 있 습 니 다. resty. lrucache 는 캐 시 명중률 이 높 거나 읽 기 동작 이 쓰기 동작 보다 훨씬 큰 캐 시 업무 에 적합 합 니 다.resty. lrucache. pureffi 는 캐 시 명중률 이 낮 거나 key 를 자주 증가 하고 삭제 해 야 하 는 캐 시 업무 에 적합 합 니 다.업무 수요 에 따라 선택 하 세 요.그리고 아래 코드 를 test 에 기록 합 니 다.m. lua 에 이 파일 을 lua 에 넣 습 니 다.package_path 의 경로 에서 코드 는 다음 과 같 습 니 다.
local _M = {}
local lrucache = require "resty.lrucache"
--      1 1000 key   
local cache, err = lrucache.new(1000)
if not cache then
    return error("failed to create the cache: " .. (err or "unknown"))
end
--           key/value  
local function mem_set()
    --set()             key、value、   (2s)
    cache:set("a", 19, 2)
    cache:set("b", {"1","2","3"},0.001)  --    table     
    return
end
--           value。 a value  ,  a nil,   value       ;  stale_data  ,   value   
local function mem_get(key)
    local a,stale_data = cache:get(key)
    return a,stale_data
end
function _M. fromcache ()
    --  a  
local a,stale_data  =  mem_get("a")
    --  a  ,   a  
    if a then
       ngx.say("a: ", a)
    --  a    stale_data  ,      value,         ,      value
    elseif stale_data then
       ngx.say("a     : " , stale_data)
       mem_set()
       local a_again  =  mem_get("a")
       ngx.say("a: ", a_again )
    --  a   stale_data    ,           value
    else
       ngx.say("no found a")
       mem_set()
       local a_again  =  mem_get("a")
       ngx.say("a: ", a_again )

    end
end
return _M
  nginx.conf  ,    :
location / {
    content_by_lua_block {
        --    ,         
        require("test_m").fromcache()
    }
}

Nginx 설정 을 다시 불 러 옵 니 다. 실행 결 과 는 다음 과 같 습 니 다.
# curl   'http://testnginx.com/'
no found a
a: 19
[root@testnginx ~]# curl   'http://testnginx.com/'
a: 19
[root@testnginx ~]# curl   'http://testnginx.com/'
a: 19
[root@testnginx ~]# curl   'http://testnginx.com/'
a     : 19
a: 19

실행 결 과 를 보면 알 수 있 듯 이 1. 첫 번 째 요청 은 a 가 값 이 없 기 때문에 'no found a' 를 출력 한 다음 에 저장 작업 을 실 행 했 습 니 다.
2. 두 번 째 요청 은 캐 시 값 이 있 기 때문에 value 를 직접 출력 합 니 다.
3. 세 번 째 요청 은 캐 시 값 이 있 고 value 를 직접 출력 합 니 다.
4. 네 번 째 요청 은 캐 시 데 이 터 를 위 한 유효기간 이 짧 기 때문에 만 료 되 었 기 때문에 만 료 된 value 를 출력 하고 저장 작업 을 다시 실행 하 며 value 를 출력 합 니 다.
Nginx 설정 을 다시 불 러 오 려 고 시도 하면 재 부팅 (restart) 할 때마다 a 가 값 이 없습니다. 설정 을 다시 불 러 오 는 과정 에서 캐 시 데 이 터 를 잃 어 버 리 기 때 문 입 니 다.lua - resty - lrucache 의 흔 한 명령 에 대해 설명 하 겠 습 니 다.
new 문법: cache, err = lrucache. new (max items [, load factor]) 의 의미: 캐 시 인 스 턴 스 를 만 듭 니 다.만 드 는 데 실패 하면 nil 로 돌아 가 잘못된 정 보 를 err 에 되 돌려 줍 니 다.max_items 는 캐 시 키 의 수량 을 설명 하 는 데 사 용 됩 니 다. 이 설정 을 통 해 알 수 있 듯 이 메모리 의 사용 크기 는 정 해 지지 않 았 지만 키 의 수량 을 정 해 놓 았 습 니 다.load_factor 인 자 는 resty. lrucache. pureffi 모듈 을 불 러 올 때 만 사용 합 니 다. FFI (Foreign Function Interface, 외부 기능 인터페이스) 를 기반 으로 하 는 hash 표 의 부하 인자 입 니 다. 값 의 구간 은 0.1 ~ 1 사이 이 고 기본 값 은 0.5 입 니 다.부하 인 자 는 hash 데이터 의 읽 기 시간 과 메모리 공간 크기 에 대한 평가 와 관련 이 있 으 며 관심 이 있 는 독 자 는 스스로 관련 정 보 를 조회 할 수 있 습 니 다.
set 문법: cache: set (key, value, ttl) 의 의미: key / value 를 캐 시 에 저장 합 니 다.ttl 은 캐 시 유효기간 입 니 다. 초 단위 로 기본 값 은 0 입 니 다. 만 료 되 지 않 음 을 표시 합 니 다.0.001 s 로 설정 할 수 있 습 니 다.
get 문법: data, staledata = cache: get (key) 의 의미: 지정 한 key 의 값 을 가 져 옵 니 다. key 가 존재 하지 않 거나 만 료 되면 nil 로 돌아 갑 니 다.만 료 된 데이터 가 존재 하면 만 료 된 값 은 staledata。
delete 문법: cache: delete (key) 의 의미: 캐 시 에서 지정 한 key 를 제거 합 니 다.
flush_all 문법: cache: flushall (key) 의 의미: 전체 캐 시 영역의 데 이 터 를 새로 고 치 는 것 은 메모리 의 데 이 터 를 비 우 는 것 과 같 습 니 다.이 방식 은 새 캐 시 인 스 턴 스 를 만 드 는 것 보다 훨씬 빠르다.
  《Nginx  :  Lua     、       》    
https://item.jd.com/12487157.html#none

좋은 웹페이지 즐겨찾기