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

做网站栏目都包括什么企业网站服务器多少钱

做网站栏目都包括什么,企业网站服务器多少钱,建设工程程序的七大阶段,网站推广有哪些方案缓存数据同步的常见方式有三种#xff1a; 设置有效期#xff1a;给缓存设置有效期#xff0c;到期后自动删除。再次查询时更新 优势#xff1a;简单、方便缺点#xff1a;时效性差#xff0c;缓存过期之前可能不一致场景#xff1a;更新频率较低#xff0c;时效性要…缓存数据同步的常见方式有三种 设置有效期给缓存设置有效期到期后自动删除。再次查询时更新 优势简单、方便缺点时效性差缓存过期之前可能不一致场景更新频率较低时效性要求低的业务 同步双写在修改数据库的同时直接修改缓存 优势时效性强缓存与数据库强一致缺点有代码侵入耦合度高场景对一致性、时效性要求较高的缓存数据 异步通知 修改数据库时发送事件通知相关服务监听到通知后修改缓存数据 优势低耦合可以同时通知多个缓存服务缺点时效性一般可能存在中间不一致状态场景时效性要求一般有多个服务需要同步 而异步实现又可以基于MQ或者Canal来实现 1基于MQ的异步通知 解读 商品服务完成对数据的修改后只需要发送一条消息到MQ中。缓存服务监听MQ消息然后完成对缓存的更新 依然有少量的代码侵入。 2基于Canal的通知 解读 商品服务完成商品修改后业务直接结束没有任何代码侵入Canal监听MySQL变化当发现变化后立即通知缓存服务缓存服务接收到canal通知更新缓存 代码零侵入 1. 认识Canal Canal [kənæl]译意为水道/管道/沟渠canal是阿里巴巴旗下的一款开源项目基于Java开发。基于数据库增量日志解析提供增量数据订阅消费。GitHub的地址https://github.com/alibaba/canal Canal是基于mysql的主从同步来实现的MySQL主从同步的原理如下 1MySQL master将数据变更写入二进制日志(binary log其中记录的数据叫做binary log events2MySQL slave将master的binary log events拷贝到它的中继日志(relay log)3MySQL slave重放relay log中事件将数据变更反映它自己的数据 而Canal就是把自己伪装成MySQL的一个slave节点从而监听master的binary log变化。再把得到的变化信息通知给Canal的客户端进而完成对其它数据库的同步。 2. 监听Canal Canal提供了各种语言的客户端当Canal监听到binlog变化时会通知Canal的客户端。 我们可以利用Canal提供的Java客户端监听Canal通知消息。当收到变化的消息时完成对缓存的更新。 不过这里我们会使用GitHub上的第三方开源的canal-starter客户端。地址https://github.com/NormanGyllenhaal/canal-client 与SpringBoot完美整合自动装配比官方客户端要简单好用很多。 2.1.引入依赖 dependencygroupIdtop.javatool/groupIdartifactIdcanal-spring-boot-starter/artifactIdversion1.2.1-RELEASE/version /dependency2.2. 编写配置 canal:destination: dcxuexi # canal的集群名字要与安装canal时设置的名称一致server: 192.168.150.101:11111 # canal服务地址2.3. 修改Item实体类 通过Id、Column、等注解完成Item与数据库表字段的映射 package com.dcxuexi.item.pojo;import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Transient;import javax.persistence.Column; import java.util.Date;Data TableName(tb_item) public class Item {TableId(type IdType.AUTO)Idprivate Long id;//商品idColumn(name name)private String name;//商品名称private String title;//商品标题private Long price;//价格分private String image;//商品图片private String category;//分类名称private String brand;//品牌名称private String spec;//规格private Integer status;//商品状态 1-正常2-下架private Date createTime;//创建时间private Date updateTime;//更新时间TableField(exist false)Transientprivate Integer stock;TableField(exist false)Transientprivate Integer sold; }2.4. 编写监听器 通过实现EntryHandlerT接口编写监听器监听Canal消息。注意两点 实现类通过CanalTable(tb_item)指定监听的表信息EntryHandler的泛型是与表对应的实体类 package com.dcxuexi.item.canal;import com.github.benmanes.caffeine.cache.Cache; import com.dcxuexi.item.config.RedisHandler; import com.dcxuexi.item.pojo.Item; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import top.javatool.canal.client.annotation.CanalTable; import top.javatool.canal.client.handler.EntryHandler;CanalTable(tb_item) Component public class ItemHandler implements EntryHandlerItem {Autowiredprivate RedisHandler redisHandler;Autowiredprivate CacheLong, Item itemCache;Overridepublic void insert(Item item) {// 写数据到JVM进程缓存itemCache.put(item.getId(), item);// 写数据到redisredisHandler.saveItem(item);}Overridepublic void update(Item before, Item after) {// 写数据到JVM进程缓存itemCache.put(after.getId(), after);// 写数据到redisredisHandler.saveItem(after);}Overridepublic void delete(Item item) {// 删除数据到JVM进程缓存itemCache.invalidate(item.getId());// 删除数据到redisredisHandler.deleteItemById(item.getId());} }在这里对Redis的操作都封装到了RedisHandler这个对象中是我们之前做缓存预热时编写的一个类内容如下 package com.dcxuexi.item.config;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.dcxuexi.item.pojo.Item; import com.dcxuexi.item.pojo.ItemStock; import com.dcxuexi.item.service.IItemService; import com.dcxuexi.item.service.IItemStockService; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.StringRedisTemplate; import org.springframework.stereotype.Component;import java.util.List;Component public class RedisHandler implements InitializingBean {Autowiredprivate StringRedisTemplate redisTemplate;Autowiredprivate IItemService itemService;Autowiredprivate IItemStockService stockService;private static final ObjectMapper MAPPER new ObjectMapper();Overridepublic void afterPropertiesSet() throws Exception {// 初始化缓存// 1.查询商品信息ListItem itemList itemService.list();// 2.放入缓存for (Item item : itemList) {// 2.1.item序列化为JSONString json MAPPER.writeValueAsString(item);// 2.2.存入redisredisTemplate.opsForValue().set(item:id: item.getId(), json);}// 3.查询商品库存信息ListItemStock stockList stockService.list();// 4.放入缓存for (ItemStock stock : stockList) {// 2.1.item序列化为JSONString json MAPPER.writeValueAsString(stock);// 2.2.存入redisredisTemplate.opsForValue().set(item:stock:id: stock.getId(), json);}}public void saveItem(Item item) {try {String json MAPPER.writeValueAsString(item);redisTemplate.opsForValue().set(item:id: item.getId(), json);} catch (JsonProcessingException e) {throw new RuntimeException(e);}}public void deleteItemById(Long id) {redisTemplate.delete(item:id: id);} }
http://www.yutouwan.com/news/354393/

