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

网站建设要考虑哪些项目管理6个核心内容

网站建设要考虑哪些,项目管理6个核心内容,网站默认中文字体,深圳个人做网站经典的设计模式有23种#xff0c;但是常用的设计模式一般情况下不会到一半#xff0c;我们就针对一些常用的设计模式进行一些详细的讲解和分析#xff0c;方便大家更加容易理解和使用设计模式。 1-什么是原型模式 如果对象的创建成本比较大#xff0c;而同一个类的不同对象…       经典的设计模式有23种但是常用的设计模式一般情况下不会到一半我们就针对一些常用的设计模式进行一些详细的讲解和分析方便大家更加容易理解和使用设计模式。 1-什么是原型模式 如果对象的创建成本比较大而同一个类的不同对象之间差别不大大部分字段都相同在这种情况下我们可以利用对已有对象原型进行复制或者叫拷贝的方式来创建新对象以达到节省创建时间的目的。这种基于原型来创建对象的方式就叫作原型设计模式简称原型模式。 2-原型模式的应用 需求假设数据库中存储了大约10万条“搜索关键词”信息每条信息包含关键词名称、关键词被搜索的次数、信息最近被更新的时间等。系统A在启动的时候会加载这份数据到内存中用于处理某些其他的业务需求。为了方便快速地查找某个关键词对应的信息我们给关键词建立一个hashmap其中key关键词名称value就是 关键词对象包括名称检索次数更新时间。 另外一个系统B专门用来分析搜索日志定期比如间隔10分钟批量地更新数据库中的数据并且标记为新的数据版本更新时会把更新时间变成当前时间。这里我们假设只有更新和新添关键词没有删除关键词的行为。 为了保证系统A中数据的实时性不一定非常实时但数据也不能太旧系统A需要定期根据数据库中的数据更新内存中的索引和数据。 public class Demo {private ConcurrentHashMapString, SearchWord currentKeywords new ConcurrentHashMap();private long lastUpdateTime -1;public void refresh() {// 从数据库中取出更新时间lastUpdateTime的数据放入到currentKeywords中ListSearchWord toBeUpdatedSearchWords getSearchWords(lastUpdateTime);long maxNewUpdatedTime lastUpdateTime;for (SearchWord searchWord : toBeUpdatedSearchWords) {if (searchWord.getLastUpdateTime() maxNewUpdatedTime) {maxNewUpdatedTime searchWord.getLastUpdateTime();}if (currentKeywords.containsKey(searchWord.getKeyword())) {currentKeywords.replace(searchWord.getKeyword(), searchWord);} else {currentKeywords.put(searchWord.getKeyword(), searchWord);}}lastUpdateTime maxNewUpdatedTime;}private ListSearchWord getSearchWords(long lastUpdateTime) {// TODO: 从数据库中取出更新时间lastUpdateTime的数据return null;} 现在我们有一个特殊的需求任何时刻系统A中的所有数据都必须是同一个版本的要么都是版本a要么都是版本b不能有的是版本a有的是版本b。那刚刚的更新方式就不能满足这个要求了。除此之外我们还要求在更新内存数据的时候系统A不能处于不可用状态也就是不能停机更新数据。 实际上也不难。我们把正在使用的数据的版本定义为“服务版本”当我们要更新内存中的数据的时候我们并不是直接在服务版本假设是版本a数据上更新而是重新创建另一个版本数据假设是版本b数据等新的版本数据建好之后再一次性地将服务版本从版本a切换到版本b。这样既保证了数据一直可用又避免了中间状态的存在。 public class Demo {private HashMapString, SearchWord currentKeywordsnew HashMap();public void refresh() {HashMapString, SearchWord newKeywords new LinkedHashMap();// 从数据库中取出所有的数据放入到newKeywords中ListSearchWord toBeUpdatedSearchWords getSearchWords();for (SearchWord searchWord : toBeUpdatedSearchWords) {newKeywords.put(searchWord.getKeyword(), searchWord);}currentKeywords newKeywords;}private ListSearchWord getSearchWords() {// TODO: 从数据库中取出所有的数据return null;} } 在上面的代码实现中newKeywords构建的成本比较高。我们需要将这10万条数据从数据库中读出然后计算哈希值构建newKeywords。这个过程显然是比较耗时。为了提高效率原型模式就派上用场了。 思路我们拷贝currentKeywords数据到newKeywords中然后从数据库中只捞出新增或者有更新的关键词更新到newKeywords中。而相对于10万条数据来说每次新增或者更新的关键词个数是比较少的所以这种策略大大提高了数据更新的效率。 public class Demo {private HashMapString, SearchWord currentKeywordsnew HashMap();private long lastUpdateTime -1;public void refresh() {// 原型模式就这么简单拷贝已有对象的数据更新少量差值HashMapString, SearchWord newKeywords (HashMapString, SearchWord) currentKeywords.clone();// 从数据库中取出更新时间lastUpdateTime的数据放入到newKeywords中ListSearchWord toBeUpdatedSearchWords getSearchWords(lastUpdateTime);long maxNewUpdatedTime lastUpdateTime;for (SearchWord searchWord : toBeUpdatedSearchWords) {if (searchWord.getLastUpdateTime() maxNewUpdatedTime) {maxNewUpdatedTime searchWord.getLastUpdateTime();}if (newKeywords.containsKey(searchWord.getKeyword())) {SearchWord oldSearchWord newKeywords.get(searchWord.getKeyword());oldSearchWord.setCount(searchWord.getCount());oldSearchWord.setLastUpdateTime(searchWord.getLastUpdateTime());} else {newKeywords.put(searchWord.getKeyword(), searchWord);}}lastUpdateTime maxNewUpdatedTime;currentKeywords newKeywords;}private ListSearchWord getSearchWords(long lastUpdateTime) {// TODO: 从数据库中取出更新时间lastUpdateTime的数据return null;} 这里我们利用了Java中的clone()语法来复制一个对象。如果你熟悉的语言没有这个语法那把数据从currentKeywords中一个个取出来然后再重新计算哈希值放入到newKeywords中也是可以接受的。毕竟最耗时的还是从数据库中取数据的操作。相对于数据库的IO操作来说内存操作和CPU计算的耗时都是可以忽略的。 3-深拷贝和浅拷贝 浅拷贝只会复制图中的索引散列表不会复制数据SearchWord对象本身。相反深拷贝不仅仅会复制索引还会复制数据本身。浅拷贝得到的对象newKeywords跟原始对象currentKeywords共享数据SearchWord对象而深拷贝得到的是一份完完全全独立的对象。 在Java语言中Object类的clone()方法执行的就是我们刚刚说的浅拷贝。它只会拷贝对象中的基本数据类型的数据比如int、long以及引用对象SearchWord的内存地址不会递归地拷贝引用对象本身。 在上面的代码中我们通过调用HashMap上的clone()浅拷贝方法来实现原型模式。当我们通过newKeywords更新SearchWord对象的时候比如更新“设计模式”这个搜索关键词的访问次数newKeywords和currentKeywords因为指向相同的一组SearchWord对象就会导致currentKeywords中指向的SearchWord有的是老版本的有的是新版本的就没法满足我们之前的需求currentKeywords中的数据在任何时刻都是同一个版本的不存在介于老版本与新版本之间的中间状态。 如何实现深拷贝 第一种方法递归拷贝对象、对象的引用对象以及引用对象的引用对象……直到要拷贝的对象只包含基本数据类型数据没有引用对象为止。 第二种方法先将对象序列化然后再反序列化成新的对象。 我们可以先采用浅拷贝的方式创建newKeywords。对于需要更新的SearchWord对象我们再使用深度拷贝的方式创建一份新的对象替换newKeywords中的老对象。毕竟需要更新的数据是很少的。这种方式即利用了浅拷贝节省时间、空间的优点又能保证currentKeywords中的中数据都是老版本的数据。具体的代码实现如下所示。这也是标题中讲到的在我们这个应用场景下最快速clone散列表的方式 public class Demo {private HashMapString, SearchWord currentKeywordsnew HashMap();private long lastUpdateTime -1;public void refresh() {// Shallow copyHashMapString, SearchWord newKeywords (HashMapString, SearchWord) currentKeywords.clone();// 从数据库中取出更新时间lastUpdateTime的数据放入到newKeywords中ListSearchWord toBeUpdatedSearchWords getSearchWords(lastUpdateTime);long maxNewUpdatedTime lastUpdateTime;for (SearchWord searchWord : toBeUpdatedSearchWords) {if (searchWord.getLastUpdateTime() maxNewUpdatedTime) {maxNewUpdatedTime searchWord.getLastUpdateTime();}if (newKeywords.containsKey(searchWord.getKeyword())) {newKeywords.remove(searchWord.getKeyword());}newKeywords.put(searchWord.getKeyword(), searchWord);}lastUpdateTime maxNewUpdatedTime;currentKeywords newKeywords;}private ListSearchWord getSearchWords(long lastUpdateTime) {// TODO: 从数据库中取出更新时间lastUpdateTime的数据return null;}
http://www.w-s-a.com/news/791122/

