首页 文章 精选 留言 我的

精选列表

搜索[思考模型],共10004篇文章
优秀的个人博客,低调大师

使用缓存时对于加锁的思考

突然发现之前写的自己实现XXX的话题不是很被大众关注,可能是真的写的不行,也可能是大多都是一些吃了饭没事做瞎写的一些东西,大家都没兴趣,之后可能会尽量写一些真正实用的东西,大家一起学习。言归正传,促使我研究这个话题的原因是在工作中遇到需要自己实现多级缓存的情况。比如在springboot中我们虽然可以随意替换缓存技术,可以使用redis也可以使用ehcache,但是据我所知,这些缓存默认都是只能使用一种。假设现在我需要同时使用ehcache和redis,其中ehcache做本地的第一级缓存。这里忽略可能用到的mybatis,hibernate那些操作数据库的orm框架的缓存,单独只考虑应用层面的缓存。当然在已经有springboot,ehcache,redis的情况下,通过自定义注解,切面拦截,组合ehcache和redis的两级缓存,其实并不是很困难。难点只在于细节部分,比如怎么让自己定义的注解和切面可以被springboot中的缓存注解开关@EnableCaching控制,又比如多点部署时怎么让ehcache本地缓存和redis集中式缓存实现同步,当然也有使用缓存的时候怎么加锁的问题。本话题重点讨论,在缓存使用时的加锁问题。 其实当我们刚开始学java的线程中同步工具时,我们就接触到synchronized,锁,读写锁等。其中在api文档的ReentrantReadWriteLock类里有一个例子,专门演示了读写锁,在一个缓存对象中的使用的例子如下: class CachedData { Object data; volatile boolean cacheValid; ReentrantReadWriteLock rwl = new ReentrantReadWriteLock(); void processCachedData() { rwl.readLock().lock(); if (!cacheValid) { // Must release read lock before acquiring write lock rwl.readLock().unlock(); rwl.writeLock().lock(); // Recheck state because another thread might have acquired // write lock and changed state before we did. if (!cacheValid) { data = ... cacheValid = true; } // Downgrade by acquiring read lock before releasing write lock rwl.readLock().lock(); rwl.writeLock().unlock(); // Unlock write, still hold read } use(data); rwl.readLock().unlock(); } } 里面的读写锁,double check,锁降级等用的炉火纯青自是不用说的,我当时也是对此记忆犹新,如获至宝啊,感觉这段代码很适合装B,然后我在我的缓存实现代码里也准备这么玩,当我把这段代码复制过去,改成我需要的逻辑后,我就发现了问题。瞬间感觉这要是这么玩,可能装B不成那个啥的。然后我搜了搜网上别人的这种玩法,想看看别人是不是也有这种尴尬。然后搜索出来一大把如下面代码(百度搜索:java读写锁实现缓存) package test; import java.util.HashMap; import java.util.Map; import java.util.Random; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; /** * 设计一个缓存系统 * 读写锁的应用。 * JDK1.5自带的读写锁特性,读与读不互斥,读与写互斥,写与写互斥。 * 为什么要使用读写锁?一句话概括那就是提高系统性能,如何提高呢? * 试想,对于所有对读的操作是不需要线程互斥的,而如果方法内 * 使用了synchronized关键字同步以达到线程安全,对于所有的线程不管是读还是写的操作都要同步。 * 这时如果有大量的读操作时就会又性能瓶颈。 * * 所以,当一个方法内有多个线程访问,并且方法内有读和写读操作时, * 提升性能最好的线程安全办法时采用读写锁的机制对读写互斥、写写互斥。这样对于读读就没有性能问题了 * @author zhurudong * */ public class CacheTest { // 缓存的map private Map<String, Object> map = new HashMap<String, Object>(); // 读写锁对象 private ReadWriteLock readWriteLock = new ReentrantReadWriteLock(); /** * 从缓存中获取数据的方法 * @param key * @return */ public Object getData(String key) { readWriteLock.readLock().lock();//读锁,只对写的线程互斥 Object value = null; try { // 尝试从缓存中获取数据 value = map.get(key); if (value == null) { readWriteLock.readLock().unlock();//发现目标值为null,释放掉读锁 readWriteLock.writeLock().lock();//发现目标值为null,需要取值操作,上写锁 try { value = map.get(key);// 很严谨这一步。再次取目标值 if (value == null) {//很严谨这一步。再次判断目标值,防止写锁释放后,后面获得写锁的线程再次进行取值操作 // 模拟DB操作 value = new Random().nextInt(10000) + "test"; map.put(key, value); System.out.println("db completed!"); } readWriteLock.readLock().lock();//再次对读进行锁住,以防止写的操作,造成数据错乱 } finally { /* * 先加读锁再释放写锁读作用: * 防止在43行出多个线程获得写锁进行写的操作,所以在写锁还没有释放前要上读锁 */ readWriteLock.writeLock().unlock(); } } } finally { readWriteLock.readLock().unlock(); } return value; } /** * test main * @param args */ public static void main(String[] args) { final CacheTest cache = new CacheTest(); final String key = "user"; for (int i = 0; i < 1000; i++) { new Thread(){ public void run() { System.out.println(cache.getData(key)); }; }.start(); } } } 估计很多人看了上面代码,也会和我当时改完api文档的例子后一样觉得这代码真他妈严谨。改完后,我又仔细想想(我习惯把逻辑用现实中的场景去验证,毕竟程序世界各种场景处理方法等都是是现实世界的抽象),想到了生活中去超市门口那种储存柜子存取包裹,读操作可以类比为取柜子里的包裹,写操作可以类比为去超市存包裹,map可以类比成那个柜子。使用上面代码在现实中的这种场景下还原出来就是:当我拿着小票去取包裹,别人可以同时去取包裹,但是当我去存包裹的时候,我让除了我以外的所有人必须在我后面等着,等我存好了,别人才能靠近柜子。这种霸道的做法,不就是上面那段代码的表现吗?怎么样看了这段描述,你们还要像上面那样装B吗?有人会问,为啥api文档里推荐那样写呢,其实仔细看下文档里的那段代码,它加锁的那个方法是没有入参的,缓存的数据直接作为了成员变量,这个成员变量作为缓存的值对于所有调用processCachedData方法的线程来说都是共享的,有共享数据就要考虑多线程环境下同步的问题。而上面那段自己的代码是有入参key的,也就是说根据key获取的缓存值有可能被所有调用线程共享,也有可能不共享,当key不同的时候,这个数据其实是各不影响的。所以这种情况加锁最好是根据这个入参区别对待。然后我就有了下面的想法,不知道是不是也有人想到呢? public Object getData1(String key) { if(key == null) return null; Object data = null; synchronized (key.intern()) { data = dataMap.get(key); if(data == null) { data = "query object"; dataMap.put(key, data); } } return data; } 如上代码,我们可以把key当成监视器,但如果仅仅只是key有点不严谨,因为可能字符串内容一样,一个是返回字符串池的引用,一个返回堆里的引用,根本不是一个对象。表现出来的结果可能就等同于没有加锁。所以在这里使用key.intern(),都返回池里的引用。这样控制相当于不同的人拿着不同的小票可以同时存取包裹,不同的人要是拿着一样的小票进来存取,就应该一个人存取的时候,另外一个人等候。虽然现实场景中每个人的小票应该都是唯一的,但是程序中是合理的,我们可以假设小票有重复。回到程序中:如果多个线程如果拿着不同的key值操作数据不需要等待其它线程的锁,如果拿着同样的key值操作数据就需要等待其它线程释放锁。这样的结果貌似很合理,但是在一般缓存应用场景中,缓存最大的作用是在短时间大量重复的获取相同的key的值能够快速的从缓存获取到数据,假设不加读写请求的区分,统一加锁,会导致多个线程不能同时去读取相同的key的值,也需要互相等待,同样有损性能。以上两种加锁方案:第一种进行了读写分开考虑,多线程中读读不互斥,读写互斥,但是没有考虑获取不同的key值不需要互斥;第二种考虑了不同的key不需要互斥的情况,但是没有考虑读读不需要互斥的情况。可惜的是java的api并没有提供根据不同的参数获取不同的读写锁的方法,这一点很尴尬。相信所有的自称高性能的缓存都会遇到这种尴尬,于是我找了纯java实现的缓存ehcache的源码看了下,发现核心思路就是先默认生成了2048个长度的ReentrantReadWriteLock数组,然后使用hash算法对key进行计算得到一个int的值,然后每个key进来去拿数组里hash值对应的索引的那个ReentrantReadWriteLock,然后再使用这个读写锁来控制,这样就可以达到不同的key读写互不影响,相同的key读读不互斥,读写互斥。抽离出来大概代码如下(适当简化过了)。 //源码里实际上是把ReentrantReadWriteLock封装在一个ReadWriteLockSync类里的,我不喜欢拐弯抹角,直接简单的提取出来了 final ReadWriteLock[] rwlocks = new ReentrantReadWriteLock[2048]; //这里是自己为了简单,源码里并不是这么简陋的 { for(int i = 0;i < rwlocks.length;i++) { rwlocks[i] = new ReentrantReadWriteLock(); } } //这里是源码里的方法 public static int selectLock(final Object key, int numberOfLocks) throws CacheException { /** * 这里用自己和自己小1的数字取了一个与运算,目的就是保证numberOfLocks是2的n次方,比如8和7与 1000 & 0111 = 0000 如果结果不等于0必然不是2的n次方 */ int number = numberOfLocks & (numberOfLocks - 1); if (number != 0) { throw new CacheException("Lock number must be a power of two: " + numberOfLocks); } if (key == null) { return 0; } else { /** 这里也很有意思,一般我们做估计就是hash(key) % numberOfLocks来定位数组的索引,他这样玩其实在numberOfLocks是2的n次方 的情况下,是与%操作等效,如下 8 % 4 = 8 & 3 1000 & 0011 = 0000 = 0 11 % 8 = 11 & 7 1011 & 0111 = 0011 = 3 每次看到别人用位运算,只能感叹,这尼玛才叫装B啊! */ int hash = hash(key) & (numberOfLocks - 1); return hash; } } //这里是源码里的hash函数,表示看不懂,就知道传一个对象进去可以出来一个int类型的值 public static int hash(Object object) { int h = object.hashCode(); h ^= (h >>> 20) ^ (h >>> 12); return h ^ (h >>> 7) ^ (h >>> 4); } 然后再修改一下最开始说的装B的读写锁代码如下 /** 这里使用支持并发的map是为了保证容器本身没有并发问题,容器的存取操作是原子的,后面getData2的同步控制是为了防止业务数据同时读写出现脏读等情况, 比如一个key在读,同时也在写,到底读到的是写前还是写后的数据呢?这里是属于业务上的并发控制,至于容器上的并发控制就是明明两个不同的key去写因为 抢同一个位置导致数据不一致等问题,就像存包裹,有两个人非要去存在一个箱子里就会出现争抢了。并不是说使用了线程并发库就不需要进行并发控制了,毕竟 线程并发库里的读写,也只能保证单独的读写是原子操作,假设多个组合起来就不能保证原子性了 */ private Map<String,Object> dataMap = new ConcurrentHashMap<>(); public Object getData2(String key) { int locknum = selectLock(key,2048); ReadWriteLock rwlock = rwlocks[locknum]; rwlock.readLock().lock(); try { Object data = dataMap.get(key); if (data == null) { rwlock.readLock().unlock(); rwlock.writeLock().lock(); if(data == null) { data = "query object"; dataMap.put(key, data); } rwlock.readLock().lock(); rwlock.writeLock().unlock(); } return data; } finally { rwlock.readLock().unlock(); } } 其实这样的思路就是尽量降低锁的粒度,把一个读写锁换成了2048个小锁,像jdk1.8以前的ConcurrentHashMap采用的锁分段,分成了16端,其实和这个的思想是一样的,都是降低锁的粒度,达到高效的并发控制。不过,估计当读写达到一定两级后仅仅这16端的切分,估计也起不到多大的效果了。所以官方估计意识到了这一点,在1.8后把实现方式改成了CAS无锁算法。我突然想到新版的ehcache(这篇话题谈到的ehcache版本是2.10.4)会不会也使用CAS呢?这个新版的源码,我暂时也没有研究过,人类对性能的追求是永无止境的,这个就等有兴趣的朋友再去探究了。 好吧,就这样结束吧,如果文章有错误的地方,欢迎指正。下一个话题再讨论如何在springboot的基础上结合ehcache和redis无缝实现自定义二级缓存。

优秀的个人博客,低调大师

胡小明:大数据应用方向思考

一、警惕大数据过热 1.1 过热产生盲目性 国内大数据的宣传早已过热,很多区县级政府也在考虑成立大数据局,政府对大数据热几乎没有抵抗力,企业没有紧跟就对了,在大数据高潮中反省政府的大数据行为、冷静一下头脑是有益的,毕竟大数据应用是一个经济问题,一窝蜂地大数据会使人犯“大炼钢铁”一类的错误。 1.2 大数据应用效益存在问题 大数据最积极的推动者是政府,但是政府工作如何从大数据应用中获益一直没有清晰的答案,有效的大数据应用集中于互联网企业和金融领域并非政府工作,迄今一本像样的政府大数据应用案例都编写不出来,这种情况下推力政府大数据应用会带有很大的盲目性,这是技术导向而不是问题导向,技术导向必然会造成浪费。 1.3 大数据不是包治百病的神药 现在对大数据的宣传已经远远胜过对城市问题的探讨,问题还没搞清药方就先开出来了,大数据药方再灵也不可能解决自己都没有诊断清楚的问题。任何技术都有其长处和短处,大数据也是一样,都有其能解决与不能解决的问题,各地政府首先要明确要问题是什么,然后再审视大数据技术能否发挥作用,不能反过来先定大数据再去找问题,政府工作明确目标永远比搞清技术更重要。 二、大数据源自互联网的推动 2.1 大数据是如何产生的? 任何有社会影响力的新名词都不是望文生义可以解释的,这些名词都被赋予了成语含义,“大数据”便是其一。历史上超大规模的数据很多却不被称为大数据,是因为单纯数据量增长并没有形成巨大社会影响力。 大数据概念是大的数据量与现代信息技术环境相结合涌现的结果,因此引发了巨大的效益机会,“大数据”一词的发明与宣传是为了抓住这个新机会。 2.2 没有互联网便没有大数据 任何资源的价值展现都离不开特定的环境,互联网前的海量数据因缺少规模化的社会应用而不为人们重视,互联网创造了大数据应用的规模化环境,大数据应用成功的案例大都是在互联网上发生的,互联网业务提供了数据,互联网企业开发了处理软件,互联网企业的创新带来了大数据应用的活跃,没有互联网便没有今天的大数据产业。 2.3 大数据是“大智移云物”的共同产物 如果没有汽车与高速公路石油产业不会那么重要,同样,没有互联网、云计算、物联网、移动终端与人工智能组合的环境大数据也没那么重要。大数据的价值并非与生俱来而是应用创新之结果,价值是由技术组合创新涌现出来的。离开环境的支持大数据毫无价值,就像离开了身体的手不再有手的功能一样。 三、传统大数据思维局限于支持决策 3.1 传统的大数据应用理念 人们对事物的想象力很容易受所用词汇的暗示,“大数据”容易暗示人们关注数据规模而忽略信息技术背境的巨大变化所涌现的新机会。政府官员的工作经历很容易把大数据应用想象为只是统计应用在数量上的升级,大数据的作用是提取信息,信息的作用是改进决策,数据多意味着信息多,信息越多决策就越准确。在不少干部的理解中,部门数据整合起来就是大数据。 3.2 两种数据使用方向:支持决策与支持操作 在政府的工作中,数据对领导层的作用主要是改进决策,但基层工作人员不需要决策,数据是用来直接操作的。政府公共服务业务主要是操作问题,服务是规范的数据处理,基层工作人员只是按章办事不需要决策分析。使用信息技术是为了提高操作服务的效率。发改委等十部门提出的“一号一窗一网”的服务要求所要解决的只是提高操作的效率。改进决策与改进操作是大数据两种不同的使用方向。 3.3 专家(人脑)与系统(电脑)使用大数据的特点 支持决策的数据应用是面向专家(包括领导)的,专家需要从数据中提取信息,以信息支持决策,从数据中领悟信息是人脑独有的本领,但不同人信息领悟力并不一致,同样的数据不同人领悟的信息不同,对决策的影响也不同,应用结果的不确定性是专家使用大数据的特点。 支持操作的数据应用不能有不确定性,操作系统的数据应用是由系统控制的,操作按确定的规则进行,没有自由量裁的可能,数据应用结果由软件决定,这种应用是电脑在使用数据,电脑不懂信息只会严格依数据操作,这种使用数据的模式保证了大规模业务行为的一致性。 3.4 政府不能忽略操作型大数据应用 政府工作存在着两种大数据应用:支持决策与支持操作,但是在多数政府官员只想着大数据支持决策而想不到改进服务操作更有效益。大部分的政府服务的精细化改进并不是决策层次上改进,而是操作层次上的改进,政府提出的“一号一窗一网”式服务关键是提高操作的效率,实践证明操作的优化的改进空间更大,大数据在提高政府决策水平上的成效往往不如提高操作效率成效明显。 四、大数据决策的局限性 4.1 大数据小数据的不同来源 以数据量来划分大数据与小数据会忽略两种数据更实质的差别,从数据产生的过程看,小数据是经人触摸过的数据,包括人工填报或更新、核对等。大数据是机器自动记录的、未经人触摸过数据。 小数据来自业务流程中的人工填报、统计调查等渠道,统计调查是可以根据决策信息的需要专门设计的,为降低成本统计经常采用抽样调查的方法。 大数据来自自动化业务运行的副产品,出于成本的考虑,政府不大可能专为收集信息而设计大数据收集链,为决策服务大数据只能利用业务系统产生的数据副产品,大数据的收集成本是由业务系统承担的。大数据的来源受到业务系统种类的限制,不是所有的信息需求都能找到恰当的数据源。 4.2 大数据适合小决策而不适合大决策 大数据适合在狭窄范围内对具体事务决策而不适合于大范围的决策。因为大数据的形成包含着先天的局限性,很多影响重大决策的信息恰恰是无法数字化的,例如国内外形势、技术创新、队伍士气、重大事件(类似美国9.11事件)都无法数字化,可数字化的现象只是小部分,以为靠数据决策就能更全面也是一种误解。政府重大决策需要考虑各方面的平衡,局部领域的大数据仅适合局部领域的决策,不适合面向全局的政府决策,精细化与全面性是不可得兼的。 4.3 改进政府操作的大数据应用 政府的大数据应用不能只关注决策应用,改进操作的大数据应用往往能够获得更好的效益。政府对公众的服务主要使用的还是以小数据为中心的数据库,但是融入现场服务数据的应用可以将服务提高到大数据的层次上并增加智能化的应用。对政府基层工作人员的支持现场化、连机化,通过云平台与实时通信能显著提高一线人员的工作效率,是提高政府基层服务的智能化的重要措施,以改进服务操作效率的智能大数据应用会有更大的成效。 五、没有人脑参与系统才能高效与智能 5.1人脑使用数据模式的效率制约 为人脑决策使用的大数据应用模式存在两点不足:一是效率上不去,大数据分析结果一旦交付大数据应用就结束了,无法形成连续服务型业务,信息的进一步应用是领导的事情,与大数据处理无关了,人脑决策的慢节奏抵消了大数据快处理的价值。 其次是大数据信息决策的效果的不确定性,决策质量与领导人的知识、思维方式、决策风格密切相关,决策效果又与执行团队的能力相关,涉及的不确定因素太多。人脑使用数据的模式无法实现数据应用效果的确定性。 5.2 电脑使用数据模式的效率优势 电脑使用数据的模式排除了人脑的参与,系统完全是由事先编写的软件直接处理数据,排除了人脑介入有两点好处:一是运行速度快,信息技术的速度优势得以充分发挥;二是保证了结果的确定性,系统的行为是可预测的,这将有利于系统可成为可组合、可叠加的功能模块,能够被集成为更复杂的系统。 5.3 智能大数据应用可形成连续性业务 排除人脑参与的数据应用模式是信息技术的自动化应用,这种模式可综合使用各种技术资源(包括云平台、物联网、移动终端、人工智能等等)建立高速、流畅连续型服务,进入智能服务的新阶段,常见的互联网搜索、电子商务、移动支付、摩拜单车、蚂蚁金服无一不是这类的智能大数据应用,这种持续的智能大数据服务更受公众欢迎、社会影响力也更大。 六、智能大数据应用的发展空间 6.1 所有的智能应用都是大数据应用 大数据是机器与机器对话的语言,只有机器与机器的高速对话才能产生如此规模的大数据。物联网、云平台、宽带网、移动终端等设施要发挥作用都要依赖机器与机器的对话,随着信息技术的大发展,机器与机器的对话速度越来越快、范围越来越广、规模越来越大,系统也越来越智能化,所有的智能数据应用都属于大数据的应用范围。 6.2 智能化的作用是提高执行的效果 虽然大数据可以用于改进决策,但智能化的目标是提高执行的效果。计算机系统的作用是使规范性、可重复的工作做的更快。对于需要创造性的、非重复性的工作信息技术是依然无能为力的,人们发现几十年来计算机对于人脑决策能力的提高始终不大,智能化应用机会还是集中在对规范业务的改进,规范业务是确定性的服务,远比充满不确定性的决策业务更能让计算机发挥作用。 6.3 操作型大数据应用的智能化趋势 以提高执行效率为目标的大数据应用将向智能化发展,以互联网为基层的现代信息技术的大发展已经为服务的智能化创造力良好的条件,早期由于通信与网络能力的限制只能在一台设备上存储自动处理系统被称为自动化处理阶段,今天自动处理系统可以综合应用网络通信、云平台数据与软件、物联网感知数据与机器学习来实现更有效的自动管理,则被称为智能化服务阶段,排除了人脑参与的大数据应用进入智能化服务没有任何障碍,大数据应用智能化成为必然趋势。 七、智能大数据应用的活力 7.1 鲜活的数据 智能化应用中的大数据资源与信息决策中的数据资源的重大不同在于前者是动态形成的,其数据环境是不断变化、不断更新的,很多数据是在运行中自动生成的,数据资源与智能系统共生,这种数据资源很难转让,数据与服务系统是统一的生命体不能单独存在的,离开了系统的数据可以用来分析但失去了原来的意义,如同离开了人体的手再也没有原来的功能了。 7.2 实时的处理 在智能系统中的大数据应用是实时处理,面向信息决策中的大数据应用是批处理。实时处理能够确保及时性,这对于提高服务效率、保持业务的连续性很重要,现在强调“一号一窗一网”式的为民办事离不开对数据的实时处理。而信息决策类大数据应用则并不需要这种高效。 7.3 持续高效的服务 智能化的大数据应用排除了人脑的干预,全部流程都是由电脑对电脑一气呵成,这样就能够达到很高的运行效率,而这是智能化系统巨大的优势,也是智能服务系统得以生存的原因,不论是搜索、购物还是其它自动化的服务,人的耐心都是很有限的,处理慢一点人们就会弃之而去。在信息决策大数据应用的结果是供人脑一次性使用的,处理速度就不那么重要了。 7.4 不断积累的智慧 能够不断积累智慧的业务更有活力,易于修改是以软件为基础的业务的极大优点,这使得软件系统成为积累智慧最方便的工具,信息系统的高速发展也得益于系统智慧积累的能力。一项可持续的智能化业务系统始终处于不停的改进、完善与扩展之中,不断推出新版本的过程是智慧积累的过程,智慧的不断积累增添了系统的服务能力与可持续性。 信息决策大数据应用则不具有这一优势,其业务不连续很难推出一个又一个的新版本,智慧积累效率就慢多了。 八、小数据服务决定大数据中心的生存 8.1 数据资源的时效性 数据资源像蔬菜一样有保鲜期,极少有越老越值钱的数据。数据集中存储很容易,由此而来的数据质量维护却是一大难题。数据生成得快贬值也快,很多数据往往还来不及处理数据就失效了,反而是那些变化稍慢、稳定期稍长的数据容易得到较多用户且服务也容易开展,这类数据大部分是小数据。 不同的数据使用方式对数据质量有不同的要求,面向操作的应用则对数据质量非常敏感,例如证照库若不能及时更新就无法使用。信息决策类应用对数据的敏感性会差一些,大数据中心应当使数据的时效性与应用需求同步,要根据需求的价值有重点有选择地组织好数据质量的维护。 8.2 大数据交易中心的困难 大数据交易中心与成为建设热点,在大数据应用刚刚开始,人们还没搞清大数据交易是什么概念时就建交易中心实在太早了。 实时服务的智能大数据应用的数据是鲜活的、是服务中自动生成的动态数据,要交易的是动态数据流还是截取的静态数据,动态的大数据交易很难,不仅谈判难处理也难,用户需要建立动态数据的实时处理系统。 静态的大数据交易更可行一些,但数据资源与应用需求并不容易匹配,这将会限制交易数的增长,另一困难是隐私权保护问题,数据需要脱敏,未脱敏的数据交易会受到限制,交易中心将长期面对交易稀缺的局面,经营很不容易。 8.3 小数据服务需要补课 发达国家是在小数据充分应用之后才开始应用大数据,国内是在小数据应用还很不足时跨越式应用大数据。小数据应用补课是各地大数据中心必须重视的问题。要看到越是简单的东西应用面越广,小数据的应用空间比大数据大得多,尤其是整合后的小数据服务,极可能成为的数据中心最火的业务。 政府服务的精细化依赖的主要是小数据,把小数据的整合服务做好,大数据中心的工作即完成了90%,千万不能轻视小数据服务,大数据中心的立身之本恰恰是小数据整合服务。 8.4 大数据中心的经济价值 大数据中心的生存本质上是一个经济问题,人们想做交易中心也是希望能够在经济上更节约、更有效益,但是效益的基础是应用规模,只有大量重复性、相似性的工作才有可能利用平台与工具来提高服务效率创造用户价值,目前小数据服务更能够满足规模经营的条件。 政府公共服务的支柱还是小数据,单独成规模的大数据服务不多,各种数据资源的综合使用会有更大的创新机会,地理数据与政府服务相结合、推动政府服务的连线化动态化可能提升用户价值,大数据中心要发展必须全力创造用户价值,唯有用户价值才能支撑大数据中心生存。 九、拓展视野,推动大数据应用创新 9.1 理念创新,积极宣传智能大数据应用 首先要拓展大数据应用理念,不能将大数据应用局限在政府信息决策的狭窄领域之中,而要看到智能大数据应用的广泛空间,将智能大数据应用与大众创业万众创新结合起来,将一切智能化应用都归入大数据应用的范围,大数据概念越广阔应用越繁荣。 利用大数据改善政府决策是大数据应用的重要方面,过去已强调得很多了,现在需要强调的是政府公共服务的智能化、精细化。大数据不仅能改善决策还能改善服务,改善服务有着更广阔的发展空间,公众的获得感更好。 9.2 为大数据应用创造良好的基础环境 对大数据应用最给力的推动是提供优良的通信环境和完善的信息基础设施。大数据应用的基础是超强的通信能力,通信能力影响全社会大数据应用的成本,包括用户的时间成本与服务商的开发与服务成本,降低通信成本是对大数据应用创新极大的支持,土壤肥沃庄稼才能茂盛。 政府数据开放是推动大数据应用的措施之一,可为大数据应用带来示范效果,政府要鼓励企业利用政府大数据开展增值服务,使更多缺乏大数据处理能力的公众也能从政府数据开放中获益。 9.3 鼓励社会大数据应用的自组织创新 大数据应用是一项创新,政府不能只从政府决策的视角来引导大数据应用方向,而要从方便公众受益的视角推动智能化的大数据应用,要鼓励社会各界智能化大数据应用的合作与自组织创新,好服务都是各种应用技术组合创新的结果,政府宜推动智慧城市大数据应用的互操作,降低不同技术合作创新的成本来促进应用创新的繁荣。 本文出处:畅享网 本文来自云栖社区合作伙伴畅享网,了解相关信息可以关注vsharing.com网站。

优秀的个人博客,低调大师

C++数组名的思考

C++数组名和编译器 目录 C数组名和编译器 目录 代码块 脚注 生成一个脚注1 野生程序猿的故事 Markdown 是一种轻量级标记语言,它允许人们使用易读易写的纯文本格式编写文档,然后转换成格式丰富的HTML页面。 —— [ 维基百科 ] 我们在编程中经常会用到数组这种数据结构,使用C++作为编程语言的同学也经常会用到指针。指针在内存中存储的内容是一个地址,而数组名也可以说是一个地址, C11规范 我在Coursera上看您的《计算概论A》的时候遇到一个关于数组名的问题: c语言规范,说的是“如果数组名不是sizeof、alignof、&的操作数,不是用来初始化char数组的string,这时数组类型转化为指向数组第一个元素的指针”。 int a[3]; a++; 这里的数组名是++的操作数,按理说a应该转化为指向数组第一个元素的指针,也就是int*类型(在编译器中我也确认了a是int 类型),这时如果a是int 类型的话为什么不能对a进行++运算呢? 关于这点我的考虑是a在这里是int const类型的,所以a不能做++运算,然而为什么编译器不显示a是int const类型,而显示a是int *类型呢? 分配内存的含义,就是分配一个指针指向分配的内存的首地址,++相当于你挪动了这个地址指针,当然也就等于释放了内存 a++相当于释放数组的内存,编译器会报错。 代码块 代码块语法遵循标准markdown代码,例如: @requires_authorization def somefunc(param1='', param2=0): '''A docstring''' if param1 > param2: # interesting print 'Greater' return (param2 - param1 + 1) or None class SomeClass: pass >>> message = '''interpreter ... prompt''' 脚注 生成一个脚注1. 未经博主允许,请勿转载. ↩

优秀的个人博客,低调大师

建设互联网医疗的思考

随着信息技术的飞速发展,传统的医疗行业正在迈入“大数据”与“智慧医疗”的时代,近期,戴尔重磅推出了其《互联医疗报告》,详细解读了目前互联医疗的内容、影响力、面临的挑战和应对措施等,并为相关机构建设互联医疗提出了建议。在互联医疗领域,技术的作用比以往更为重要。 虽然实现互联医疗是一个长期而艰巨的任务,但医疗组织现在就可以开始慢慢进行建设。 1.从小型项目做起,专注投资回报率 医疗组织可以尝试通过小型项目,并利用自身已经到位的技术和设备来获取经验和成功,寻找能以患者为中心、可获得清晰投资回报率的用例。 例如,许多医疗组织可能已经在急诊、远程ICU或远程卒中中使用了数字设备,但这些设备的数据可能尚未实现互联、收集或分析。跨职能团队的头脑风暴可以帮助医疗组织确定,哪些小型投资将在提供更好的护理、改善医疗结果和降低成本方面产生可衡量的回报。 互联医疗解决方案的价值一旦确立,各个组织便可以将其扩展到其他领域。 架构分析 在设计解决方案时,团队应该从更缺少洞察力或缺乏智能化的地方开始,并绘制出所需的数据流以弥补差距。 团队要确定的是自己需要什么数据,数据源是什么,谁将使用信息和如何使用这些信息,哪些协议和工具可以在以后轻松引入额外的数据和分析等等问题。 3.安全性设计 医疗组织必须永远将安全放在第一位。需要时刻问自己,数据管理和安全要求是什么?哪些用户、应用程序和设备可以访问?如何进行管理身份验证和验证?安全专家可以首先对现有的安全措施进行评估,然后再评估新解决方案的影响。 专家们可以通过身份管理、访问管理、加密、主动安全分析和网络安全来指导医疗组织设计和部署多方面的安全措施。 4.选择适当的合作伙伴 医疗机构应该放弃单打独斗的思想,通过寻求适当的合作伙伴来共同建立一个互联医疗生态系统。 除了将开放、基于标准、技术和设备无关的架构框架与一流的医疗解决方案进行互联,医疗组织还应该寻求与那些在聚合医疗信息技术与物联网、安全、网络和信息管理等领域具有第一手经验的技术伙伴进行合作。 当前,我国互联网医疗平台建设犹如雨后春笋,医疗机构纷纷“触网入云”,诸如云医院、互联网医院、网络医院、掌上医院发展迅猛,人们充分利用互联网技术为百姓提供多种方便快捷的就医选择,在线预约挂号、在线导医问诊、在线诊疗咨询、在线费用支付、在线结果查询等等,互联网医疗的应用正在冲击和改变着传统的就医模式.本文由朗锐慧康编辑整理(www.lrioh.com),如有侵权请联系本站。

优秀的个人博客,低调大师

江西智慧城市建设的思考

智慧城市建设是我国新型城镇化的重要内容,代表着新时期城市信息化的发展方向,是实现城市经济转型、精细管理、优化服务的重要途径。建设智慧城市,离不开先进技术的应用与支撑。2015年7月,《国务院关于积极推进“互联网+”行动的指导意见》正式发布,以此为契机,我省应进一步加快应用云计算、大数据、物联网等新一代信息技术发展智慧城市的步伐。 智慧城市建设的基础是信息化建设,即把分散的城市各部门、各行业的数字化要素、单元和系统连接起来,形成各部门、各行业互联互通的城市信息流系统,然后通过对已有的城市信息流系统进行深入分析,找出其中的瓶颈或可以优化的环节,用人工智能技术加以解决,提高自动化和智能化程度。因此,对于我省来说,智慧城市建设的战略定位应当是:其一,集聚新兴产业、转变发展方式的推手。目前,我省一部分城市的支柱产业还是资源密集型或劳动密集型产业,比较缺乏核心技术和优势品牌。在智慧城市建设中,实施创新驱动发展战略,集聚新兴产业的发展,以信息化为支撑点,才能促进自主研究开发与产业化的有机衔接,实现我省经济社会可持续发展。其二,推动公共服务均等化、改善民生保障。在我省的智慧城市建设中,提升大数据应用能力,能增强政府服务和监管的有效性;通过健全事前、事中和事后的监督机制,能实现政府与社会监督的有机结合,构成全方位的市场监督体系,形成全社会共同参与监督的环境。 在具体实践中,我省智慧城市建设应重点抓好以下两方面的工作。其一,重点推进新型工业化、城镇化、农业现代化。利用大数据平台,推动企业更有效地进行综合规划和管理,实现智能商务和智能生产;加快传统产业改造升级,加快培养战略性新兴产业,推动产业结构调整和优化,提高技术创新能力,实现新型工业化;加快成立“互联网+农业”研究促进中心,破除信息流通的技术障碍,推动农业生产、流通、营销方式的变革和农业产业发展方式的转变。其二,优先发展城市公共服务。首先,要做好有针对性的顶层设计,有重点、有选择地建设好符合本地实际的智慧模块,利用专业人才和技术团队出谋划策,制定科学的智慧城市规划。其次,政府部门要依托城市交通信息中心,制定好城市交通规划及治理政策,通过智慧城市与智能交通系统的有机结合,使市民出行更畅通、更舒心。再次,提升大数据应用能力,增强政府服务与监管的有效性。各级政府要强化引导和带动作用,确保智慧城市建设中各部门的有效对接和互联互通,及时提供并保证数据的可靠性,克服数据封闭、信息孤岛等问题;建立统一的监管平台,推进综合执法,压缩权力寻租空间;提高服务水平和监管效率,降低服务与监管成本;对电子商务领域的市场监督要实现政府和社会监督有机结合,形成全方位的市场监督体系。 本文转自d1net(转载)

优秀的个人博客,低调大师

架构的海量数据思考和处理方法

海量数据并不是一个精确的数字,而是一个相对概念。当数据量超过单机存储上限,或者单库单表的处理能力无法满足业务要求时,架构就开始面临真正的挑战。很多系统在初期可以依靠垂直扩展来解决问题,比如换更高配置的服务器、更大的内存、更快的磁盘。但这种做法的天花板很明显,成本会随着硬件规格快速上升,而且始终存在物理极限。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册