`

openresty缓存

 
阅读更多
shared dict:这个cache是nginx所有worker之间共享的,内部使用的LRU算法(最近最少使用)来判断缓存是否在内存占满时被清除。

function get_from_cache(key)
    local cache_ngx = ngx.shared.my_cache
    local value = cache_ngx:get(key)
    return value
end

function set_to_cache(key, value, exptime)
    if not exptime then
        exptime = 0
    end

    local cache_ngx = ngx.shared.my_cache
    local succ, err, forcible = cache_ngx:set(key, value, exptime)
    return succ
end

set_to_cache('a',1,1000)
ngx.say(get_from_cache('a'))



lru catch:这个cache是worker级别的,不会在nginx wokers之间共享。并且,它是预先分配好key的数量,而shared dcit需要自己用key和value的大小和数量,来估算需要把内存设置为多少。

local _M = {}

-- alternatively: local lrucache = require "resty.lrucache.pureffi"
local lrucache = require "resty.lrucache"

-- we need to initialize the cache on the Lua module level so that
-- it can be shared by all the requests served by each nginx worker process:
local c = lrucache.new(200)  -- allow up to 200 items in the cache
if not c then
    return error("failed to create the cache: " .. (err or "unknown"))
end

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

c:set("dog", { age = 10 }, 0.1)  -- expire in 0.1 sec
c:delete("dog")



shared.dict 使用的是共享内存,每次操作都是全局锁,如果高并发环境,不同worker之间容易引起竞争。所以单个shared.dict的体积不能过大。lrucache是worker内使用的,由于nginx是单进程方式存在,所以永远不会触发锁,效率上有优势,并且没有shared.dict的体积限制,内存上也更弹性,但不同worker之间数据不同享,同一缓存数据可能被冗余存储。+

你需要考虑的,一个是Lua lru cache提供的API比较少,现在只有get、set和delete,而ngx shared dict还可以add、replace、incr、get_stale(在key过期时也可以返回之前的值)、get_keys(获取所有key,虽然不推荐,但说不定你的业务需要呢);第二个是内存的占用,由于ngx shared dict是workers之间共享的,所以在多worker的情况下,内存占用比较少。
分享到:
评论

相关推荐

    Openresty 缓存策略.pdf

    - 启动缓存加载策略:设计Guardian前端启动时直接从Redis加载付费信息缓存,避免因OpenResty缓存为空造成的热点问题。 - 保证数据一致性:通过定时任务将SharedDICT数据推送到Redis,确保缓存数据的准确性。 - ...

    Openresty 缓存策略.zip

    1. **缓存类型**:OpenResty 支持两种主要的缓存类型:内存缓存(Memory Cache)和磁盘缓存(Disk Cache)。内存缓存速度快但容量有限,适合存放热数据;磁盘缓存则可以存储大量数据,但读写速度相对较慢。 2. **...

    OpenResty1.25版本安装包

    LuaJIT与Nginx结合,使得开发者可以通过Lua编写高性能的网络应用,包括API网关、负载均衡器、缓存系统等。在OpenResty 1.25.3.1中,可能已经包含了一些LuaJIT的最新优化,以提高脚本性能。 此外,OpenResty还提供了...

    openresty源码(openresty-1.19.9.1.tar.gz)

    OpenResty通过`lua_shared_dict`指令支持在Nginx内部共享内存数据结构,这在处理高并发场景下非常有用,比如实现会话持久化或者缓存。 OpenResty的源码中还包含了一系列的第三方库,如`lualib/`目录下的各种Lua库,...

    openresty官方学习资料

    读者会学习到如何利用OpenResty进行反向代理、负载均衡、缓存管理等常见的Web服务任务。此外,书中还会深入讲解OpenResty的API接口,包括Nginx的HTTP模块、Stream模块,以及Lua API,帮助读者熟悉OpenResty的核心...

    OpenResty教程,OpenResty使用教程

    OpenResty教程,OpenResty使用教程 OpenResty是大并发服务器的不错选择,可实现数据校验前置、缓存前置、数据过滤、API请求聚合、认证管理、负载均衡、流量控制、灰度发布、降级、监控等功能

    openresty-1.19.3.1-win64.zip

    通过OpenResty,我们可以将Nginx的功能扩展到动态内容生成、API处理、缓存控制等多个领域,同时保持Nginx的高性能特性。 二、LuaJIT的集成 LuaJIT是一个高效的Lua虚拟机实现,支持即时编译,使得Lua代码能够接近...

    Openresty二进制版本(openresty-1.19.9.1-win32.zip)

    - **动态扩展性**:通过Lua脚本,开发者可以在不重启Nginx的情况下实现动态功能扩展,如路由规则、认证、限流、缓存等。 - **丰富的库支持**:OpenResty预装了许多Lua库,如Lrexlib(正则表达式库)、LuaCosocket...

    OpenResty的现状、趋势、使用及学习方法1

    OpenResty的主要应用场景包括:处理和整合来自不同上游服务(如Proxy、Postgres、Redis、Memcached等)的数据,执行复杂的访问控制和安全检测,动态修改响应头信息,从外部存储服务获取数据以选择合适的后端,编写...

    openresty1.13.6.2

    通过将LuaJIT嵌入到Nginx中,OpenResty允许用户利用Lua语言的强大功能来编写复杂的HTTP应用,实现路由分发、会话管理、缓存控制、API接口处理等功能,而无需依赖外部的后端服务。 在"压缩包子文件的文件名称列表"中...

    OpenResty Best Practices.pdf

    此外,书中还涉及到了Nginx的热更新、代码调试、日志记录的最佳实践,以及如何通过lua-resty-lock处理并发问题和缓存失效。 最后,书中提到了一些高级主题,如调用C函数、使用stream_lua_module实现TCP代理负载、...

    openresty-1.21.4.1-win64.zip 包下载

    OpenResty 结合 Nginx 和 Lua,让开发者可以直接在 Nginx 的配置文件中编写 Lua 代码,实现动态逻辑处理,如路由分发、数据缓存、API 调用等。这使得 OpenResty 成为了构建 RESTful API、微服务、动态网站等复杂 Web...

    openresty-1.19.9.1-win64.zip

    3. **缓存服务**: 利用OpenResty的缓存模块,可以快速响应重复请求,减轻后端数据库的压力。 4. **日志处理**: Lua脚本可以直接处理Nginx的日志,实现日志分析、监控等功能。 四、进阶实践 1. **Lua与Nginx的协同...

    openresty源码包,包含pcre zlib openssl等依赖

    通过集成LuaJIT,OpenResty允许开发者使用Lua语言编写高性能的Web应用逻辑,包括动态路由、会话管理、缓存控制等,同时保持Nginx的高性能和稳定性。 在获取到这些源码包后,你需要按照以下步骤来编译和安装...

    2 OpenResty+Lua+Redis 高性能后端接口.docx

    在本文中,我们将使用 OpenResty、Lua 和 Redis 实现高性能的后端接口,用于广告数据的缓存和查询。 一、 需求分析 在类似网易云课堂首页的广告数据显示中,我们需要实现高性能的后端接口,来支持大量的用户请求和...

    openresty 入门

    在 OpenResty 中,代码的执行阶段概念、日志记录、热代码装载、缓存处理、定时任务执行等都是构建高性能 Web 应用的关键。此外,OpenResty 提供了动态限速、请求中断后的处理、Lua 代码调优等高级特性,需要开发者在...

    ubuntu下搭建ngx_openresty环境

    在本文中,我们将详细介绍ubuntu下搭建ngx_openresty环境的步骤,包括安装mysql数据库、memcached缓存系统和ngx_openresty框架。 安装libxml2 在ubuntu下安装libxml2库是ngx_openresty环境的前提条件。libxml2库...

    openresty+nginx环境安装配置.docx

    Nginx 配置文件中还包括 http 服务设置,定义文件扩展名与类型映射表、默认文件类型、字符编码、服务器名字的 hash 表大小、客户端头缓存大小、上传文件大小限制等。 在 Nginx 配置文件中,还可以 include proxy....

    Openresty二进制版本(openresty-1.19.9.1-win64.zip)

    OpenResty集成了大量Nginx模块,包括用于HTTP、TCP、UDP、SSL/TLS协议的处理模块,以及用于内容压缩、缓存、日志记录等功能的模块。标题提到的"openresty-1.19.9.1-win64.zip"是OpenResty的一个二进制发行版,适用于...

    高并发的优化lua + openresty+redis (实现多级缓存)+限流(掌握)

    高并发的优化lua + openresty+redis (实现多级缓存)+限流(掌握)

Global site tag (gtag.js) - Google Analytics