相关文章:

  • 营销型网站工程专业网站开发公司
  • 两个路由器做双网站西安关键词优化服务
  • 企业建站系统信息远象建设 网站
  • 移动建站平台物业管理系统app
  • 济南网站建设多少钱郑州公司做网站
  • 在阿里云网站建设wordpress模板如何修改字体
  • 网站推广方案设计购物网站模块例子
  • 潍坊网站定制公司网站图片放大特效怎么做的
  • 淘宝店铺买卖湘潭seo优化价格
  • 最好的网站建设用途合肥企业网站建设
  • 计算机编程与网站建设好玩的网页传奇
  • 商务网站建设找哪家本地推广找哪些网站
  • 手机h5网站企业网站管理系统的运维服务
  • 南京建设网站公司网站游戏怎么制作
  • 成都建站程序苏州市建设局招标网站首页
  • 自助建网站市场公司起名大全2020最新版的
  • dede网站模板北京 网站开发 大兴
  • 网站优化师招聘建设牌安全带官方网站
  • 南京网站建设网站做视频网站用什么格式
  • 普陀做网站价格wordpress接入qq互联
  • 网站2级页面怎么做杭州哪家做外贸网站
  • 做了静态网站怎么显示在互联网上营销策划与运营方案
  • 常见的英文网站国内军事新闻大事件
  • 傻瓜式做网站程序微信怎么开公众号
  • c2c电商网站wordpress仿36kr主题
  • 网站建设公司开发免费图纸网站
  • 一个网站页面设计多少钱做预算查价格的网站是哪个
  • 鳌江哪里有做网站百度短链接在线生成
  • 有没有什么做水利资料的网站杭州建设信用平台
  • 电子商务网站建设及推广方案论文wordpress无法显示文章