`
crazier9527
  • 浏览: 1019248 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基于memcached的SNA实现

阅读更多

系统要集群,使用SNA方案。
一、 缓存的处理
缓存要使用统一的缓存服务器,集中式缓存。
原先的实现采用ehcache。
在spring里的配置,以资源缓存为例:

Xml代码 复制代码
  1. <!-- EhCache Manager -->  
  2.     <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">  
  3.         <property name="configLocation">  
  4.             <value>classpath:ehcache.xml</value>  
  5.         </property>  
  6. </bean>  
  7.   
  8. <bean id="resourceCacheBackend"  
  9.           class="org.springframework.cache.ehcache.EhCacheFactoryBean">  
  10.         <property name="cacheManager" ref="cacheManager"/>  
  11.         <property name="cacheName" value="resourceCache"/>  
  12.     </bean>  
  13.   
  14.     <bean id="resourceCache"  
  15.           class="com.framework.extcomponent.security.authentication.services.acegi.cache.EhCacheBasedResourceCache"  
  16.           autowire="byName">  
  17.         <property name="cache" ref="resourceCacheBackend"/>  
  18.     </bean>  
<!-- EhCache Manager -->
    <bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
        <property name="configLocation">
            <value>classpath:ehcache.xml</value>
        </property>
</bean>

<bean id="resourceCacheBackend"
          class="org.springframework.cache.ehcache.EhCacheFactoryBean">
        <property name="cacheManager" ref="cacheManager"/>
        <property name="cacheName" value="resourceCache"/>
    </bean>

    <bean id="resourceCache"
          class="com.framework.extcomponent.security.authentication.services.acegi.cache.EhCacheBasedResourceCache"
          autowire="byName">
        <property name="cache" ref="resourceCacheBackend"/>
    </bean>

 

cacheManager负责对ehcache进行管理,初始化、启动、停止。
resourceCacheBackend负责实际执行缓存操作,put 、get、remove。
resourceCache实现具有业务语义的业务应用层面的缓存操作,内部调用resourceCacheBackend操作。

现在采用memcached。
关于客户端,采用文初封装的客户端,地址在http://code.google.com/p/memcache-client-forjava/
使用spring的FactoryBean进行二次封装。同理:
memcachedManager负责对memcached进行管理,初始化、启动、停止。
代码:

Java代码 复制代码
  1. /**  
  2. * User: ronghao  
  3. * Date: 2008-10-14  
  4. * Time: 10:36:30  
  5. * 管理Memcached 的CacheManager  
  6. */  
  7. public class MemcachedCacheManagerFactoryBean implements FactoryBean, InitializingBean, DisposableBean {   
  8.   
  9.     protected final Log logger = LogFactory.getLog(getClass());   
  10.   
  11.     private ICacheManager<IMemcachedCache> cacheManager;   
  12.   
  13.     public Object getObject() throws Exception {   
  14.         return cacheManager;   
  15.     }   
  16.   
  17.     public Class getObjectType() {   
  18.         return this.cacheManager.getClass();   
  19.     }   
  20.   
  21.     public boolean isSingleton() {   
  22.         return true;   
  23.     }   
  24.   
  25.     public void afterPropertiesSet() throws Exception {   
  26.         logger.info("Initializing Memcached CacheManager");   
  27.         cacheManager = CacheUtil.getCacheManager(IMemcachedCache.class,   
  28.                 MemcachedCacheManager.class.getName());   
  29.         cacheManager.start();   
  30.     }   
  31.   
  32.     public void destroy() throws Exception {   
  33.         logger.info("Shutting down Memcached CacheManager");   
  34.         cacheManager.stop();   
  35.     }   
  36. }  
/**
* User: ronghao
* Date: 2008-10-14
* Time: 10:36:30
* 管理Memcached 的CacheManager
*/
public class MemcachedCacheManagerFactoryBean implements FactoryBean, InitializingBean, DisposableBean {

    protected final Log logger = LogFactory.getLog(getClass());

    private ICacheManager<IMemcachedCache> cacheManager;

    public Object getObject() throws Exception {
        return cacheManager;
    }

    public Class getObjectType() {
        return this.cacheManager.getClass();
    }

    public boolean isSingleton() {
        return true;
    }

    public void afterPropertiesSet() throws Exception {
        logger.info("Initializing Memcached CacheManager");
        cacheManager = CacheUtil.getCacheManager(IMemcachedCache.class,
                MemcachedCacheManager.class.getName());
        cacheManager.start();
    }

    public void destroy() throws Exception {
        logger.info("Shutting down Memcached CacheManager");
        cacheManager.stop();
    }
}

 


配置:

Xml代码 复制代码
  1. <bean id="memcachedManager"  
  2.           class="com.framework.extcomponent.cache.MemcachedCacheManagerFactoryBean"/>  
<bean id="memcachedManager"
          class="com.framework.extcomponent.cache.MemcachedCacheManagerFactoryBean"/>

 


resourceCacheBackend负责实际执行缓存操作,put 、get、remove。
代码:

Java代码 复制代码
  1. /**  
  2. * User: ronghao  
  3. * Date: 2008-10-14  
  4. * Time: 10:37:16  
  5. * 返回  MemcachedCache  
  6. */  
  7. public class MemcachedCacheFactoryBean implements FactoryBean, BeanNameAware, InitializingBean {   
  8.   
  9.     protected final Log logger = LogFactory.getLog(getClass());   
  10.   
  11.     private ICacheManager<IMemcachedCache> cacheManager;   
  12.     private String cacheName;   
  13.     private String beanName;   
  14.     private IMemcachedCache cache;   
  15.   
  16.     public void setCacheManager(ICacheManager<IMemcachedCache> cacheManager) {   
  17.         this.cacheManager = cacheManager;   
  18.     }   
  19.   
  20.     public void setCacheName(String cacheName) {   
  21.         this.cacheName = cacheName;   
  22.     }   
  23.   
  24.     public Object getObject() throws Exception {   
  25.         return cache;   
  26.     }   
  27.   
  28.     public Class getObjectType() {   
  29.         return this.cache.getClass();   
  30.     }   
  31.   
  32.     public boolean isSingleton() {   
  33.         return true;    
  34.     }   
  35.   
  36.     public void setBeanName(String name) {   
  37.         this.beanName=name;   
  38.     }   
  39.   
  40.     public void afterPropertiesSet() throws Exception {   
  41.         // If no cache name given, use bean name as cache name.   
  42.        if (this.cacheName == null) {   
  43.         this.cacheName = this.beanName;   
  44.     }   
  45.         cache = cacheManager.getCache(cacheName);   
  46.     }   
  47. }  
/**
* User: ronghao
* Date: 2008-10-14
* Time: 10:37:16
* 返回  MemcachedCache
*/
public class MemcachedCacheFactoryBean implements FactoryBean, BeanNameAware, InitializingBean {

    protected final Log logger = LogFactory.getLog(getClass());

    private ICacheManager<IMemcachedCache> cacheManager;
    private String cacheName;
    private String beanName;
    private IMemcachedCache cache;

    public void setCacheManager(ICacheManager<IMemcachedCache> cacheManager) {
        this.cacheManager = cacheManager;
    }

    public void setCacheName(String cacheName) {
        this.cacheName = cacheName;
    }

    public Object getObject() throws Exception {
        return cache;
    }

    public Class getObjectType() {
        return this.cache.getClass();
    }

    public boolean isSingleton() {
        return true; 
    }

    public void setBeanName(String name) {
        this.beanName=name;
    }

    public void afterPropertiesSet() throws Exception {
        // If no cache name given, use bean name as cache name.
       if (this.cacheName == null) {
		this.cacheName = this.beanName;
	}
        cache = cacheManager.getCache(cacheName);
    }
}

 


配置:

Xml代码 复制代码
  1. <bean id="resourceCacheBackend"  
  2.           class="com.framework.extcomponent.cache.MemcachedCacheFactoryBean">  
  3.         <property name="cacheManager" ref="memcachedManager"/>  
  4.         <property name="cacheName" value="memcache"/>  
  5.     </bean>  
<bean id="resourceCacheBackend"
          class="com.framework.extcomponent.cache.MemcachedCacheFactoryBean">
        <property name="cacheManager" ref="memcachedManager"/>
        <property name="cacheName" value="memcache"/>
    </bean>

 


resourceCache同上,替换新的实现类MemcachedBasedResourceCache即可。

二、 Session失效的处理
采用memcached作为httpsession的存储,并不直接保存httpsession对象,自定义SessionMap,SessionMap直接继承HashMap,保存SessionMap。

会话胶粘:未失败转发的情况下没必要在memcached保存的SessionMap和httpsession之间复制来复制去,眉来眼去。

利用memcached计数器保存在线人数。

系统权限采用了acegi,在acegi的拦截器链里配置snaFilter

Xml代码 复制代码
  1. <bean id="filterChainProxy"  
  2.           class="org.acegisecurity.util.FilterChainProxy">  
  3.         <property name="filterInvocationDefinitionSource">  
  4.             <value>  
  5.                 CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON   
  6.                 PATTERN_TYPE_APACHE_ANT   
  7.                 /**=snaFilter,httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,basicProcessingFilter,securityContextHolderAwareRequestFilter,exceptionTranslationFilter,filterInvocationInterceptor   
  8.             </value>  
  9.         </property>  
  10. </bean>  
<bean id="filterChainProxy"
          class="org.acegisecurity.util.FilterChainProxy">
        <property name="filterInvocationDefinitionSource">
            <value>
                CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
                PATTERN_TYPE_APACHE_ANT
                /**=snaFilter,httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,basicProcessingFilter,securityContextHolderAwareRequestFilter,exceptionTranslationFilter,filterInvocationInterceptor
            </value>
        </property>
</bean>

 


注意需要配置在第一个。
snaFilter的职责:
1、 没有HttpSession时,创建HttpSession;
2、 创建Cookie保存HttpSession id;
3、 如果Cookie保存的HttpSession id与当前HttpSession id一致,说明是正常请求;
4、 如果Cookie保存的HttpSession id与当前HttpSession id不一致,说明是失败转发;失败转发的处理:
     4.1、根据Cookie保存的HttpSession id从memcached获取SessionMap;
     4.2、SessionMap属性复制到当前HttpSession;
     4.3、memcached删除SessionMap。
5、 判断当前请求url是否是登出url,是则删除SessionMap,在线人数减1.

代码:

Java代码 复制代码
  1. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,   
  2.                          FilterChain filterChain) throws IOException, ServletException {   
  3.         final HttpServletRequest hrequest = (HttpServletRequest) servletRequest;   
  4.         final HttpServletResponse hresponse = (HttpServletResponse) servletResponse;   
  5.         String uri = hrequest.getRequestURI();   
  6.         logger.debug("开始SNA拦截-----------------" + uri);   
  7.         HttpSession httpSession = hrequest.getSession();   
  8.         String sessionId = httpSession.getId();   
  9.         //如果是登出,则直接干掉sessionMap   
  10.         if (uri.equals(logoutUrl)) {   
  11.             logger.debug("remove sessionmap:" + sessionId);   
  12.             //在线人数减1   
  13.             getCache().addOrDecr("userCount",1);   
  14.             getCache().remove(sessionId);   
  15.         } else {   
  16.             String cookiesessionid = getSessionIdFromCookie(hrequest, hresponse);   
  17.             if (!sessionId.equals(cookiesessionid)) {   
  18.                 createCookie(sessionId, hresponse);   
  19.                 SessionMap sessionMap = getSessionMap(cookiesessionid);   
  20.                 if (sessionMap != null) {   
  21.                     logger.debug("fail over--------sessionid:" + sessionId + "cookiesessionid:" + cookiesessionid);   
  22.                     initialHttpSession(sessionMap, httpSession);   
  23.                     cache.remove(cookiesessionid);   
  24.                 }   
  25.             }   
  26.         }   
  27.         filterChain.doFilter(hrequest, hresponse);   
  28. }  
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        final HttpServletRequest hrequest = (HttpServletRequest) servletRequest;
        final HttpServletResponse hresponse = (HttpServletResponse) servletResponse;
        String uri = hrequest.getRequestURI();
        logger.debug("开始SNA拦截-----------------" + uri);
        HttpSession httpSession = hrequest.getSession();
        String sessionId = httpSession.getId();
        //如果是登出,则直接干掉sessionMap
        if (uri.equals(logoutUrl)) {
            logger.debug("remove sessionmap:" + sessionId);
            //在线人数减1
            getCache().addOrDecr("userCount",1);
            getCache().remove(sessionId);
        } else {
            String cookiesessionid = getSessionIdFromCookie(hrequest, hresponse);
            if (!sessionId.equals(cookiesessionid)) {
                createCookie(sessionId, hresponse);
                SessionMap sessionMap = getSessionMap(cookiesessionid);
                if (sessionMap != null) {
                    logger.debug("fail over--------sessionid:" + sessionId + "cookiesessionid:" + cookiesessionid);
                    initialHttpSession(sessionMap, httpSession);
                    cache.remove(cookiesessionid);
                }
            }
        }
        filterChain.doFilter(hrequest, hresponse);
}

 



利用HttpSessionAttributeListener监听httpsession的属性变化,同步到memecached中的sessionmap。

Java代码 复制代码
  1. public void attributeAdded(HttpSessionBindingEvent event) {   
  2.         HttpSession httpSession = event.getSession();   
  3.         String attrName = event.getName();   
  4.         Object attrValue = event.getValue();   
  5.         String sessionId = httpSession.getId();   
  6.         logger.debug("attributeAdded sessionId:" + sessionId + "name:" + attrName + ",value:" + attrValue);   
  7.         SessionMap sessionMap = getSessionMap(sessionId);   
  8.         if (sessionMap == null){   
  9.             //在线人数加1   
  10.             getCache().addOrIncr("userCount",1);   
  11.             sessionMap = new SessionMap();   
  12.         }   
  13.         logger.debug("name:" + attrName + ",value:" + attrValue);   
  14.         sessionMap.put(attrName, attrValue);   
  15.         getCache().put(sessionId, sessionMap);   
  16.     }   
  17.   
  18.     public void attributeRemoved(HttpSessionBindingEvent event) {   
  19.         HttpSession httpSession = event.getSession();   
  20.         String attrName = event.getName();   
  21.         String sessionId = httpSession.getId();   
  22.         logger.debug("attributeRemoved sessionId:" + sessionId + "name:" + attrName);   
  23.         SessionMap sessionMap = getSessionMap(sessionId);   
  24.         if (sessionMap != null) {   
  25.             logger.debug("remove:" + attrName);   
  26.             sessionMap.remove(attrName);   
  27.             getCache().put(sessionId, sessionMap);   
  28.         }   
  29.     }   
  30.   
  31.     public void attributeReplaced(HttpSessionBindingEvent event) {   
  32.         attributeAdded(event);   
  33.     }  
public void attributeAdded(HttpSessionBindingEvent event) {
        HttpSession httpSession = event.getSession();
        String attrName = event.getName();
        Object attrValue = event.getValue();
        String sessionId = httpSession.getId();
        logger.debug("attributeAdded sessionId:" + sessionId + "name:" + attrName + ",value:" + attrValue);
        SessionMap sessionMap = getSessionMap(sessionId);
        if (sessionMap == null){
            //在线人数加1
            getCache().addOrIncr("userCount",1);
            sessionMap = new SessionMap();
        }
        logger.debug("name:" + attrName + ",value:" + attrValue);
        sessionMap.put(attrName, attrValue);
        getCache().put(sessionId, sessionMap);
    }

    public void attributeRemoved(HttpSessionBindingEvent event) {
        HttpSession httpSession = event.getSession();
        String attrName = event.getName();
        String sessionId = httpSession.getId();
        logger.debug("attributeRemoved sessionId:" + sessionId + "name:" + attrName);
        SessionMap sessionMap = getSessionMap(sessionId);
        if (sessionMap != null) {
            logger.debug("remove:" + attrName);
            sessionMap.remove(attrName);
            getCache().put(sessionId, sessionMap);
        }
    }

    public void attributeReplaced(HttpSessionBindingEvent event) {
        attributeAdded(event);
    }

 



利用HttpSessionListener,sessionDestroyed事件时根据sessionid删除memcached里的sessionMap(如果存在)。不再担心httpsession的过期问题。

Java代码 复制代码
  1. public void sessionDestroyed(HttpSessionEvent event) {   
  2.         HttpSession httpSession = event.getSession();   
  3.         String sessionId = httpSession.getId();   
  4.         logger.debug("session Removed sessionId:" + sessionId);   
  5.         SessionMap sessionMap = getSessionMap(sessionId);   
  6.         if (sessionMap != null) {   
  7.             logger.debug("remove sessionmap:" + sessionId);   
  8.             //在线人数减1   
  9.             getCache().addOrDecr("userCount",1);   
  10.             getCache().remove(sessionId);   
  11.         }   
  12.     }  
public void sessionDestroyed(HttpSessionEvent event) {
        HttpSession httpSession = event.getSession();
        String sessionId = httpSession.getId();
        logger.debug("session Removed sessionId:" + sessionId);
        SessionMap sessionMap = getSessionMap(sessionId);
        if (sessionMap != null) {
            logger.debug("remove sessionmap:" + sessionId);
            //在线人数减1
            getCache().addOrDecr("userCount",1);
            getCache().remove(sessionId);
        }
    }

 



三、 文件保存的处理
和缓存类似,采用集中式的文件服务。对于linux,采用nfs。参考文档http://linux.vbird.org/linux_server/0330nfs.php#What_NFS_perm。关键在于对权限的分配。
应用程序本身不用修改。

分享到:
评论

相关推荐

    构建高性能的大型分布式java应用

    **1.1 基于消息方式实现系统间通讯** 在分布式Java应用中,基于消息方式进行系统间通讯是一种常见的策略。这种方式的核心在于系统之间的交互是通过发送消息来完成的,这些消息可以是简单的字节流或者复杂的Java对象...

    MATLAB实现基于LSTM-AdaBoost长短期记忆网络结合AdaBoost时间序列预测(含模型描述及示例代码)

    内容概要:本文档详细介绍了基于 MATLAB 实现的 LSTM-AdaBoost 时间序列预测模型,涵盖项目背景、目标、挑战、特点、应用领域以及模型架构和代码示例。随着大数据和AI的发展,时间序列预测变得至关重要。传统方法如 ARIMA 在复杂非线性序列中表现欠佳,因此引入了 LSTM 来捕捉长期依赖性。但 LSTM 存在易陷局部最优、对噪声鲁棒性差的问题,故加入 AdaBoost 提高模型准确性和鲁棒性。两者结合能更好应对非线性和长期依赖的数据,提供更稳定的预测。项目还展示了如何在 MATLAB 中具体实现模型的各个环节。 适用人群:对时间序列预测感兴趣的开发者、研究人员及学生,特别是有一定 MATLAB 编程经验和熟悉深度学习或机器学习基础知识的人群。 使用场景及目标:①适用于金融市场价格预测、气象预报、工业生产故障检测等多种需要时间序列分析的场合;②帮助使用者理解并掌握将LSTM与AdaBoost结合的实现细节及其在提高预测精度和抗噪方面的优势。 其他说明:尽管该模型有诸多优点,但仍存在训练时间长、计算成本高等挑战。文中提及通过优化数据预处理、调整超参数等方式改进性能。同时给出了完整的MATLAB代码实现,便于学习与复现。

    palkert_3ck_01_0918.pdf

    palkert_3ck_01_0918

    pepeljugoski_01_1106.pdf

    pepeljugoski_01_1106

    tatah_01_1107.pdf

    tatah_01_1107

    [AB PLC例程源码][MMS_046393]Motor Speed Reference.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    基于51的步进电机控制系统20250302

    题目:基于单片机的步进电机控制系统 模块: 主控:AT89C52RC 步进电机(ULN2003驱动) 按键(3个) 蓝牙(虚拟终端模拟) 功能: 1、可以通过蓝牙远程控制步进电机转动 2、可以通过按键实现手动与自动控制模式切换。 3、自动模式下,步进电机正转一圈,反转一圈,循环 4、手动模式下可以通过按键控制步进电机转动(顺时针和逆时针)

    [AB PLC例程源码][MMS_041234]Logix Fault Handler.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    [AB PLC例程源码][MMS_042348]Using an Ultra3000 as an Indexer on DeviceNet with a CompactLogix.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    智慧校园平台建设全流程详解:从需求到持续优化

    内容概要:本文详细介绍了建设智慧校园平台所需的六个关键步骤。首先通过需求分析深入了解并确定校方和使用者的具体需求;其次是规划设计阶段,依据所得需求制定全面的建设方案。再者是对现有系统的整合——系统集成,确保新旧平台之间的互操作性和数据一致性。培训支持帮助全校教职工和学生快速熟悉新平台,提高效率。实施试点确保系统逐步稳定部署。最后,强调持续改进的重要性,以适应技术和环境变化。通过这一系列有序的工作,可以使智慧校园建设更为科学高效,减少失败风险。 适用人群:教育领域的决策者和技术人员,包括负责信息化建设和运维的团队成员。 使用场景及目标:用于指导高校和其他各级各类学校规划和发展自身的数字校园生态链;目的是建立更加便捷高效的现代化管理模式和服务机制。 其他说明:智慧校园不仅仅是简单的IT设施升级或软件安装,它涉及到全校范围内的流程再造和创新改革。

    AI淘金实战手册:100+高收益变现案例解析

    该文档系统梳理了人工智能技术在商业场景中的落地路径,聚焦内容生产、电商运营、智能客服、数据分析等12个高潜力领域,提炼出100个可操作性变现模型。内容涵盖AI工具开发、API服务收费、垂直场景解决方案、数据增值服务等多元商业模式,每个思路均配备应用场景拆解、技术实现路径及收益测算框架。重点呈现低代码工具应用、现有平台流量复用、细分领域自动化改造三类轻量化启动方案,为创业者提供从技术选型到盈利闭环的全流程参考。

    palkert_3ck_02_0719.pdf

    palkert_3ck_02_0719

    2006-2023年 地级市-克鲁格曼专业化指数.zip

    克鲁格曼专业化指数,最初是由Krugman于1991年提出,用于反映地区间产业结构的差异,也被用来衡量两个地区间的专业化水平,因而又称地区间专业化指数。该指数的计算公式及其含义可以因应用背景和具体需求的不同而有所调整,但核心都是衡量地区间的产业结构差异或专业化程度。 指标 年份、城市、第一产业人数(first_industry1)、第二产业人数(second_industry1)、第三产业人数(third_industry1)、专业化指数(ksi)。

    [AB PLC例程源码][MMS_046305]R2FX.zip

    AB PLC例程代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    精品推荐-通信技术LTE干货资料合集(19份).zip

    精品推荐,通信技术LTE干货资料合集,19份。 LTE PCI网络规划工具.xlsx LTE-S1切换占比专题优化分析报告.docx LTE_TDD问题定位指导书-吞吐量篇.docx LTE三大常见指标优化指导书.xlsx LTE互操作邻区配置核查原则.docx LTE信令流程详解指导书.docx LTE切换问题定位指导一(定位思路和问题现象).docx LTE劣化小区优化指导手册.docx LTE容量优化高负荷小区优化指导书.docx LTE小区搜索过程学习.docx LTE小区级与邻区级切换参数说明.docx LTE差小区处理思路和步骤.docx LTE干扰日常分析介绍.docx LTE异频同频切换.docx LTE弱覆盖问题分析与优化.docx LTE网优电话面试问题-应答技巧.docx LTE网络切换优化.docx LTE高负荷小区容量优化指导书.docx LTE高铁优化之多频组网优化提升“用户感知,网络价值”.docx

    matlab程序代码项目案例:matlab程序代码项目案例matlab中Toolbox中带有的模型预测工具箱.zip

    matlab程序代码项目案例 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,不仅适用于小白学习入门进阶。也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载!欢迎交流学习!不清楚的可以私信问我!

    pepeljugoski_01_0508.pdf

    pepeljugoski_01_0508

    szczepanek_01_0308.pdf

    szczepanek_01_0308

    oif2007.384.01_IEEE.pdf

    oif2007.384.01_IEEE

Global site tag (gtag.js) - Google Analytics