Nginx之Openresty缓存解读

目录

lua_shared_dict

lua-resty-lrucache

新建

设置

获取

删除

综合使用案例

计数

全部刷新 


lua_shared_dict

语法: lua_shared_dict <名称> <大小>

默认值:

上下文: http

阶段: 取决于使用情况

声明一个共享内存区域 ,<name>作为基于 shm 的 Lua 字典的存储ngx.shared.<name>。共享内存区域始终由当前 Nginx 服务器实例中的所有 Nginx 工作进程共享。该<size>参数接受大小单位,例如km

http {lua_shared_dict shared_data  1;...}
local shared_data = ngx.shared.shared_data  local i = shared_data:get("i")  if not i then  i = 1  shared_data:set("i", i)  ngx.say("lazy set i ", i, "<br/>")  
end  i = shared_data:incr("i", 1)  ngx.say("i=", i, "<br/>")

lua-resty-lrucache

Lua 实现的一个简单的 LRU 缓存,适合在 Lua 空间里直接缓存较为复杂的 Lua 数据结构:它相比 ngx_lua 共享内存字典可以省去较昂贵的序列化操作,相比 memcached 这样的外部服务又能省去较昂贵的 socket 操作

​LRU 缓存完全驻留在 Lua VM 中,并受 Lua GC 的约束。因此,不要期望它能够跨操作系统进程边界共享。好处是您可以缓存任意复杂的 Lua 值(例如深度嵌套的 Lua 表),而无需序列化的开销(与 的ngx_lua共享字典 API一样)。缺点是您的缓存始终仅限于当前操作系统进程(即当前 Nginx 工作进程)。在init_by_lua的上下文中使用这个库并没有多大意义 ,因为缓存不会被任何工作进程共享(除非你只是想用预定义的项目“预热”缓存,这些项目将由工人通过fork())。 ​

新建

syntax: cache, err = lrucache.new(max_items [, load_factor])

创建一个新的缓存实例。失败时,返回nil一个描述错误的字符串。

max_items参数指定此缓存可以容纳的最大项目数。

load-factor参数指定内部使用的基于 FFI 的哈希表的“负载因子” resty.lrucache.pureffi;默认值为0.5(即50%);如果指定了负载因子,则其将被钳制在 的范围内[0.1, 1](即,如果负载因子大于 1,则其将饱和至 1;同样,如果负载因子小于0.1,则其将被钳制至0.1)。这种说法只对 有意义 resty.lrucache.pureffi

设置

syntax: cache:set(key, value, ttl?, flags?)

设置一个带有值和过期时间的键。

当缓存已满时,缓存将自动驱逐最近最少使用的项目。

可选ttl参数指定过期时间。时间值以秒为单位,但您也可以指定小数部分(例如0.25)。 nil ttl参数意味着该值永远不会过期(这是默认值)。

可选flags参数指定与要存储的项目关联的用户标志值。稍后可以将其与该物品一起检索。用户标志在内部存储为无符号 32 位整数,因此必须指定为 Lua 数字。如果未指定,标志将具有默认值0。此参数已添加到v0.10版本中。

获取

syntax: data, stale_data, flags = cache:get(key)

使用键获取值。如果key在缓存中不存在或者已经过期,nil将会被返回。

从 开始v0.03,过时数据也会作为第二个返回值(如果有)返回。

从 开始v0.10,与存储项关联的用户标记值也作为第三个返回值返回。如果没有为某个项目指定用户标志,则其默认标志将为0

删除

syntax: cache:delete(key)

从缓存中删除由键指定的项目。

综合使用案例

新建文件cache.lua

cd /usr/local/openresty/lualib
mkdir my
cd my
vim cache.lua    #内容写下面lua文件代码

lua文件代码:自定义函数

local _M = {}lrucache = require "resty.lrucache"c, err = lrucache.new(200)  -- allow up to 200 items in the cache
ngx.say("count=init")if not c thenerror("failed to create the cache: " .. (err or "unknown"))
endfunction _M.go()count = c:get("count")c:set("count",100)
ngx.say("count=", count, " --<br/>")if not count then  c:set("count",1)ngx.say("lazy set count ", c:get("count"), "<br/>")  elsec:set("count",count+1)ngx.say("count=", count, "<br/>")
endend
return _M

nginx配置文件引用lua文件