相关文章:

  • 未备案网站 怎么处理广州网站设计易企建站
  • Wordpress虚拟资源下载类主题天津seo推广方法
  • 成都的教育品牌网站建设毕业设计可以做网站不
  • 湖北省住房和城乡建设部网站wordpress 三大标签
  • 英雄联盟网站设计编程课有必要学吗
  • 深圳网站建设资讯网站上线准备
  • 最简单的一个网站开发千库网官网首页登录
  • 酒店网站怎么做广西网站建设培训
  • seo整站优化外包哪家好成都网站建设公司汇总
  • 关于网站制作的评价重庆seo是什么
  • 网站运营与规划直播发布会
  • 定制微信网站钢城网站建设
  • 甘肃建设厅网站注入服务器与网站
  • 沛县网站定制网站跟域名是什么关系
  • 网站如何建设推广php语言 网站建设
  • 宁波网站商城建设建工网校官网app
  • 杭州建站模板制作音乐网站网页设计
  • 网站建设公司推荐乐云seo网站开发技术岗位职责
  • 杭州网站开发凡客网页设计公司哪家值得推荐
  • 如何在社交网站上做视频推广网站建设内部下单流程
  • 公司网站公司新闻人人站cms
  • 怎么做辅助发卡网站全球速卖通买家版
  • 有源码怎么在本地网站搭建做门户网站cms
  • 网站建设文本居中代码制作自己的平台网站
  • 交流做病理切片的网站如何做移动端网站
  • 晋城企业网站建设价格wordpress后台登陆500错误
  • 彭州网站建设28pz别人做的网站不能用
  • 罗湖福田app网站开发建站哪家好 phpwind
  • 长宁品牌网站建设软件开发公司税收优惠政策
  • 重庆业务外包网站建设服装企业的网站建设