当前位置: 首页 > news >正文

网站制作设计多少钱百度西安分公司地址

网站制作设计多少钱,百度西安分公司地址,wordpress国内服务器慢,整站网站优化费用1.什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: •请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈 •Redis缓存失效时,会对数据库产生冲击 多级缓存就是充分利用请求处理的每个环节,添加缓…

1.什么是多级缓存

传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图:

存在下面的问题:

•请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈

•Redis缓存失效时,会对数据库产生冲击

多级缓存就是充分利用请求处理的每个环节,添加缓存,减轻Tomcat压力,提升服务性能

  • 浏览器访问静态资源时,优先读取浏览器本地缓存

  • 访问非静态资源(ajax查询数据)时,访问服务端

  • 请求到达Nginx后,优先读取Nginx本地缓存

  • 如果Nginx本地缓存未命中,则去直接查询Redis(不经过Tomcat)

  • 如果Redis查询未命中,则查询Tomcat

  • 请求进入Tomcat后,优先查询JVM进程缓存

  • 如果JVM进程缓存未命中,则查询数据库

在多级缓存架构中,Nginx内部需要编写本地缓存查询、Redis查询、Tomcat查询的业务逻辑,因此这样的nginx服务不再是一个反向代理服务器,而是一个编写业务的Web服务器了

因此这样的业务Nginx服务也需要搭建集群来提高并发,再有专门的nginx服务来做反向代理,如图:

另外,我们的Tomcat服务将来也会部署为集群模式:

可见,多级缓存的关键有两个:

  • 一个是在nginx中编写业务,实现nginx本地缓存、Redis、Tomcat的查询

  • 另一个就是在Tomcat中实现JVM进程缓存

其中Nginx编程则会用到OpenResty框架结合Lua这样的语言。

2.JVM进程缓存

为了演示多级缓存的案例,我们先准备一个商品查询的业务。

2.1.初识Caffeine

缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。我们把缓存分为两类:

  • 分布式缓存,例如Redis:

    • 优点:存储容量更大、可靠性更好、可以在集群间共享

    • 缺点:访问缓存有网络开销

    • 场景:缓存数据量较大、可靠性要求较高、需要在集群间共享

  • 进程本地缓存,例如HashMap、GuavaCache:

    • 优点:读取本地内存,没有网络开销,速度更快

    • 缺点:存储容量有限、可靠性较低、无法共享

    • 场景:性能要求较高,缓存数据量较小

我们今天会利用Caffeine框架来实现JVM进程缓存。

Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。

Caffeine的性能非常好,下图是官方给出的性能对比:

可以看到Caffeine的性能遥遥领先!

缓存使用的基本API:

@Testvoid testBasicOps() {// 构建cache对象Cache<String, String> cache = Caffeine.newBuilder().build();// 存数据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 "柳岩";});System.out.println("defaultGF = " + defaultGF);}

Caffeine既然是缓存的一种,肯定需要有缓存的清除策略,不然的话内存总会有耗尽的时候。

Caffeine提供了三种缓存驱逐策略:

  • 基于容量:设置缓存的数量上限

    // 创建缓存对象
    Cache<String, String> cache = Caffeine.newBuilder()   .maximumSize(1) // 设置缓存大小上限为 1   .build();
  • 基于时间:设置缓存的有效时间

    // 创建缓存对象
    Cache<String, String> cache = Caffeine.newBuilder()   // 设置缓存有效期为 10 秒,从最后一次写入开始计时    .expireAfterWrite(Duration.ofSeconds(10))    .build();
  • 基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用

注意:在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。

2.2.实现JVM进程缓存

2.2.1.需求

利用Caffeine实现下列需求:

  • 给根据id查询商品的业务添加缓存,缓存未命中时查询数据库

  • 给根据id查询商品库存的业务添加缓存,缓存未命中时查询数据库

  • 缓存初始大小为100

  • 缓存上限为10000

2.2.2.实现

首先,我们需要定义两个Caffeine的缓存对象,分别保存商品、库存的缓存数据。

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

@RestController
@RequestMapping("item")
public class ItemController {@Autowiredprivate IItemService itemService;@Autowiredprivate IItemStockService stockService;@Autowiredprivate Cache<Long, Item> itemCache;@Autowiredprivate Cache<Long, ItemStock> stockCache;    // ...其它略@GetMapping("/{id}")public Item findById(@PathVariable("id") Long id) {return itemCache.get(id, key -> itemService.query().ne("status", 3).eq("id", key).one());}@GetMapping("/stock/{id}")public ItemStock findStockById(@PathVariable("id") Long id) {return stockCache.get(id, key -> stockService.getById(key));}
}

3.Lua语法入门

Nginx编程需要用到Lua语言,因此我们必须先入门Lua的基本语法。

3.1.初识Lua

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。官网:The Programming Language Lua

Lua经常嵌入到C语言开发的程序中,例如游戏开发、游戏插件等。

Nginx本身也是C语言开发,因此也允许基于Lua做拓展。

3.1.HelloWorld

CentOS7默认已经安装了Lua语言环境,所以可以直接运行Lua代码。

1)在Linux虚拟机的任意目录下,新建一个hello.lua文件

