首页 > 数据库 >Openresty(lua+nginx)-Guava-Redis做多级缓存-阿里云开发者社区

Openresty(lua+nginx)-Guava-Redis做多级缓存-阿里云开发者社区

时间:2024-12-18 15:54:21浏览次数:4  
标签:缓存 lua -- Redis redis local --- nginx ngx

Openresty(lua+nginx)-Guava-Redis做多级缓存-阿里云开发者社区



https://www.aliyun.com/ai-assistant备案控制台

开发者社区开发与运维文章正文

Openresty(lua+nginx)-Guava-Redis 做多级缓存

2024-03-2876 发布于海南

版权

举报

版权声明:

本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和 《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

本文涉及的产品

云数据库 Tair(兼容 Redis),内存型 2GB

推荐场景:

通过缓存加速数据库访问

Redis 开源版,标准版 2GB

推荐场景:

搭建游戏排行榜

简介: Openresty(lua+nginx)-Guava-Redis 做多级缓存

  1. 开辟一块内存空间
    在 Nginx 配置文件 conf/nginx.conf 中开启了一个内存大小为 128M 的内存空间,用来存储缓存数据;
  2. 定义内存字典业务实现 lua 脚本 memory_shared_dic_java.lua(添加缓存,获取缓存)
---
--- 基于lua+Openresty实现内存字典,直接访问redis缓存
--- 引入Redis lua库文件
local red = require "resty.redis"
--- 调用new方法,获取redis对象
local redis = red:new()
--
local password = "123456";
-- 设置一下redis密码
redis:auth(password)
redis:select(0)
--- 1、实现缓存的添加操作
function set_to_cache(key,value,expr)
    if not expr then
        expr = 0
    end
    --- 获取本地内存字典对象
    local ngx_cache = ngx.shared.ngx_cache
    --- 向内存字典中添加缓存数据
    local succ,err,forcible = ngx_cache:set(key,value,expr)
    return succ
end
--- 2、从内存字典中获取缓存数据
function get_from_cache(key)
    --- 获取本地内存字典对象
    local ngx_cache = ngx.shared.ngx_cache
    --- 从内存字典中获取数据缓存
    local res = ngx_cache:get(key)
    -- 如果内存字典缓存不存在
    if not res then
        -- 查询redis缓存数据
        local rev,err = get_from_redis(key)
        if not rev then
            ngx.say("redis cache not exists",err)
            return
        end
        -- 添加到本地内存字典
        set_to_cache(key,rev,60)
    end
    return res
end
--- 向redis添加缓存数据
function set_to_redis(key,value)
    -- 设置连接Redis的超时时间
    redis:set_timeout(10000)
    -- 连接redis服务器
    local ok,err = redis:connect("172.17.61.90",6379)
    -- 判断连接redis服务是否成功
    if not ok then
        ngx.say("failed to connect:",err)
        return
    end
    -- 如果连接成功,向redis添加缓存数据
    local succ,err = redis:set(key,value)
    if not succ then
        ngx.say("failed set redis:",err)
        return
    end
    return succ
end
-- 从Redis中获取缓存数据
function get_from_redis(key)
    -- 设置连接Redis的超时时间
    redis:set_timeout(10000)
    -- 连接redis服务器
    local ok,err = redis:connect("172.17.61.90",6379)
    -- 判断连接redis服务是否成功
    if not ok then
        ngx.say("failed to connect:",err)
        return
    end
    -- 从Redis中获取缓存数据
    local succ,err = redis:get(key)
    if not succ then
        ngx.say("failed get redis:",err)
        return
    end
    ngx.say("get cache from redis......")
    return succ
end
--- 3、内存字典缓存响应业务实现
--- 获取请求参数
local params = ngx.req.get_uri_args()
--- 获取参数属性值
local  id = params.id
--- 从内存字典中获取数据缓存
local goods = get_from_cache("seckill_goods_"..id)
--- 判断内存字典中是否存在缓存数据,如果不存在,将会去查询后端服务数据
if goods == nil then
    -- 从后端服务查询数据
    local  result = ngx.location.capture("/seckill/goods/detail/"..id)
    goods = result.body
    -- 向内存字典中添加缓存数据
    set_to_cache("seckill_goods_"..id,goods,60)
end
-- 输出结果
ngx.say(goods)

这个 lua 脚本写好后,上传到 Nginx/conf 同级目录 lua 目录下,并且在 nginx.conf 文件中配置,然后 sbin/nginx -s reload 生效:

  1. java 中代码

添加 guava 依赖

<dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>18.0</version>
        </dependency>
