使用nginx+lua脚本读写redis缓存

本文介绍如何在Spring Boot项目中引入Redis依赖并实现数据缓存。通过具体代码示例展示了如何使用RedisTemplate进行数据的读写操作,并利用OpenResty实现Lua脚本对Redis数据的读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

配置

新建spring boot项目增加redis配置

        <dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-redis</artifactId>
		</dependency>

在需要缓存的地方增加redis缓存

package com.example.sharding.service;

import com.alibaba.fastjson.JSON;
import com.example.sharding.entity.Order;
import com.example.sharding.mapper.OrderMapper;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.io.IOException;
import java.util.List;

@Service
@Transactional
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    public Object findAll() throws IOException {
        List<Order> orders = orderMapper.selectAll();
        ObjectMapper mapper = new ObjectMapper();
        redisTemplate.opsForValue().set("orders",mapper.writeValueAsString(orders));
        return orders;
    }

    public void save(Order order) {
        orderMapper.insert(order);
        redisTemplate.opsForHash().put("order",order.getOrderId().toString(), JSON.parseObject(JSON.toJSONString(order)).toJSONString());
    }

    public void deleteAll() {
        orderMapper.deleteAll();
        redisTemplate.delete("order");
        redisTemplate.delete("orders");
    }
}

修改example.conf

server {
    listen       80;  
    server_name  _;  
  
    location = /order {  
	    default_type 'text/html';  
	    lua_code_cache off;  
	    content_by_lua_file C:\work\openresty-1.13.6.1-win32\example\lua/test_redis_basic.lua;  
	}

    location /lua {
        default_type 'text/html';  
        lua_code_cache off;  
        content_by_lua_file C:\work\openresty-1.13.6.1-win32\example\lua/test.lua;  
    }

    # 其他请求回源到tomcat
    location / {  
    	proxy_pass http://tomcat/; 
	}  

}

# 后端服务地址
upstream tomcat {  
    server 127.0.0.1:8080 max_fails=5 fail_timeout=10s weight=1; 
    keepalive 100;  
}  

修改test_redis_basic.lua文件

local function close_redis(red)  
    if not red then  
        return  
    end  
    local ok, err = red:close()  
    if not ok then  
        ngx.say("close redis error : ", err)  
    end  
end  


local function read_order()  
    local resp = ngx.location.capture("/order/query", {  
        method = ngx.HTTP_GET
    })  
    if not resp then  
        return  
    end  
    if resp.status ~= 200 then   
        return  
    end  
    return resp.body  
end  

  
local redis = require("resty.redis")  
local cjson = require("cjson")  -- 引入json模块
  
--创建实例  
local red = redis:new()  
--设置超时(毫秒)  
red:set_timeout(1000)  
--建立连接  
local ip = "127.0.0.1"  
local port = 6379  
local ok, err = red:connect(ip, port)  
if not ok then  
    ngx.say("connect to redis error : ", err)  
    return close_redis(red)  
end 

local res, err = red:auth("shiyuesoft")
if not res then
    ngx.say("failed to authenticate: ", err)
    return
end
  
--调用API获取数据  
local resp, err = red:get("orders")
if not resp then  
    ngx.say("get msg error : ", err)  
    return close_redis(red)  
end  
--得到的数据为空处理  
if resp == ngx.null then  
    resp = read_order()  --回源到tomcat去查询
end  
ngx.say(cjson.decode(resp))  --对返回的数据转换成json对象
  
close_redis(red)  

先请求deleteAll删除所有缓存

新增order数据

访问/order地址

第一次由于没有缓存,会进入接口查询

后面继续刷新页面,不会再进入后端接口了

转载于:https://www.cnblogs.com/weiguoaa/p/8971194.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值