2)添加下面的内容

print("Hello World!")  

3)运行

任意地方输出lua便可进入lua控制台

3.2.变量和循环

学习任何语言必然离不开变量,而变量的声明必须先知道数据的类型。

3.2.1.Lua的数据类型

Lua中支持的常见数据类型包括:

另外,Lua提供了type()函数来判断一个变量的数据类型

3.2.2.声明变量

Lua声明变量的时候无需指定数据类型,而是用local来声明变量为局部变量

-- 声明字符串,可以用单引号或双引号,

local str = 'hello'

-- 字符串拼接可以使用 ..

local str2 = 'hello' .. 'world'

-- 声明数字

local num = 21

-- 声明布尔类型

local flag = true

Lua中的table类型既可以作为数组,又可以作为Java中的map来使用。数组就是特殊的table,key是数组角标而已:

-- 声明数组 ,key为角标的 table

local arr = {'java', 'python', 'lua'}

-- 声明table,类似java的map

local map = {name='Jack', age=21}

Lua中的数组角标是从1开始,访问的时候与Java中类似:

-- 访问数组,lua数组的角标从1开始

Lua中的table可以用key来访问:

-- 访问table
print(map['name'])
print(map.name)

3.2.3.循环

对于table,我们可以利用for循环来遍历。不过数组和普通table遍历略有差异。

遍历数组:

-- 声明数组 key为索引的 table          数组——ipairs

local arr = {'java', 'python', 'lua'}

-- 遍历数组

for index,value in ipairs(arr) do

        print(index, value)

end

遍历普通table

-- 声明map,也就是table          map-pairs
local map = {name=

http://www.hengruixuexiao.com/news/43225.html

相关文章:

  • 做网站和网页的目的和作用武汉it培训机构排名前十
  • 旅游微网站建设第一接单网app地推和拉新
  • 武汉seo搜索引擎优化天津的网络优化公司排名
  • 上海大型网站制作公司百度云网盘网页版登录
  • 莱芜找工作网站搜盘 资源网
  • 做短视频网站线上推广渠道有哪些方式
  • 大连网站推广公司中小企业管理培训课程
  • 网站扁平结构泉州百度网站推广
  • 赌博类网站开发seo基础课程
  • cms织梦织梦修改网站源码网站开发技术
  • 让人做网站需要注意哪些问题seo网站推广工作内容
  • 山西大同网站建设价格seo品牌优化百度资源网站推广关键词排名
  • 小辰青岛网站建设爱站之家
  • 陕西做网站公司哪家好网域名查询地址
  • 软件前端开发工程师长春seo排名扣费
  • 石景山区住房城乡建设委官方网站外贸seo网站
  • 在哪家网站做推广好电商平台
  • 软件设计师怎么考重庆seo排名收费
  • 烟台市最好的专业做网站的公司网站建设一条龙
  • 2017年做网站多少钱搜索引擎优化关键词选择的方法有哪些
  • 建设银行审计招聘网站优化系统软件
  • 网站登陆验证怎么用java做百度游戏中心app
  • wordpress 网站维护sem是什么牌子
  • 上海网站开发学校有哪些怎么做好网络推广销售
  • 网站建设进展情况汇报徐州网络推广服务
  • 兰州网站seo长尾关键词优化
  • 网站做微信支付功能站长工具百度
  • 专业彩票网站开发上海百度搜索优化
  • 做搜狗手机网站优化首安卓嗅探app视频真实地址
  • phpcms仿行业网站如何联系百度人工客服电话