多级缓存知识

传统的缓存策略一般是请求到达Tomcat后(代码处理),先查询Redis,如果未命中则查询数据库。
问题:请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈。 Redis缓存失效时,会对数据库产生冲击

多级缓存

多级缓存就是充分利用请求处理的每个环节,分别添加缓存,减轻Tomcat压力,提升服务性能
浏览器访问静态资源时,优先读取浏览器本地缓存
访问非静态资源(ajax查询数据)时,访问服务端
请求到达Nginx后,优先读取Nginx本地缓存
如果Nginx本地缓存未命中,则去直接查询Redis(不经过Tomcat)
如果Redis查询未命中,则查询Tomcat
请求进入Tomcat后,优先查询JVM进程缓存
如果JVM进程缓存未命中,则查询数据库

多级缓存的关键有两个:
一个是在nginx中编写业务,实现nginx本地缓存、Redis、Tomcat的查询
另一个就是在Tomcat中实现JVM进程缓存

JVM进程缓存

分布式缓存,例如Redis:
优点:存储容量更大、可靠性更好、可以在集群间共享
缺点:访问缓存有网络开销
场景:缓存数据量较大、可靠性要求较高、需要在集群间共享

进程本地缓存,例如HashMap、GuavaCache:
优点:读取本地内存,没有网络开销,速度更快
缺点:存储容量有限、可靠性较低、无法共享
场景:性能要求较高,缓存数据量较小

Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。
Caffeine既然是缓存的一种,肯定需要有缓存的清除策略,不然的话内存总会有耗尽的时候。

Caffeine提供了三种缓存驱逐策略:
基于容量:设置缓存的数量上限
// 创建缓存对象,设置缓存大小上限为 1
Cache<String, String> cache = Caffeine.newBuilder().maximumSize(1).build();
基于时间:设置缓存的有效时间
// 设置缓存有效期为 10 秒,从最后一次写入开始计时
Cache<String, String> cache = Caffeine.newBuilder().expireAfterWrite(Duration.ofSeconds(10)).build();
基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据

使用:
1.引入依赖:

	<dependency>
        <groupId>com.github.ben-manes.caffeine</groupId>
        <artifactId>caffeine</artifactId>
        <version>2.5.5</version>
    </dependency>

2.注册对应的key-value对象

@Configuration
	public class CaffeineConfig {
    @Bean
    public Cache<Long, Item> itemCache(){
        return Caffeine.newBuilder()
                .initialCapacity(100)
                .maximumSize(10_000)
                .build();
    }}

3.注入使用

// 存数据
    cache.put("gf", "迪丽热巴");

    // 取数据
    String gf = cache.getIfPresent("gf");
    System.out.println("gf = " + gf);

    // 取数据,包含两个参数:
    // 参数一:缓存的key
    // 参数二:Lambda表达式,表达式参数就是缓存的key,方法体是查询数据库的逻辑
    // 优先根据key查询JVM缓存,如果未命中,则执行参数二的Lambda表达式
    String defaultGF = cache.get("defaultGF", key -> {
        // 根据key去数据库查询数据
        return "柳岩";
    });

LUA

变量
– 声明字符串,可以用单引号或双引号,
local str = ‘hello’
– 字符串拼接可以使用 …
local str2 = ‘hello’ … ‘world’
– 声明数字
local num = 21
– 声明布尔类型
local flag = true
– 声明数组 ,key为角标的 table
local arr = {‘java’, ‘python’, ‘lua’}
– 声明table,类似java的map
local map = {name=‘Jack’, age=21}
– 访问数组,lua数组的角标从1开始
print(arr[1])
– 访问table
print(map[‘name’])
print(map.name)

循环

-- 声明数组 key为索引的 table
	local arr = {'java', 'python', 'lua'}
	-- 遍历数组
	for index,value in ipairs(arr) do
		print(index, value) 
	end
	-- 声明map,也就是table
	local map = {name='Jack', age=21}
	-- 遍历table
	for key,value in pairs(map) do
	   print(key, value) 
	end

函数

function printArr(arr)
    for index, value in ipairs(arr) do
        print(value)
    end
	end

条件控制

if(布尔表达式)
then
   --[ 布尔表达式为 true 时执行该语句块 --]
else
   --[ 布尔表达式为 false 时执行该语句块 --]
end
例子:
function printArr(arr)
	if not arr then
		print('数组不能为空!')
	end
	for index, value in ipairs(arr) do
		print(value)
	end
end

OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块
OpenResty 的目标是让你的 Web 服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型。可以直接使用 OpenResty 访问 Mysql或Redis等,而不需要通过第三方语言(PHP、Python、Ruby)等来访问数据库再返回,这大大提高了应用的性能

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值