#注释掉http中的代码热部署,否则lua文件中每次都会new一个新对象
#lua_code_cache off;
lua_shared_dict shared_data 1m;location /lua {...#content_by_lua_file lua/hello.lua;		#需注释,否则与lua_block冲突content_by_lua_block {require("my/cache").go()}
}

计数

syntax: count = cache:count()

返回当前存储在缓存中的项目数,包括 过期项目(如果有)。

返回的count值将始终大于或等于 0 且小于或等于size给定的参数cache.new。

该方法已添加到v0.10版本中。

全部刷新 

syntax: cache:flush_all()

刷新当前缓存实例中的所有现有数据(如果有)。这是一个O(1)操作,应该比创建全新的缓存实例快得多。但请注意,flush_all()的方法resty.lrucache.pureffi是一个 O(n)操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/94448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带你10分钟学会红黑树

前言&#xff1a; 我们都知道二叉搜索树&#xff0c;是一种不错的用于搜索的数据结构&#xff0c;如果二叉搜索树越接近完全二叉树&#xff0c;那么它的效率就会也高&#xff0c;但是它也存在的致命的缺陷&#xff0c;在最坏的情况下&#xff0c;二叉搜索树会退化成为单链表&am…

字典与数组第七讲:工作表数据计算时为什么要采用数组公式(一)

《VBA数组与字典方案》教程&#xff08;10144533&#xff09;是我推出的第三套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;字典是VBA的精华&#xff0c;我要求学员必学。7.1.3.9教程和手册掌握后&#xff0c;可以解决大多数工作中遇到的实际问题。…

java数据库连接操作合集

import com.alibaba.druid.pool.DruidDataSourceFactory; import org.testng.annotations.Test;import javax.sql.DataSource; import java.io.FileInputStream; import java.sql.*; import java.util.ArrayList; import java.util.Properties; //大概的流程就是:1. 注册驱动 2…

谷歌地球引擎GEE账户注册的快速、百分百成功方法

本文介绍免费注册谷歌地球引擎&#xff08;Google Earth Engine&#xff0c;GEE&#xff09;账户的方便、快捷的最新方法&#xff1b;基于这一方法&#xff0c;只要我们创建一个谷歌Cloud Project&#xff0c;就可以直接访问GEE。 GEE在原本&#xff08;大概前几年的时候&#…

Redis-缓存穿透,缓存击穿,缓存雪崩

缓存穿透&#xff0c;缓存击穿&#xff0c;缓存雪崩 缓存穿透处理方案解决方案1 缓存空数据解决方案2 布隆过滤器 缓存击穿处理方案解决方案 1 互斥锁解决方案2 逻辑过期 缓存雪崩处理方案解决方案 1 给不同的key的过期时间设置添加一个随机值&#xff0c;降低同一个时段大量ke…

处理机调度的概念,层次联系以及七状态模型

1.基本概念 当有一堆任务要处理&#xff0c;但由于资源有限&#xff0c;这些事情没法同时处理。 这就需要确定某种规则来决定处理这些任务的顺序&#xff0c;这就是“调度”研究的问题。 2. 三个层次 1.高级调度&#xff08;作业调度&#xff09; 高级调度&#xff08;作业…

hive数据load到redis

使用shell脚本来实现&#xff0c;脚本如下&#xff1a; #!/bin/bash# 定义变量 pwd/root day$(date %Y%m%d) before_day$(date -d -1day %Y%m%d) log_file$pwd/load_redis_$day.log# 创建目录 mkdir -p $pwd/$day && echo "$(date %Y-%m-%d %H:%M:%S)----$pwd/$d…

【c++11特性】——static_cast,dynamic_cast,const_cast,reinterpret_cast解析

目录 1.static_cast 2.dynamic_cast dynamic_cast为什么只能用于具有虚函数的类&#xff1f; 3.const_cast 4.reinterpret_cast reinterpret_cast 的作用 static_cast 和dynamic_cast的区别&#xff1f; 1.static_cast 概念 static_cast 是C中的一种类型转换运算符&am…

【C++设计模式之模板模式】分析及示例

C之模板模式 描述实现原理示例步骤1步骤1 分析步骤2步骤2 分析调用输出结果 结论 描述 模板模式&#xff08;Template Pattern&#xff09;是设计模式中的一种行为型模式。 该模式定义一个操作中的算法骨架&#xff0c;而将具体的算法实现延迟到子类中。 模板模式使得子类可以…

