首页 文章 精选 留言 我的

精选列表

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

从零开始学习Java8 Stream,看这篇就够了

为何需要引入流 在我们平常的开发中几乎每天都会有到List、Map等集合API,若是问Java什么API使用最多,我想也应该是集合了。举例:假如我有个集合List,里面元素有1,7,3,8,2,4,9,需要找出里面大于5的元素,具体实现代码: public List<integer> getGt5Data() { List<integer> data = Arrays.asList(1, 7, 3, 8, 2, 4, 9); List<integer> result = new ArrayList&lt;&gt;(); for (Integer num : data) { if (num &gt; 5) { result.add(num); } } return result; } 这个实现让我们感觉到了集合的操作不是太完美,如果是数据库的话,我们只需要简单的在where后面加一个条件大于5就可以得到我们想要的结果,为什么Java的集合就没有这种API呢? 其次,如果我们遇到有大集合需要处理,为了提高性能,我们可能需要使用到多线程来处理,但是写并行程序的复杂度有提高了不少。 基于以上的问题,所有Java8推出了Stream Stream简介 Stream有哪些特点: 元素的序列:与集合一样可以访问里面的元素,集合讲的是数据,而流讲的是操作,比如:filter、map 源: 流也需要又一个提供数据的源,顺序和生成时的顺序一致 数据的操作:流支持类似于数据库的操作,支持顺序或者并行处理数据;上面的例子用流来实现会更加的简洁 public List<integer> getGt5Data() { return Stream.of(1, 7, 3, 8, 2, 4, 9) .filter(num -&gt; num &gt; 5) .collect(toList()); } 流水线操作:很多流的方法本身也会返回一个流,这样可以把多个操作连接起来,形成流水线操作 内部迭代:与以往的迭代不同,流使用的内部迭代,用户只需要专注于数据处理 只能遍历一次: 遍历完成之后我们的流就已经消费完了,再次遍历的话会抛出异常 使用Stream Java8中的Stream定义了很多方法,基本可以把他们分为两类:中间操作、终端操作;要使用一个流一般都需要三个操作: 定义一个数据源 定义中间操作形成流水线 定义终端操作,执行流水线,生成计算结果 构建流 使用Stream.of方法构建一个流 Stream.of("silently","9527","silently9527.cn") .forEach(System.out::println); 使用数组构建一个流 int[] nums = {3, 5, 2, 7, 8, 9}; Arrays.stream(nums).sorted().forEach(System.out::println); 通过文件构建一个流 使用java.nio.file.Files.lines方法可以轻松构建一个流对象 Files.lines(Paths.get("/Users/huaan9527/Desktop/data.txt")) .forEach(System.out::println); 中间操作 中间操作会返回另外一个流,这样可以让多个操作连接起来形成一个流水线的操作,只要不触发终端操作,那么这个中间操作都不会实际执行。 filter 该操作接受一个返回boolean的函数,当返回false的元素将会被排除掉 举例:假如我们100个客户,需要筛选出年龄大于20岁的客户 List<customer> matchCustomers = allCustomers.stream() .filter(customer -&gt; customer.getAge()&gt;20) .collect(toList()); distinct 该操作将会排除掉重复的元素 List<integer> data = Stream.of(1, 7, 3, 8, 2, 4, 9, 7, 9) .filter(num -&gt; num &gt; 5) .distinct() .collect(toList()); limit 该方法限制流只返回指定个数的元素 List<integer> data = Stream.of(1, 7, 3, 8, 2, 4, 9, 7, 9) .filter(num -&gt; num &gt; 5) .limit(2) .collect(toList()); skip 扔掉前指定个数的元素;配合limit使用可以达到翻页的效果 List<integer> data = Stream.of(1, 7, 3, 8, 2, 4, 9, 7, 9) .filter(num -&gt; num &gt; 5) .skip(1) .limit(2) .collect(toList()); map 该方法提供一个函数,流中的每个元素都会应用到这个函数上,返回的结果将形成新类型的流继续后续操作。 举例:假如我们100个客户,需要筛选出年龄大于20岁的客户,打印出他们的名字 allCustomers.stream() .filter(customer -&gt; customer.getAge() &gt; 20) .map(Customer::getName) .forEach(System.out::println); 在调用map之前流的类型是Stream<customer>,执行完map之后的类型是Stream<string> flatMap 假如我们需要把客户的名字中的每个字符打印出来,代码如下: List<customer> allCustomers = Arrays.asList(new Customer("silently9527", 30)); allCustomers.stream() .filter(customer -&gt; customer.getAge() &gt; 20) .map(customer -&gt; customer.getName().split("")) .forEach(System.out::println); 执行本次结果,你会发现没有达到期望的结果,打印的结果 [Ljava.lang.String;@38cccef 这是因为调用map之后返回的流类型是Stream<string[]>,所有forEach的输入就是String[];这时候我们需要使用flatMap把String[]中的每个元素都转换成一个流,然后在把所有的流连接成一个流,修改后的代码如下 List<customer> allCustomers = Arrays.asList(new Customer("silently9527", 30)); allCustomers.stream() .filter(customer -&gt; customer.getAge() &gt; 20) .map(customer -&gt; customer.getName().split("")) .flatMap(Arrays::stream) .forEach(System.out::println); 执行结果: sorted 对所有的元素进行排序 List<integer> numbers = Arrays.asList(1, 7, 3, 8, 2, 4, 9); numbers.stream().sorted(Integer::compareTo).forEach(System.out::println); 终端操作 终端操作会执行所有的中间操作生成执行的结果,执行的结果不在是一个流。 anyMatch 如果流中有一个元素满足条件将返回true if (allCustomers.stream().anyMatch(customer -&gt; "silently9527".equals(customer.getName()))) { System.out.println("存在用户silently9527"); } allMatch 确保流中所有的元素都能满足 if (allCustomers.stream().allMatch(customer -&gt; customer.getAge() &gt; 20)) { System.out.println("所有用户年龄都大于20"); } noneMatch 与allMatch操作相反,确保流中所有的元素都不满足 if (allCustomers.stream().noneMatch(customer -&gt; customer.getAge() &lt; 20)) { System.out.println("所有用户年龄都大于20"); } findAny 返回流中的任意一个元素,比如返回大于20岁的任意一个客户 Optional<customer> optional = allCustomers.stream() .filter(customer -&gt; customer.getAge() &gt; 20) .findAny(); findFirst 返回流中的第一个元素 Optional<customer> optional = allCustomers.stream() .filter(customer -&gt; customer.getAge() &gt; 20) .findFirst(); reduce 接受两个参数:一个初始值,一个BinaryOperator<t> accumulator将两个元素合并成一个新的值 比如我们对一个数字list累加 List<integer> numbers = Arrays.asList(1, 7, 3, 8, 2, 4, 9); Integer sum = numbers.stream().reduce(0, (a, b) -&gt; a + b); 上面的代码,我们可以简写 Integer reduce = numbers.stream().reduce(0, Integer::sum); 找出流中的最大值、最小值 min、max numbers.stream().reduce(Integer::max) numbers.stream().reduce(Integer::min) count 统计流中元素的个数 numbers.stream().count() 数据收集器collect 在Java8中已经预定义了很多收集器,我们可以直接使用,所有的收集器都定义在了Collectors中,基本上可以把这些方法分为三类: 将元素归约和汇总成一个值 分组 分区 归约和汇总 先看下我们之前求最大值和最小值采用收集器如何实现 找出年龄最大和最小的客户 Optional<customer> minAgeCustomer = allCustomers.stream().collect(minBy(Comparator.comparing(Customer::getAge))); Optional<customer> maxAgeCustomer = allCustomers.stream().collect(maxBy(Comparator.comparing(Customer::getAge))); 求取年龄的平均值 Double avgAge = allCustomers.stream().collect(averagingInt(Customer::getAge)); 进行字符串的连接 把客户所有人的名字连接成一个字符串用逗号分隔 allCustomers.stream().map(Customer::getName).collect(joining(",")); 分组 在数据库的操作中,我们可以轻松的实现通过一个属性或者多个属性进行数据分组,接下来我们看看Java8如何来实现这个功能。 根据客户的年龄进行分组 Map<integer, list<customer>&gt; groupByAge = allCustomers.stream().collect(groupingBy(Customer::getAge)); Map的key就是分组的值年龄,List<customer>就是相同年龄的用户 我们需要先按照用户的地区分组,在按年龄分组 Map<string, map<integer, list<customer>&gt;&gt; groups = allCustomers.stream() .collect(groupingBy(Customer::getArea, groupingBy(Customer::getAge))); 在相对于普通的分组,这里多传了第二个参数又是一个groupingBy;理论上我们可以通过这个方式扩展到n层分组 分组后再统计数量 Map<string, long> groupByCounting = allCustomers.stream() .collect(groupingBy(Customer::getArea, counting())); 以用户所在地区分组后找出年龄最大的用户 Map<string, optional<customer>&gt; optionalMap = allCustomers.stream() .collect(groupingBy(Customer::getArea, maxBy(Comparator.comparing(Customer::getAge)))); 这时候返回的Map中的value被Optional包裹,如果我们需要去掉Optional,可以使用collectingAndThen Map<string, customer> customerMap = allCustomers.stream() .collect(groupingBy(Customer::getArea, collectingAndThen(maxBy(Comparator.comparing(Customer::getAge)), Optional::get) )); 写在最后(看完不点赞,你们想白嫖我吗) 首先感谢大家可以耐心地读到这里。点关注,不迷路 当然,文中或许会存在或多或少的不足、错误之处,有建议或者意见也非常欢迎大家在评论交流。 最后,白嫖不好,创作不易,希望朋友们可以点赞评论关注三连,因为这些就是我分享的全部动力来源🙏 > 原创不易 转载请注明出处:https://silently9527.cn/archives/66 参数资料《Java8实战》

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

【HarmonyOS】应用开发HarmonyOS应用开发学习指南 - HDC2020

2020年9月10日,华为HarmonyOS 2.0版本正式官宣!这一次,借助 HarmonyOS 全场景分布式系统和设备生态,将定义全新的硬件、交互和服务体验,打开焕然一新的全场景世界,不愧是HarmonyOS! 那HarmonyOS系统是什么呢?它又将如何助力开发者们更加便捷、高效地开发应用? 小编这就精心准备并汇总了如下HarmonyOS应用开发的相关资料,赶快戳下方链接,加入 HarmonyOS 生态,与我们一起构建万物互联的新时代吧~ 【HDC2020】1-HarmonyOS理念和设计 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202366763645670051&fid=0101303901040230869 【HDC2020】2-从零开始开发一个HarmonyOS应用 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202366766237660052&fid=0101303901040230869 【HDC2020】3-HarmonyOS应用程序框架揭秘 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0203366767087470147&fid=0101303901040230869 【HDC2020】4-分布式软总线 - 构建低时延高带宽的本地多设备虚拟网络 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202366767819580054&fid=0101303901040230869 【HDC2020】5-分布式数据管理 - 管理跨设备共享数据 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202366769035840055&fid=0101303901040230869 【HDC2020】6-调度分布式任务 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202366770914620056&fid=0101303901040230869 【HDC2020】7-开发超级虚拟终端创新体验 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0203366773449290148&fid=0101303901040230869 【HDC2020】8-HarmonyOS安全和隐私设计 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0203366775000810149&fid=0101303901040230869 【HDC2020】9-HarmonyOS UX体验设计 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202366780404430057&fid=0101303901040230869 【HDC2020】10-HarmonyOS开发者平台和工具发布 电梯直达→ https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202366780788690058&fid=0101303901040230869 【HDC2020】11-DevEco Studio分布式跨设备应用开发实践 电梯直达→ https://developer.huawei.com/consumer/cn/forum/topicview?tid=0203366780988340150&fid=0101303901040230869 【HDC2020】13-HarmonyOS应用测试最佳实践 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202366781385240059&fid=0101303901040230869 【HDC2020】14-HarmonyOS纯净应用开发 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0202366781587320060&fid=0101303901040230869 【HDC2020】15-HarmonyOS模拟器 电梯直达→https://developer.huawei.com/consumer/cn/forum/topicview?tid=0203366781781100152&fid=0101303901040230869 原文链接:https://developer.huawei.com/consumer/cn/forum/topicview?tid=0203366992656710163&fid=0101303901040230869 原作者:我是六水呀

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

教程 | MySql都会了,确定不学习一下MyCat分片?

这是小小本周的第二篇,我是小小,本周将会介绍MyCat以及MyCat分片。 MyCat 介绍 什么是MyCat 官方网站::http://www.mycat.org.cn/ http://www.mycat.io/ db proxy Mycat MyCat 架构 MyCat 核心概念 Schema Schema:由它指定逻辑数据库(相当于MySQL的database数据库) Table Table:逻辑表(相当于MySQL的table表) DataNode DataNode:真正存储数据的物理节点 DataHost DataHost:存储节点所在的数据库主机(指定MySQL数据库的连接信息) User User:MyCat的用户(类似于MySQL的用户,支持多用户) MyCat 主要解决问题 海量数据保存 2。查询优化 MyCat 对多数据库的支持 MyCat 分片策略 MyCAT支持水平分片与垂直分片:水平分片:一个表格的数据分割到多个节点上,按照行分隔。垂直分片:一个数据库中多个表格A,B,C,A存储到节点1上,B存储到节点2上,C存储到节点3 上。MyCAT通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分 片字段并绑定一个函数,来实现动态分片算法。 Schema Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。 Table Table:表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的 逻辑数据节点DataNode。在此可以指定表的分片规则。 DataNode DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过 DataHost来关联到后端某个具体数据库上 DataHost DataHost:定义某个物理库的访问地址,用于捆绑到Datanode上 MyCat 安装 下载MyCat wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 解压缩 tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 进入mycat/bin,启动MyCat - 启动命令:./mycat start- 停止命令:./mycat stop- 重启命令:./mycat restart- 查看状态:./mycat status 访问MyCat 使用mysql的客户端直接连接mycat服务。默认服务端口为【8066】mysql -uroot -p123456 -h127.0.0.1 -P8066 MyCat 分片 配置schema.xml 什么是schema.xml schema.xml作为Mycat中重要的配置文件之一,管理着Mycat的逻辑库、表、分片规则、DataNode 以及DataHost之间的映射关系。弄懂这些配置,是正确使用Mycat的前提。schema 标签用于定义MyCat实例中的逻辑库 Table 标签定义了MyCat中的逻辑表 dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。dataHost标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读 写分离配置和心跳语句。 Schema.xml 配置 <?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"> <!-- schema : 逻辑库 name:逻辑库名称 sqlMaxLimit:一次取多少条数据 要超过用limit xxx table:逻辑表 dataNode:数据节点 对应datanode标签 rule:分片规则,对应rule.xml subTables:子表 primaryKey:分片主键 可缓存 --> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100"> <!-- auto sharding by id (long) --> 配置Server.xml server.xml介绍 server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。 server.xml配置 配置rule.xml rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算 法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标 签。在具体使用过程中可以按照需求添加tableRule和function。 此配置文件可以不用修改,使用默认即可。 <table name="item" dataNode="dn1,dn2,dn3" rule="mod-long" primaryKey="ID"/> </schema> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /> <!-- dataHost : 数据主机(节点主机) balance:1 :读写分离 0 :读写不分离 writeType:0 第一个writeHost写, 1 随机writeHost写 dbDriver:数据库驱动 native:MySQL JDBC:Oracle、SQLServer switchType:是否主动读 1、主从自动切换 -1 不切换 2 当从机延时超过slaveThreshold值时切换为主读 --> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="192.168.24.129:3306" user="root" password="root" > </writeHost> </dataHost></mycat:schema> 配置server.xml server.xml 介绍 server.xml几乎保存了所有mycat需要的系统配置信息。最常用的是在此配置用户名、密码及权限。 server.xml 配置 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:server SYSTEM "server.dtd"><mycat:server xmlns:mycat="http://io.mycat/"> <system> <property name="defaultSqlParser">druidparser</property> </system> <user name="mycat"> <property name="password">mycat</property> <property name="schemas">TESTDB</property> </user></mycat:server> 配置rule.xml rule.xml里面就定义了我们对表进行拆分所涉及到的规则定义。我们可以灵活的对表使用不同的分片算 法,或者对表使用相同的算法但具体的参数不同。这个文件里面主要有tableRule和function这两个标 签。在具体使用过程中可以按照需求添加tableRule和function。此配置文件可以不用修改,使用默认即可 <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:rule SYSTEM "rule.dtd"><mycat:rule xmlns:mycat=”http://io.mycat/“ ><tableRule name="sharding-by-intfile"><rule> <columns>sharding_id</columns> <algorithm>hash-int</algorithm></rule></tableRule><function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"><property name="mapFile">partition-hash-int.txt</property></function> </mycat:rule> tableRule 标签配置说明: name 属性指定唯一的名字,用于标识不同的表规则 rule 标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。columns 内指定要拆分的列名字。algorithm 使用 function 标签中的 name 属性。连接表规则和具体路由算法。当然,多个表规则 可以连接到同一个路由算法上。table 标签内使用。让逻辑表使用这个规则进行分片。 function 标签配置说明: name 指定算法的名字。class 制定路由算法具体的类名字。property 为具体算法需要用到的一些属性。 几个常用的分片规则 连续分片 日期列分区法 <!--按固定时间分片--><tableRule name="sharding-by-date"> <rule> <columns>create_time</columns> <algorithm>sharding-by-date</algorithm> </rule></tableRule><function name="sharding-by-date" class="io.mycat.route.function..PartitionByDate"><property name="dateFormat">yyyy-MM-dd</property><property name="sBeginDate">2014-01-01</property><property name="sPartionDay">10</property></function> <!--按自然月分片--><tableRule name="sharding-by-month"><rule> 配置说明: tableRule标签: columns :标识将要分片的表字段 algorithm :指定分片函数 function标签: dateFormat :日期格式 sBeginDate :开始日期 sPartionDay :分区天数,即默认从开始日期算起,分隔10天一个分区 二、范围约定 配置说明: tableRule标签: <columns>create_time</columns> <algorithm>sharding-by-month</algorithm></rule></tableRule><function name="sharding-by-month" class="io.mycat.route.function..PartitionByMonth"><property name="dateFormat">yyyy-MM-dd</property><property name="sBeginDate">2014-01-01</property></function> <!-- 按单月小时分片 适合做日志,每月末,手工清理 --><tableRule name="sharding-by-hour"><rule> <columns>create_time</columns> <algorithm>sharding-by-hour</algorithm></rule></tableRule><function name="sharding-by-hour" class="io.mycat.route.function..LastestMonthPartition"><property name="splitOneDay">24</property></function> 配置说明 tableRule标签:columns :标识将要分片的表字段 algorithm :指定分片函数 function标签:dateFormat :日期格式 sBeginDate :开始日期 sPartionDay :分区天数,即默认从开始日期算起,分隔10天一个分区 范围约定 <tableRule name="auto-sharding-long"><rule><columns>user_id</columns><algorithm>rang-long</algorithm></rule></tableRule><function name="rang-long"class="io.mycat.route.function.AutoPartitionByLong"><property name="mapFile">autopartition-long.txt</property></function> 配置说明 tableRule标签:columns :标识将要分片的表字段 algorithm :指定分片函数 function标签:mapFile :指定分片函数需要的配置文件名称 autopartition-long.txt文件内容:所有的节点配置都是从0开始,及0代表节点1,此配置非常简单,即预先制定可能的id范围对应某个分 片 # range start-end ,data node index# K=1000,M=10000.0-500M=0 0-100 0500M-1000M=1 101-200 1201-300 21000M-1500M=2default=0# 或以下写法# 0-10000000=0# 10000001-20000000=1 优势:扩容无需迁移数据 缺点:热点数据,并发受限 离散分片 枚举法 <tableRule name="sharding-by-intfile"> <rule> <columns>user_id</columns> <algorithm>hash-int</algorithm> </rule></tableRule><function name="hash-int" class="io.mycat.route.function.PartitionByFileMap"><property name="mapFile">partition-hash-int.txt</property><property name="type">0</property><property name="defaultNode">0</property></function> 配置说明 tableRule标签:columns :标识将要分片的表字段 algorithm :指定分片函数 function标签:mapFile :指定分片函数需要的配置文件名称 type :默认值为0,0表示Integer,非零表示String defaultNode :指定默认节点,小于0表示不设置默认节点,大于等于0表示设置默认节点,0代表节 点1。 默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点。如果不配置默认节点(defaultNode值小于0表示不配置默认节点),碰到不识别的枚举值 就会报错: partition-hash-int.txt 配置: 10000=0 列等于10000 放第一个分片10010=1男=0女=1beijing=0tianjin=1zhanghai=2 求模法 <tableRule name="mod-long"><rule><columns>user_id</columns><algorithm>mod-long</algorithm></rule></tableRule><function name="mod-long"class="io.mycat.route.function.PartitionByMod"><!-- how many data nodes --><property name="count">3</property></function> tableRule标签:columns :标识将要分片的表字段 algorithm :指定分片函数 function标签:count :节点数量 一致性hash <tableRule name="sharding-by-murmur"> <rule> <columns>user_id</columns> <algorithm>murmur</algorithm> </rule></tableRule><function name="murmur" class="io.mycat.route.function.PartitionByMurmurHash"><!-- 默认是0 --><property name="seed">0</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片 --><property name="count">2</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 --><property name="virtualBucketTimes">160</property><!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 --><!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property>用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmurhash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 --></function> 等,还有一些其他分片,这里,暂时不说明 测试分片 把商品表分片存储到三个数据节点上。 创建表 配置完毕后,重新启动mycat。使用mysql客户端连接mycat,创建表。 CREATE TABLE item (id int(11) NOT NULL,name varchar(20) DEFAULT NULL,PRIMARY KEY (id)) ENGINE=InnoDB DEFAULT CHARSET=utf8 分片测试 分片策略指定为“auto-sharding-long” 分片规则指定为“mod-long” 关于作者 我是小小,来自双鱼座的,外太空的一枚小孩纸,目前漂泊在一线城市,成为一枚正经的北漂人,我是小小,本期MyCat分片结束,我们下期再见。 小明菜市场 推荐阅读 ●教程 | Hadoop集群搭建和简单应用 ●文末送书 | WAF 那些事 ●为什么系列之不能重写service方法 ●细说 | "失效"的private修饰符 ●知道 | 同学,你都了解关系型数据库,确定不了解一下这种数据库吗? 给我个好看再走好吗? 本文分享自微信公众号 - 小明菜市场(fileGeek)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

高手问答 —— Java 二十五载,你开始学习 Kotlin 了吗?

Kotlin是一种广泛的通用语言,你可以在任何原先使用Java的地方以及其他更多场景中使用它。自从Google官方宣布Kotlin为Android的开发语言后,Kotlin的发展势头极为迅速,已成为编程语言界的又一颗新星,在业界得到了广泛的关注。 协程是一个重要技术,它的最重要两个作用,一是可以让异步代码同步化,降低异步程序的设计复杂度;二是可以实现轻量级的并发,提高系统资源的利用率。在大厂面试时,如果你有协程经验,那绝对是大大的加分项。 OSCHINA本期高手问答(2020 年 9月 3日——2020 年 9月 8日) 我们请来了霍丙乾老师@Bennyhuo,如果你对 Kotlin 以及 Kotlin 协程感兴趣,不管是用法,还是原理,你都可以在这期高手问答得到启发。 问答主题 本次问答主要包括以下方向: Kotlin 语言特性相关的话题 Kotlin 协程的实现机制、使用场景相关的话题 有其他相关的问题,也欢迎提问。 嘉宾简介 霍丙乾(Bennyhuo),毕业于北京邮电大学,现任腾讯地图数据采集研发中心移动客户端团队技术负责人。资深 Kotlin 技术专家,国内知名的 Kotlin 开发者和布道师。2016年10月创建微信公众号 Kotlin,持续发布 Kotlin 相关的文章和教学视频,颇受欢迎。2017年初开始参与 Kotlin 中文相关网站的翻译和维护至今。 著有《深入理解 Kotlin 协程》一书,已由机械工业出版社出版。 为了鼓励提问@华章会在问答结束后从提问者中抽取5名幸运会员赠与正版《深入理解 Kotlin 协程》1本 从工作机制、实现原理、应用场景、使用方法、实践技巧、标准库、框架、应用案例等多个维度全面讲解Kotlin协程的专著,它同时提供了多语言视角,亦可通过本书了解其他语言的协程。 适读人群 :本书适合有 Java 并发开发经验并有良好 Kotlin 基础的读者阅读。 购买地址:https://item.jd.com/12898592.html OSChina 高手问答一贯的风格,不欢迎任何与主题无关的讨论和喷子。 下面欢迎大家就相关问题向霍丙乾老师@Bennyhuo提问,请直接回帖提问。

资源下载

更多资源
优质分享App

优质分享App

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

腾讯云软件源

腾讯云软件源

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

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应用均可从中受益。

用户登录
用户注册