使用nginx+lua脚本读写redis缓存
2024-08-31 05:32:24
配置
新建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地址
第一次由于没有缓存,会进入接口查询
后面继续刷新页面,不会再进入后端接口了
最新文章
- ZK 代码自动提示
- WCF大文件传输
- 用nginx-gridFS读取MongoDB的图片及文件(为什么你老是配不成功?)
- MyEclipse — Maven+Spring+Struts+Hibernate 整合 [学习笔记-3]
- python 学习(一)
- 01 MySQL锁概述
- Linux shell 脚本攻略之统计文件的行数、单词数和字符数
- Bzoj 1565: [NOI2009]植物大战僵尸 最大权闭合图,拓扑排序
- c#面向对象小结
- Target runtime Apache Tomcat v6.0 is not defined.	phyy	Unknown	Faceted Project Problem
- 给一个Unix域套接字bind一个路径名
- 基于mpvue搭建微信小程序
- java第一章抽象和封装
- flask 连接MogoDB数据库
- ThreeJS笔记(一)
- Git安装及密钥的生成(转)
- .Net Core + NGINX跳转登录时端口丢失
- Android图片加载框架最全解析(八),带你全面了解Glide 4的用法
- 使用XTU降低CPU功耗,自动执行不失效
- 【BZOJ4724】[POI2017]Podzielno 数学+二分
热门文章
- stack 栈
- 用Thymeleaf在前台下拉列表取值
- Dirichlet&#39;s Theorem on Arithmetic Progressions
- pom.xml报错:Failure to find org.apache.maven.doxia:doxia-logging-api:jar:1.1 in http://repo.
- 关于sklearn中的导包交叉验证问题
- A - Supermarket
- 单个句子<;code>; 多行代码显示<;pre>; 键盘输入<;kbd>;
- ORA-03113 ---end-of-file on communication channel 解决方案记录
- SQL SERVER2012 安装
- 安卓代码迁移:Make.exe: *** [***.o]Error 1