【10】c++设计模式——>依赖倒转原则

关于依赖倒转原则&#xff0c;对应的是两条非常抽象的描述&#xff1a; 1.高层模块不应该依赖低层模块&#xff0c;两个都应该依赖抽象。 2.抽象不应该依赖细节&#xff0c;细节应该依赖抽象。 先用人话解释一下这两句话中的一些抽象概念&#xff1a; 1.高层模块&#xff1a;可…

ROS(5)PX4仿真安装及运行

1、配置&#xff0c;提升下载速度 启动 $ cd clash-for-linux$ sudo bash start.sh$ source /etc/profile.d/clash.sh$ proxy_on 关闭 $ cd clash-for-linux$ sudo bash shutdown.sh$ proxy_off 2、安装PX4开源无人机 git clone https://github.com/PX4/PX4-Autopilot.git…

【软考】系统集成项目管理工程师(六)项目整体管理【6分】

一、 前言 1、项目管理三从四得 2、ITO共性总结 1、上一个过程的输出大部分是下-个过程的输入 2、计划和文件是不一样的 (每个输入都有计划和文件) 3、被批准的变更请求约等于计划 4、在执行和监控过程产生新的变更请求(变更请求包括变什么和怎么变&#xff0c;这是变更请求和…

Spring三大核心组件

Spring架构图 Spring三大核心组件分别为&#xff1a;Core、Beans和Context 1. Core&#xff08;核心&#xff09;&#xff1a; 思想&#xff1a;Core组件的核心思想是控制反转&#xff08;IoC&#xff09;和依赖注入&#xff08;DI&#xff09;。它将对象的创建、组装和管理的…

Junit的常用操作

注:本篇文章讲解的是junit5 目录 Juint是什么 Juint需要导入的依赖 Juint常用注解 Junit执行顺序 参数化 断言 测试套件 Juint是什么 Juint 是 Java 的一个单元测试框架. 也是回归测试框架. 使用 Junit 能让我们快速的完成单元测试。 注意&#xff1a;Junit 测试也是程序…

调用gethostbyname实现域名解析(附源码)

VC常用功能开发汇总&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&#xff09;https://blog.csdn.net/chenlycly/article/details/124272585C软件异常排查从入门到精通系列教程&#xff08;专栏文章列表&#xff0c;欢迎订阅&#xff0c;持续更新...&a…

踩坑日记 《正确的使用Vuex》基于 uniapp Vue3 setup 语法糖 vuex4 项目 太多坑了要吐了

踩坑日记 《正确的使用Vuex》基于 uniapp Vue3 setup 语法糖 vuex4 项目 太多坑了要吐了 完美解决页面数据不刷新 或者数据慢一步刷新 页面使用html <template><view><template v-if"cartData.data.length>0"><!-- 自定义导航栏 --><…

计算机网络(文章链接汇总)

参考引用 计算机网络微课堂-湖科大教书匠计算机网络&#xff08;第7版&#xff09;-谢希仁 计算机网络&#xff08;一&#xff09;&#xff1a;概述计算机网络&#xff08;二&#xff09;&#xff1a;物理层计算机网络&#xff08;三&#xff09;&#xff1a;数据链路层计算机网…

SystemUI导航栏

SystemUI导航栏 1、系统中参数项1.1 相关开关属性2.2 属性设置代码 2、设置中设置“三按钮”导航更新流程2.1 属性资源覆盖叠加2.2 SystemUI导航栏接收改变广播2.3 SystemUI导航栏布局更新2.4 时序图 android13-release 1、系统中参数项 1.1 相关开关属性 设置->系统->…

测试用例的编写(面试常问)

作者&#xff1a;爱塔居 专栏&#xff1a;软件测试 作者简介&#xff1a;不断总结&#xff0c;才能变得更好~踩过的坑&#xff0c;不能再踩~ 文章简介&#xff1a;常见的几个测试用例。 一、淘宝购物车 二、登录页面 三、三角形测试用例 abc结果346普通三角形333等边三角形334…

【vue 首屏加载优化】

Vue 首屏加载优化指的是通过一系列的技术手段&#xff0c;尽可能地缩短首屏&#xff08;即页面中可见的部分&#xff09;的加载时间&#xff0c;提高用户体验。 以下是一些常见的 Vue 首屏加载优化技巧&#xff1a; 使用 Vue SSR&#xff08;服务端渲染&#xff09;&#xff1…