首页 文章 精选 留言 我的

精选列表

搜索[学习],共10000篇文章
优秀的个人博客,低调大师

Python零基础学习代码实践 —— 提取字符串里面的单词数

str = input() str1 = str.strip() index = 0 count = 0 while index < len(str1): while str1[index] != " ": index += 1 if index == len(str1): break count += 1 if index == len(str1): break while str1[index] == " ": index += 1 print(count) 执行结果 C:\Users\Administrator\AppData\Local\Programs\Python\Python37-32\python.exe C:/Users/Administrator/PycharmProjects/untitled/day005/提取字符转里面的单词数.py 4 Process finished with exit code 0

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

Java程序员干货学习笔记—Spring结合MyBatis实现数据库读写分离

随着系统用户访问量的不断增加,数据库的频繁访问将成为我们系统的一大瓶颈之一。由于项目前期用户量不大,我们实现单一的数据库就能完成。但是后期单一的数据库根本无法支撑庞大的项目去访问数据库,那么如何解决这个问题呢? 实际的应用中,数据库都是读多写少(读取数据的频率高,更新数据的频率相对较少),而读取数据通常耗时比较长,占用数据库服务器的CPU较多,从而影响用户体验。我们通常的做法就是把查询从主库中抽取出来,采用多个从库,使用负载均衡,减轻每个从库的查询压力。 采用读写分离技术的目标:有效减轻Master库的压力,又可以把用户查询数据的请求分发到不同的Slave库,从而保证系统的健壮性。我们看下采用读写分离的背景。 我们在项目开发初期的时候就设计了一个简单的读写分离,现在我把demo分享给大家。 采用技术Spring + mybatis 首先定义一个annotation import java.lang.annotation.ElementType; import java.lang.annotation.Target; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface DataSource { public String value(); } 再定义一个HandleDataSource public class HandleDataSource { public static final ThreadLocal holder = new ThreadLocal(); public static void putDataSource(String datasource) { holder.set(datasource); } public static String getDataSource() { return holder.get(); } } 定义一个切面 import java.lang.reflect.Method; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.reflect.MethodSignature; public class DataSourceAspect { public void pointCut() { }; public void before(JoinPoint point) { Object target = point.getTarget();// 拦截的实体类 String method = point.getSignature().getName();// 拦截的方法名称 Class[] classz = target.getClass().getInterfaces(); Class[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes();// 拦截的方法参数类型 try { Method m = classz[0].getMethod(method, parameterTypes); if (m != null && m.isAnnotationPresent(DataSource.class)) { DataSource data = m.getAnnotation(DataSource.class); HandleDataSource.putDataSource(data.value()); } } catch (Exception e) { e.printStackTrace(); } } } 获取数据源 import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; public class ChooseDataSource extends AbstractRoutingDataSource { protected Object determineCurrentLookupKey() { return HandleDataSource.getDataSource(); } } 配置XMl classpath*:mysql.propertiescom.mysql.jdbc.Driver${jdbc.url}${jdbc.user}${jdbc.password}SELECT 1 FROM DUAL32510010000true60com.mysql.jdbc.Driver${jdbc.url.read}${jdbc.user.read}${jdbc.password.read}SELECT 1 FROM DUAL32510010000true60 注解到service接口上面 数据库表就一张 根据mybatis的xml大家自己建一下 另外这里还有一个瑕疵就是,当你使用注解事务的时候系统只能读取默认的数据源,这个问题主要是因为spring的事务和自定义的aop存在一个先后顺序的问题 Spring中的事务是通过aop来实现的,当我们自己写aop拦截的时候,会遇到跟spring的事务aop执行的先后顺序问题,比如说动态切换数据源的问题,如果事务在前,数据源切换在后,会导致数据源切换失效,所以就用到了Order(排序)这个关键字. 我们可以通过在@AspectJ的方法中实现org.springframework.core.Ordered 这个接口来定义order的顺序,order 的值越小,说明越先被执行。 本文源码获取:关注我,感谢大家支持。点击这里加入获取

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

动力节点Java学习资料为互联网应用文件存储而生之FastDFS

分布式文件系统 (Distributed File System) 是一个用来管理文件的软件或软件服务器,但这个软件所管理的文件通常不是在一个服务器节点上,而是在多个服务器节点上,这些服务器节点通过网络相连构成一个庞大的文件存储服务器集群,这些服务器都用于存储文件资源,通过分布式文件系统来管理这些服务器上的文件; 常见的分布式文件系统有:FastDFS、GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS等; FastDFS是一个开源的轻量级分布式文件系统,为互联网应用量身定做,简单、灵活、高效,采用C语言开发,由阿里巴巴开发并开源; FastDFS对文件进行管理,功能包括:文件存储、文件同步、文件访问(文件上传、文件下载、文件删除)等,解决了大容量文件存储的问题,特别适合以文件为载体的在线服务,如相册网站、文档网站、图片网站等等; FastDFS充分考虑了冗余备份、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务; FastDFS发展历史 2008年4月项目启动,7月发布第一个版本V1.00,两年时间内持续升级到V1.29; 2010年8月推出V2.00; 2011年6月推出V3.00; 2012年10月推出V4.0.0; 2013年12月推出V5.0.0; 截止目前最新版是V5.11;(2017年6月发布) FastDFS系统架构从第一个版本发布后一直没有大的调整,高版本完全兼容低版本的数据,可以做到平滑升级,推荐更新升级到最新版本; FastDFS代码托管在github上:https://github.com/happyfish100/fastdfs FastDFS整体架构 FastDFS文件系统由两大部分构成,一个是客户端,一个是服务端; 客户端通常指我们的程序,比如我们的Java程序去连接FastDFS、操作FastDFS,那我们的Java程序就是一个客户端; FastDFS提供专有API访问,目前提供了 C、Java 和 PHP 几种编程语言的API,用来访问FastDFS文件系统; 服务端由两个部分构成:一个是跟踪器(tracker),一个是存储节点(storage); 跟踪器(tracker)主要做调度工作,在内存中记录集群中存储节点storage的状态信息,是前端Client和后端存储节点storage的枢纽; 因为相关信息全部在内存中,Tracker server的性能非常高,一个较大的集群(比如上百个group)中有3台就足够了; 存储节点(storage)用于存储文件,包括文件和文件属性(meta data)都保存到存储服务器磁盘上,完成文件管理的所有功能:文件存储、文件同步和提供文件访问等;

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

go微服务框架go-micro深度学习(三) Registry服务的注册和发现

服务的注册与发现是微服务必不可少的功能,这样系统才能有更高的性能,更高的可用性。go-micro框架的服务发现有自己能用的接口Registry。只要实现这个接口就可以定制自己的服务注册和发现。 go-micro在客户端做的负载,典型的Balancing-aware Client模式。 服务端把服务的地址信息保存到Registry, 然后定时的心跳检查,或者定时的重新注册服务。客户端监听Registry,最好是把服务信息保存到本地,监听服务的变动,更新缓存。当调用服务端的接口是时,根据客户端的服务列表和负载算法选择服务端进行通信。 go-micro的能用Registry接口 type Registry interface { Register(*Service, ...RegisterOption) error Deregister(*Service) error GetService(string) ([]*Service, error) ListServices() ([]*Service, error) Watch(...WatchOption) (Watcher, error) String() string Options() Options } type Watcher interface { // Next is a blocking call Next() (*Result, error) Stop() } 这个接口还是很简单明了的,看方法也大概能猜到主要的作用 Register方法和Deregister是服务端用于注册服务的,Watcher接口是客户端用于监听服务信息变化的。 接下来我以go-micro的etcdv3为Registry的例给大家详细讲解一下go-micro的详细服务发现过程 go-micro 服务端注册服务 流程图 服务端看上去流程还是比较简单的,当服务端调用Run()方法时,会调用service.Start()方法。这个除了监听端口,启动服务,还会把服务的ip端口号信息,和所有的公开接口的元数据信息保存到我们选择的Register服务器上去。 看上去没有问题,但是,如果我们的节点发生故障,也是需要告诉Register把我们的节点信息删除掉。 Run()方法中有个go s.run(ex) 方法的调用,这个方法就是根据我们设置interval去重新注册服务,当然比较保险的方式是我们把服务的ttl也设置上,这样当服务在未知的情况下崩溃,到了ttl的时间Register服务也会自动把信息删除掉。 设置服务的ttl和 interval // 初始化服务 service := micro.NewService( micro.Name(common.ServiceName), micro.RegisterTTL(time.Second*30), micro.RegisterInterval(time.Second*20), micro.Registry(reg), ) ttl就是注册服务的过期时间,interval就是间隔多久再次注册服务。如果系统崩溃,过期时间也会把服务删除掉。客户端当然也会有相应的判断,下面会详细解说 客户端发现服务 客户端的服务发现要步骤多一些,但并不复杂,他涉及到服务选择Selector和服务发现Register两部分。 Selector是基于服务发现的,根据你选择的主机选择算法,返回主机的信息。默认的情况,go-micro是每次要得到服务器主机的信息都要去Register去获取。但是查看cmd.go的源码你会发现默认初始化的值,selector的默认flag是cache。DefaultSelectors里的cache对应的就是初始化cacheSelector方法 但是当你在执行service.Init()方法时 go-micro会把默认的selector替换成cacheSelector,具体的实现是在cmd.go的Before方法里 cacheSelector 会把从Register里获取的主机信息缓存起来。并设置超时时间,如果超时则重新获取。在获取主机信息的时候他会单独跑一个协程,去watch服务的注册,如果有新节点发现,则加到缓存中,如果有节点故障则删除缓存中的节点信息。当client还要根据selector选择的主机选择算法才能得到主机信息,目前只有两种算法,循环和随机法。为了增加执行效率,很client端也会设置缓存连接池,这个点,以后会详细说。 所以大概的客户端服务发现流程是下面这样 主要的调用过程都在Call方法内 主要的思路是 从Selector里得到选择主机策略方法next。 根据Retory是否重试调用服务,调用服务的过程是,从next 方法内得到主机,连接并传输数据 ,如果失败则重试,重试时,会根据主机选择策略方法next重新得到一个新的主机进行操作。

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

AI=机器学习²,我们在去往²的路上 | 普林斯顿范剑青教授

在9月18日“2018世界人工智能大会”智能金融主题论坛上,中国互联网金融协会会长李东荣,加州大学伯克利分校迈克尔·欧文·乔丹(Michael I. Jordan)教授,复旦大学大数据学院院长、普林斯顿大学教授范剑青、汇付天下董事长兼CEO周晔带来了主题演讲。 其中,范剑青教授分享了《数据智能与金融创新》。他主要介绍了人工智能的兴起,以及数据智能如何增强市场效率,加速产业发展的,以及引领高科技的发展的。“人工智能的目的与价值,就是把大数据加工成智慧数据,为经济发展提供新能源,为科技创新提供新依据,为管理决策提供新信息。” “大数据与人工智能为健康医疗、科学发现、技术创新、商业管理、政府决策等带来由信息海啸驱动的又一次工业革命,同时方方面面影响着人类的工作、生活和通讯方式。各行各业创新所产生的大量数据又增加了对海量数据处理和分析的强烈需

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

用户登录
用户注册