使用nginx+lua脚本读写redis缓存
2023-09-27 14:19:41 时间
配置
新建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地址
第一次由于没有缓存,会进入接口查询
后面继续刷新页面,不会再进入后端接口了
相关文章
- 负载均衡中使用 Redis 实现共享 Session
- Redis现网那些坑:用个缓存,还要为磁盘故障买单?
- 云图说 | 分布式缓存服务DCS—站在开源Redis前辈的肩膀上,扬帆起航
- springboot:redis缓存使用前缀
- Redis学习之路(001)- Redis介绍以及安装(Linux)
- PHP 利用redis 做统计缓存mysql的压力
- Redis Plus 来了,性能炸裂!
- Nginx+Redis+Ehcache:大型高并发与高可用的3层缓存架构总结
- Redis学习三(进阶功能).
- redis——持久化
- 初识Redis的数据类型HyperLogLog
- Redis列表
- 缓存-redis
- 【Redis | 黑马点评 + 思维导图】好友关注、附近商户、用户签到、UV统计
- ehcache memcache redis 三大缓存男高音
- 【转】那些年用过的Redis集群架构(含面试解析)
- 多级缓存-redis缓存预热
- Redis 3.2.4集群实战
- SpringBoot使用@Cacheable实现最简单的Redis缓存
- Jmeter连接Redis,获取Redis数据集
- redis集群设置密码