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

廊坊网站排名优化公司织梦末班和dw建设网站哪个方便优化

廊坊网站排名优化公司,织梦末班和dw建设网站哪个方便优化,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.2.初识Caffeine 缓存在日常开发中启动至关重要的作用,由于是存储在内存中,数据的读取速度是非常快的,能大量减少对数据库的访问,减少数据库的压力。我们把缓存分为两类: 分布式缓存,例如Redis: 优点:存储容量更大、可靠性更好、可以在集群间共享缺点:访问缓存有网络开销场景:缓存数据量较大、可靠性要求较高、需要在集群间共享 进程本地缓存,例如HashMap、GuavaCache: 优点:读取本地内存,没有网络开销,速度更快缺点:存储容量有限、可靠性较低、无法共享场景:性能要求较高,缓存数据量较小 利用Caffeine框架来实现JVM进程缓存。 Caffeine是一个基于Java8开发的,提供了近乎最佳命中率的高性能的本地缓存库。目前Spring内部的缓存使用的就是Caffeine。GitHub地址:https://github.com/ben-manes/caffeine 缓存使用的基本API: @Test void testBasicOps() {// 构建cache对象CacheString, 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提供了三种缓存驱逐策略: 基于容量:设置缓存的数量上限 // 创建缓存对象 CacheString, String cache = Caffeine.newBuilder().maximumSize(1) // 设置缓存大小上限为 1.build();基于时间:设置缓存的有效时间 // 创建缓存对象 CacheString, String cache = Caffeine.newBuilder()// 设置缓存有效期为 10 秒,从最后一次写入开始计时 .expireAfterWrite(Duration.ofSeconds(10)) .build(); 基于引用:设置缓存为软引用或弱引用,利用GC来回收缓存数据。性能较差,不建议使用。 注意:在默认情况下,当一个缓存元素过期的时候,Caffeine不会自动立即将其清理和驱逐。而是在一次读或写操作后,或者在空闲时间完成对失效数据的驱逐。 2.3.实现JVM进程缓存 2.3.1.需求 利用Caffeine实现下列需求: 给根据id查询商品的业务添加缓存,缓存未命中时查询数据库给根据id查询商品库存的业务添加缓存,缓存未命中时查询数据库缓存初始大小为100缓存上限为100002.3.2.实现 首先,我们需要定义两个Caffeine的缓存对象,分别保存商品、库存的缓存数据。 在item-service的com.heima.item.config包下定义CaffeineConfig类: package com.heima.item.config;import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; import com.heima.item.pojo.Item; import com.heima.item.pojo.ItemStock; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration;@Configuration public class CaffeineConfig {@Beanpublic CacheLong, Item itemCache(){return Caffeine.newBuilder().initialCapacity(100).maximumSize(10_000).build();}@Beanpublic CacheLong, ItemStock stockCache(){return Caffeine.newBuilder().initialCapacity(100).maximumSize(10_000).build();} }然后,修改item-service中的com.heima.item.web包下的ItemController类,添加缓存逻辑: @RestController @RequestMapping("item") public class ItemController {@Autowiredprivate IItemService itemService;@Autowiredprivate IItemStockService stockService;@Autowiredprivate CacheLong, Item itemCache;@Autowiredprivate CacheLong, 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语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。官网:https://www.lua.org/ 3.1.HelloWorld CentOS7默认已经安装了Lua语言环境,所以可以直接运行Lua代码。 1)在Linux虚拟机的任意目录下,新建一个hello.lua文件 2)添加下面的内容 print("Hello World!") 3)运行 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 = trueLua中的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开始 print(arr[1])Lua中的table可以用key来访问: -- 访问table print(map['name']) print(map.name)3.2.3.循环 对于table,我们可以利用for循环来遍历。不过数组和普通table遍历略有差异。 遍历数组: -- 声明数组 key为索引的 table local arr = {'java', 'python', 'lua'} -- 遍历数组 for index,value in ipairs(arr) doprint(index, value) end遍历普通table -- 声明map,也就是table local map = {name='Jack', age=21} -- 遍历table for key,value in pairs(map) doprint(key, value) end3.3.条件控制、函数 Lua中的条件控制和函数声明与Java类似。 3.3.1.函数 定义函数的语法:
http://www.ho-use.cn/article/10823576.html

相关文章:

  • h5 技术做健康类网站为企业做一个网站多少钱
  • 建设厅官方网站河南国内外c2c网站有哪些
  • 做泥软件下载官方网站户型单页设计
  • 网站建设找谁好php 怎么做 网站 图片
  • 临沂做网站费用创意营销策划方案
  • 建设京东类的网站需要什么流程图网站建设用款
  • 怎么做电商网站推广网站建设结构图下载
  • 网站后台页面设计ideas wordpress theme 2.0
  • 自己可以自己做公司的网站吗在线做初中题网站
  • 微信公众网站怎么做的深圳注册贸易公司网上注册流程
  • 网站域名设计方案山东三强建设咨询有限公司网站
  • 网站开发逻辑多用户商城系统在哪里找
  • 建设路小学查分网站网页平面设计作品
  • 企业网站推广的收获与启示推广渠道方式
  • php网站开发前言c2c模式分类
  • wordpress站内信公众号微网站建设
  • 网站建设的3个阶段北湖区网站建设服务商
  • 开发网站需要怎么做怎么做有趣的短视频网站
  • 做优惠券网站赚钱吗建设一个网站需要哪些人员参与
  • 比较好的建立站点wordpress博客头图怎么改
  • 官方网站 建设情况汇报网站连接数据库失败怎么办
  • 建设博物馆网站温州手机网站建设wmwl
  • 抖音代运营是做什么优化建议
  • 辽阳哪里做网站网页与网站设计说明
  • 优秀网站设计推荐怎么把wordpress后台设置成中文
  • wordpress php最大输出变量长沙企业网站排名优化
  • 高端品牌建站wordpress预约插件
  • 中国建设银行春季招聘网站中国建设网官方网站平台
  • 做音乐网站的条件网站开发经理岗位职责
  • 郴州网站建设服务网站开发认证考试