@Autowired
      private SeckillGoodsMapper seckillGoodsMapper;
      //注入redistemplate对象
      @Autowired
      private RedisTemplate redisTemplate;
      //注入guva缓存对象
      @Autowired
      private Cache<String,Object> guavaCahce; 
  public TbSeckillGoods findOneByCache(Integer id){
            //1、先从jvm堆缓存中读取数据,使用guva缓存
            TbSeckillGoods seckillGoods = (TbSeckillGoods) guavaCahce.getIfPresent("seckill_goods_"+id);
            //判断jvm堆内缓存是否存在
            if(seckillGoods == null){
                  //2、从分布式缓存中查询
                  seckillGoods = (TbSeckillGoods) redisTemplate.opsForValue().get("seckill_goods_"+id);
                  //判断
                  if(seckillGoods == null){
                        //3、直接从数据库查询
                        seckillGoods = seckillGoodsMapper.selectByPrimaryKey(id);
                        if(seckillGoods != null && seckillGoods.getStatus() == 1){
                              //添加缓存
                              redisTemplate.opsForValue().set("seckill_goods_"+id,seckillGoods,1,TimeUnit.HOURS);
                        }
                  }
                  //添加guava缓存
                  guavaCahce.put("seckill_goods_"+id,seckillGoods);
           }
            //如果缓存存在,返回Redis缓存
            return seckillGoods;
          
      }

标签:缓存,lua,--,Redis,redis,local,---,nginx,ngx
From: https://www.cnblogs.com/ypjj/p/18615140/openreasty-lua-nginx-guavaredis-do-multiglass-cach

相关文章

  • NPM,可视化的Nginx管理工具
    NPM,可视化的Nginx管理工具前言NPM,全称:NginxProxyManager,是一款可视化的Nginx的管理工具。众所周知,Nginx的配置文件对于新手尤其是我这样的小白,还是很难上手配置的。虽然说现在可以使用AI,大大降低了理解,配置难度,但是可视化的配置仍然具有很大的优势,极大的降低了我们使用的门......
  • LUA入门
    LUAlua版本(5.1+)当前多数模块对lua的版本都是5.1以上,因此要注意版本。luarocksLuarocks是一个用于Lua编程语言的包管理器。类似java中的maven,python中的pip。luarocks可从网址查看是否具有响应的包,网址:https://luarocks.org/luarocksinstalllpeg2.5对于手动下载......
  • 不同操作系统下安装Nginx的常见方法
    Ubuntu/Debian系统更新软件包列表在终端中输入以下命令来更新系统的软件包列表:sudoapt-getupdate这一步是为了确保系统获取到最新的软件包信息,包括Nginx的相关信息。安装Nginx执行安装命令:sudoapt-getinstallnginx安装过程中,系统会自动下载并配置Nginx相......
  • 常见的Linux系统(以Ubuntu为例)中安装Redis的步骤
    一、安装准备更新系统软件包列表在安装Redis之前,先更新系统的软件包列表,以确保可以获取最新版本的Redis及其依赖项。在终端中执行以下命令:sudoapt-getupdate这个命令会从软件源服务器获取最新的软件包信息,包括软件包的版本、依赖关系等更新内容。安装编译工具和依......
  • redis 主从复制
    redis主从复制从节点启动时复制的完整流程slavenode启动,仅仅保存masternode的信息,包括masternode的host和ip,但是复制流程没开始,masterhost和ip是从哪儿来的,redis.conf里面的slaveof配置的slavenode内部有个定时任务,每秒检查是否有新的masternode要连接和复制,如果发现,就......
  • Redis应用—5.Redis相关解决方案
    大纲1.数据库与缓存一致性方案2.热key探测系统处理热key问题3.缓存大value监控和切分处理方案4.Redis内存不足强制回收监控告警方案5.Redis集群缓存雪崩自动探测+限流降级方案6.缓存击穿的解决方法 线上Redis比较严重的问题排序是:数据库和缓存一致性、热key、大value、......
  • Redis篇之Redis高可用模式参数调优,提高Redis性能
    1.Redis高可用模式核心Redis高可用模式的核心是使用主从复制和自动故障转移机制来确保系统在某些节点发生故障时仍然可以正常工作。常用的高可用架构包括RedisSentinel模式和RedisCluster模式,其中Sentinel模式是为了提供高可用性而专门设计的解决方案。在RedisSent......
  • Redis从基础到深入
    Redis从基础到深入一、Redis是什么?Redis是一个开源的高性能键值存储、内存操作的数据库,支持多种数据结构,如字符串、哈希、列表、集合、有序集合等,广泛应用于缓存、消息队列、实时分析等场景。二、常见的数据类型String:最基本的数据类型,可存储字符串、整数、浮点数。Ha......
  • Redis的使用--排行榜实现
    在项目中,我们常对于能在某段时间内持续使用的数据添加到缓存中,以便于能更快的做出响应和减少对数据库的操作,例如一些图片数据,并衍生出如后端防抖,限时的短信验证码校验,这里我们主要是对排行榜功能的实现在地球生做Java后端的你,如果遇到一个需求是实现排行榜功能:一定会在第一时......
  • docker 搭建redis一主两三哨兵(redis:6.2.14-alpine)
     前言   一般来说,因为性能,安全,持久化等问题,docker搭建的环境时很少推荐用来当生产环境的,但是最近公司的一个项目居然要用docker来搭建生产环境,没办法,客户就时上帝,客户说啥就是啥。  当然这次部署还有用docker部署nacos集群、minio集群、mysql主从、rabbitmq集群,......