Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
1/27
Layered Caching in OpenResty
OpenResty Bay Area Meetup
Thibault Charbonnier
Principal Engineer @ Kong Inc.
OpenResty ...
2/27
OpenResty could use a better
caching abstraction
3/27
What to cache?
Client sessions
Configuration
Injected logic
Any state fetched from I/O
4/27
Challenges
Forked nginx workers
LuaJIT VM
lua shared dict serialization
5/27
6/27
Caching in Kong
-- Retrieve a value from the cache , or fetch it
-- if it’s a miss
function _M.cache_get_and_set (key...
7/27
Existing caching libraries
mtourne/ngx.shcache
lloydzhou/lua-resty-cache
hamishforbes/lua-resty-tlc
8/27
Caching primitives in OpenResty
OpenResty offers a few off-the-shelf options for caching data for the Lua-land:
The Lua...
8/27
Caching primitives in OpenResty
OpenResty offers a few off-the-shelf options for caching data for the Lua-land:
The Lua...
8/27
Caching primitives in OpenResty
OpenResty offers a few off-the-shelf options for caching data for the Lua-land:
The Lua...
9/27
lua-resty-mlcache
10/27
lua-resty-mlcache
The Swiss Army Knife of OpenResty caching
11/27
Methods
mlcache:get()
mlcache:set()
mlcache:delete ()
mlcache:peek ()
mlcache:purge ()
mlcache:update ()
12/27
Layered Architecture
13/27
lua shared dict serialization
14/27
Usage
http {
lua_shared_dict cache_shm 128m;
server {
...
}
}
15/27
Usage
local mlcache = require "resty.mlcache"
local cache , err = mlcache.new("cache_name", "cache_shm", {
lru_size ...
16/27
Practical Examples
17/27
Database caching
local function fetch_user(id)
return db:query_user(id) -- row or nil
end
local id = 123
local user ...
18/27
Separate hit/miss caches
19/27
DNS caching
local resolver = require " resty.dns.resolver "
local r = resolver.new ({ nameservers = { "1.1.1.1" } })...
20/27
Injected logic
local function compile_code(row)
row.f = loadstring(row.code) -- once
return row
end
local user , err...
21/27
22/27
Cache invalidation
worker 0: invalidate item worker 1: poll + re-fetch item
cache:delete("user :123")
cache:update (...
23/27
A complete solution
Negative caching
Built-in mutex
Caching Lua tables
Invalidation events
Flexible IPC support
Buil...
24/27
In the wild
Used in Kong for over a year
Contributions from Cloudflare
Well tested
OpenResty 1.11.2.2 to 1.13.6.2 (cu...
25/27
OpenResty contributions & Improvements
New shm API: shm:ttl() & shm:expire()
User flags support - openresty/lua-resty...
26/27
Q & A
27/27
Can you replace your caching logic with mlcache?
https://github.com/thibaultcha/lua-resty-mlcache
Contributions are ...
You’ve finished this document.
Download and read it offline.
Upcoming SlideShare
What to Upload to SlideShare
Next
Upcoming SlideShare
What to Upload to SlideShare
Next
Download to read offline and view in fullscreen.

1

Share

Layered Caching in OpenResty

Download to read offline

In this talk, we will dive into the new "mlcache" library, which aims at providing a simple abstraction for layered caching in OpenResty. We will explore several practical use-cases for it that will help you achieve high-performance goals for your applications.

Related Books

Free with a 30 day trial from Scribd

See all

Related Audiobooks

Free with a 30 day trial from Scribd

See all

Layered Caching in OpenResty

  1. 1. 1/27 Layered Caching in OpenResty OpenResty Bay Area Meetup Thibault Charbonnier Principal Engineer @ Kong Inc. OpenResty contributor August 23rd, 2018
  2. 2. 2/27 OpenResty could use a better caching abstraction
  3. 3. 3/27 What to cache? Client sessions Configuration Injected logic Any state fetched from I/O
  4. 4. 4/27 Challenges Forked nginx workers LuaJIT VM lua shared dict serialization
  5. 5. 5/27
  6. 6. 6/27 Caching in Kong -- Retrieve a value from the cache , or fetch it -- if it’s a miss function _M.cache_get_and_set (key , cb) local val = _M.cache_get(key) if not val then val = cb() if val then local succ , err = _M.cache_set(key , val) if not succ and ngx then ngx.log(ngx.ERR , err) end end end return val end
  7. 7. 7/27 Existing caching libraries mtourne/ngx.shcache lloydzhou/lua-resty-cache hamishforbes/lua-resty-tlc
  8. 8. 8/27 Caching primitives in OpenResty OpenResty offers a few off-the-shelf options for caching data for the Lua-land: The Lua VM itself lua-resty-lrucache lua shared dict
  9. 9. 8/27 Caching primitives in OpenResty OpenResty offers a few off-the-shelf options for caching data for the Lua-land: The Lua VM itself lua-resty-lrucache lua shared dict
  10. 10. 8/27 Caching primitives in OpenResty OpenResty offers a few off-the-shelf options for caching data for the Lua-land: The Lua VM itself lua-resty-lrucache lua shared dict
  11. 11. 9/27 lua-resty-mlcache
  12. 12. 10/27 lua-resty-mlcache The Swiss Army Knife of OpenResty caching
  13. 13. 11/27 Methods mlcache:get() mlcache:set() mlcache:delete () mlcache:peek () mlcache:purge () mlcache:update ()
  14. 14. 12/27 Layered Architecture
  15. 15. 13/27 lua shared dict serialization
  16. 16. 14/27 Usage http { lua_shared_dict cache_shm 128m; server { ... } }
  17. 17. 15/27 Usage local mlcache = require "resty.mlcache" local cache , err = mlcache.new("cache_name", "cache_shm", { lru_size = 1000, -- hold up to 1000 items in the L1 cache (Lua VM) ttl = 3600, -- cache scalar types and tables for 1h neg_ttl = 60 -- cache nil values for 60s }) if not cache then error("failed to create mlcache: " .. err) end
  18. 18. 16/27 Practical Examples
  19. 19. 17/27 Database caching local function fetch_user(id) return db:query_user(id) -- row or nil end local id = 123 local user , err = cache:get(id , nil , fetch_user , id) if err then ngx.log(ngx.ERR , "failed to fetch user: ", err) return end if user then print(user.id) -- 123 else -- miss is cached end
  20. 20. 18/27 Separate hit/miss caches
  21. 21. 19/27 DNS caching local resolver = require " resty.dns.resolver " local r = resolver.new ({ nameservers = { "1.1.1.1" } }) local function resolve(name) local answers = r:query(name) return answers [1], nil , answers [1] .ttl -- override TTL end local host = "openresty.org" local answers , err = cache:get(host , nil , resolve , host) if err then -- ... end
  22. 22. 20/27 Injected logic local function compile_code(row) row.f = loadstring(row.code) -- once return row end local user , err = cache:get(user_id , { l1_serializer = compile_code }, fetch_code) if err then -- ... end user.f ()
  23. 23. 21/27
  24. 24. 22/27 Cache invalidation worker 0: invalidate item worker 1: poll + re-fetch item cache:delete("user :123") cache:update () cache:get("user :123", nil , fetch_user)
  25. 25. 23/27 A complete solution Negative caching Built-in mutex Caching Lua tables Invalidation events Flexible IPC support Built-in lua-resty-worker-events slact/ngx lua ipc Hit levels tracking
  26. 26. 24/27 In the wild Used in Kong for over a year Contributions from Cloudflare Well tested OpenResty 1.11.2.2 to 1.13.6.2 (current)
  27. 27. 25/27 OpenResty contributions & Improvements New shm API: shm:ttl() & shm:expire() User flags support - openresty/lua-resty-lrucache#35 TODO: A Lua-land R/W lock TODO: A native IPC solution for OpenResty!
  28. 28. 26/27 Q & A
  29. 29. 27/27 Can you replace your caching logic with mlcache? https://github.com/thibaultcha/lua-resty-mlcache Contributions are much welcome!
  • ssuserad616d

    Sep. 28, 2018

In this talk, we will dive into the new "mlcache" library, which aims at providing a simple abstraction for layered caching in OpenResty. We will explore several practical use-cases for it that will help you achieve high-performance goals for your applications.

Views

Total views

909

On Slideshare

0

From embeds

0

Number of embeds

1

Actions

Downloads

13

Shares

0

Comments

0

Likes

1

×