首页 文章 精选 留言 我的

精选列表

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

Redis 单key值过大 优化方式

image.png Redis使用过程中经常会有各种大key的情况, 比如: 1: 单个简单的key存储的value很大 2: hash, set,zset,list 中存储过多的元素(以万为单位) 由于redis是单线程运行的,如果一次操作的value很大会对整个redis的响应时间造成负面影响,所以,业务上能拆则拆,下面举几个典型的分拆方案。 1、单个简单的key存储的value很大 1.1、 改对象需要每次都整存整取 可以尝试将对象分拆成几个key-value, 使用multiGet获取值,这样分拆的意义在于分拆单次操作的压力,将操作压力平摊到多个redis实例中,降低对单个redis的IO影响; 1.2、该对象每次只需要存取部分数据 可以像第一种做法一样,分拆成几个key-value, 也可以将这个存储在一个hash中,每个field代表一个具体的属性,使用hget,hmget来获取部分的value,使用hset,hmset来更新部分属性 2、 hash, set,zset,list 中存储过多的元素 类似于场景一种的第一个做法,可以将这些元素分拆。 以hash为例,原先的正常存取流程是 hget(hashKey, field) ; hset(hashKey, field, value) 现在,固定一个桶的数量,比如 10000, 每次存取的时候,先在本地计算field的hash值,模除 10000, 确定了该field落在哪个key上。 newHashKey = hashKey + (*hash*(field) % 10000); hset (newHashKey, field, value) ; hget(newHashKey, field) set, zset, list 也可以类似上述做法. 但有些不适合的场景,比如,要保证 lpop 的数据的确是最早push到list中去的,这个就需要一些附加的属性,或者是在 key的拼接上做一些工作(比如list按照时间来分拆)。 个人介绍: 高广超:多年一线互联网研发与架构设计经验,擅长设计与落地高可用、高性能、可扩展的互联网架构。 本文首发在 高广超的简书博客 转载请注明! 简书博客 头条号

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

hive优化--增加减少map数

如何合并小文件,减少map数? 假设一个 SQL 任务: Select count(1) from popt_tbaccountcopy_mes where pt = ‘2012-07-04’; 该任务的 inputdir /group/p_sdo_data/p_sdo_data_etl/pt/popt_tbaccountcopy_mes/pt=2012-07-04 共有 194 个文件,其中很多是远远小于 128m 的小文件,总大小 9G ,正常执行会用 194 个 map 任务。 Map 总共消耗的计算资源: SLOTS_MILLIS_MAPS= 623,020 我通过以下方法来在 map 执行前合并小文件,减少 map 数: set mapred.max.split.size=100000000; set mapred.min.split.size.per.node=100000000; set mapred.min.split.size.per.rack=100000000; set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 再执行上面的语句,用了 74 个 map 任务, map 消耗的计算资源: SLOTS_MILLIS_MAPS= 333,500 对于这个简单 SQL 任务,执行时间上可能差不多,但节省了一半的计算资源。 大概解释一下, 100000000 表示 100M, set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat; 这个参数表示执行前进行小文件合并, 前面三个参数确定合并文件块的大小,大于文件块大小 128m 的,按照 128m 来分隔,小于 128m, 大于 100m 的,按照 100m 来分隔,把那些小于 100m 的(包括小文件和分隔大文件剩下的), 进行合并 , 最终生成了 74 个块。 如何适当的增加 map 数? 当 input 的文件都很大,任务逻辑复杂, map 执行非常慢的时候,可以考虑增加 Map 数,来使得每个 map 处理的数据量减少,从而提高任务的执行效率。 假设有这样一个任务: Select data_desc, count(1), count(distinct id), sum(case when …), sum(case when ...), sum(…) from a group by data_desc 如果表 a 只有一个文件,大小为 120M ,但包含几千万的记录,如果用 1 个 map 去完成这个任务,肯定是比较耗时的,这种情况下,我们要考虑将这一个文件合理的拆分成多个, 这样就可以用多个 map 任务去完成。 set mapred.reduce.tasks=10; create table a_1 as select * from a distribute by rand(123); 这样会将 a 表的记录,随机的分散到包含 10 个文件的 a_1 表中,再用 a_1 代替上面 sql 中的 a 表,则会用 10 个 map 任务去完成。 每个 map 任务处理大于 12M (几百万记录)的数据,效率肯定会好很多。 看上去,貌似这两种有些矛盾,一个是要合并小文件,一个是要把大文件拆成小文件,这点正是重点需要关注的地方, 根据实际情况,控制 map 数量需要遵循两个原则:使大数据量利用合适的 map 数;使单个 map 任务处理合适的数据量; 本文转自 yntmdr 51CTO博客,原文链接:http://blog.51cto.com/yntmdr/1740587,如需转载请自行联系原作者

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

Android 使用shape来优化界面效果

前些天去参加了一个公开课,说到了我们很多程序对美工比较不在行,所以需要与UI工程师合作,但是有时候UI工程师忙其他的什么,我们既不会PS也不会AI。于是乎在android中我们可以通过shape来定制我们需要的图形效果等。 下午研究了下shape,众所周知shape是形状的意思。网络上的例子太多看的真让人眼花缭乱,自己总结了下,以如何使用shape来做圆角按钮的背景来说明shape的具体使用吧。 看下效果图 具体实现代码: <?xmlversion="1.0"encoding="utf-8"?> <shapexmlns:android="http://schemas.android.com/apk/res/android"> <!--填充--> <solid android:color="#B2B2B2" /> <!--大小--> <size android:width="200dp" android:height="50dp" /> <!--渐变色--> <gradient android:startColor="#DBDCDD" android:endColor="#B8B9BB" android:centerColor="#ADADAF" android:angle="270" /> <!--描边--> <stroke android:width="2dp" android:color="#3D4148" /> <!--圆角--> <corners android:radius="5dp" /> <padding android:left="10dp" android:top="10dp" android:right="10dp" android:bottom="10dp" /> </shape> <!-- 1、solid 描述:内部填充 属性android:color填充颜色 2、size 描述:size:大小 属性: android:width表示形状的宽度 android:height表示形状的高度 3、gradient 描述:渐变色 属性: android:startColor起始颜色 android:endColor结束颜色 android:angle渐变角度(PS:当angle=0时,渐变色是从左向右。然后逆时针方向转,当angle=90时为从下往上。angle必须为45的整数倍) android:type渐变类型(取值:linear、radial、sweep) linear线性渐变,这是默认设置 radial放射性渐变,以开始色为中心。 sweep扫描线式的渐变。 android:centerColor渐变中间颜色,即开始颜色与结束颜色之间的颜色 android:useLevel如果要使用LevelListDrawable对象,就要设置为true。设置为true无渐变。false有渐变色 android:gradientRadius渐变色半径.当android:type="radial"时才使用。单独使用android:type="radial"会报错。 android:centerX渐变中心X点坐标的相对位置 android:centerY渐变中心Y点坐标的相对位置 4、stroke 描述:stroke:描边相当于html中的盒子模型的border 属性: android:width描边的宽度 android:color描边的颜色 android:dashWidth表示描边的样式是虚线的宽度, 值为0时,表示为实线。值大于0则为虚线。 android:dashGap表示描边为虚线时,虚线之间的间隔即“----” 5、corners 描述:corners:圆角 属性: android:radius半径 android:topLeftRadius左上角半径 android:topRightRadius右上角半径 注意一下两个属性比较不同: android:bottomLeftRadius右下角半径 android:bottomRightRadius左下角半径 6、padding 描述:内部边距,即内容与边的距离 属性: android:left左内边距 android:top上内边距 android:right右内边距 android:bottom下内边距 --> 本文转自xuzw13 51CTO博客,原文链接:http://blog.51cto.com/xuzhiwei/972188,如需转载请自行联系原作者

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

Androidi性能优化之高效使用内存

应用生存期的绝大多数时间都在用于处理内存中的数据 性能主要取决于以下三个因素: a:CPU如何操作特定的数据类型 b: 数据和指令需要占用多少存储空间 c: 数据在内存中的布局 访问内存: 因为访问内存会产生一些开销,CPU会把最近访问的内存内容缓存起来,无论是内存读还是内存写,事实上,CPU通常使用两级缓存: a:一级缓存(L1) b:二级缓存(L2) 有些处理器可能还有3级缓存 垃圾回收: Java的一个非常重要的优点是垃圾收集,有两件非常重要的事情值得注意: a:还是有可能存在内存泄露 b:垃圾回收器会帮你管理内存,它做的不仅仅是释放不用的内存。 内存泄露分析工具: a:DDMS视图:Heap以及Allocation Tracker 跟踪内存使用和分配情况 b:Eclipse内存分析器:MAT ,地址www.eclipse.org/mat c:Android 2.3定义的StrictMode类,对检测潜在的内存泄露有很大帮助。 引用: Java定义了4中类型的引用: a:强(Strong) b:软(Soft) c:弱(Weak) d:虚(Phantom) 软引用和弱引用在本质上是相似的,它们没有强到足以保持对象不被删除(或回收)的引用。不同之处在于回收时,垃圾回收器处理它们的引用的对象的积极程度不同。 对象是软可及的,即存在一个软引用,但没有强引用,当有足够的内存保留对象时,垃圾回收器不会回收它。不过如果垃圾会收器决定需要回收更多的内存,那么它可任意回收软可及对象的内存,这种引用类型适用于缓存,它可以自动删除缓存中的条目。 提示:当使用缓存时,确保你了解它使用的是什么类型的引用,例如Android的LruCache使用强引用。 若可及对象,也就是说,存在一个弱引用,但没有强或软引用,下次垃圾回收时基本会被收走,换而言之,垃圾回收器更加积极地回收弱可及对象的内存。这种类型的引用适用于映射,这种映射可以自动删除不再被引用的键,WeakHashMap类就是这么做的。 虚引用最弱,几乎很少用到。 本文转自demoblog博客园博客,原文链接http://www.cnblogs.com/0616--ataozhijia/p/3649427.html如需转载请自行联系原作者 demoblog

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

ios13--购物车优化

// // ViewController.m // 03-综合练习 // #import "ViewController.h" @interface ViewController () // 购物车 @property (weak, nonatomic) IBOutlet UIView *shopCarView; // 添加按钮 @property (weak, nonatomic) IBOutlet UIButton *addButton; // 删除按钮 @property (weak, nonatomic) IBOutlet UIButton *removeButton; // 全局的下标 //@property (nonatomic, assign) NSInteger index; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; } /** * 添加到购物车 * * @param button 按钮 */ - (IBAction)add:(UIButton *)button { /***********************1.定义一些常量*****************************/ // 1.总列数 NSInteger allCols = 3; // 2.商品的宽度 和 高度 CGFloat width = 80; CGFloat height = 100; // 3.求出水平间距 和 垂直间距 CGFloat hMargin = (self.shopCarView.frame.size.width - allCols * width) / (allCols -1); CGFloat vMargin = (self.shopCarView.frame.size.height - 2 * height) / 1; // 4. 设置索引 NSInteger index = self.shopCarView.subviews.count; // 5.求出x值 CGFloat x = (hMargin + width) * (index % allCols); CGFloat y = (vMargin + height) * (index / allCols); /***********************2.创建一个商品*****************************/ // 1.创建商品的view UIView *shopView = [[UIView alloc] init]; // 2.设置frame shopView.frame = CGRectMake(x, y, width, height); // 3.设置背景颜色 shopView.backgroundColor = [UIColor greenColor]; // 4.添加到购物车 [self.shopCarView addSubview:shopView]; // 5.创建商品的UIImageView对象 UIImageView *iconView = [[UIImageView alloc] init]; iconView.frame = CGRectMake(0, 0, width, width); iconView.backgroundColor = [UIColor blueColor]; [shopView addSubview:iconView]; // 6.创建商品标题对象 UILabel *titleLabel = [[UILabel alloc] init]; titleLabel.frame = CGRectMake(0, width, width, height - width); titleLabel.backgroundColor = [UIColor yellowColor]; titleLabel.textAlignment = NSTextAlignmentCenter; // 居中 [shopView addSubview:titleLabel]; /***********************3.设置数据*****************************/ // 数值数据 /* // 方式一: (不可取:数据都是一样) iconView.image = [UIImage imageNamed:@"danjianbao"]; titleLabel.text = @"单肩包"; */ // 方式二 (不可取:太冗余) /* if (index == 0) { iconView.image = [UIImage imageNamed:@"danjianbao"]; titleLabel.text = @"单肩包"; }else if (index == 1){ iconView.image = [UIImage imageNamed:@"qianbao"]; titleLabel.text = @"钱包"; }else if (index == 2){ iconView.image = [UIImage imageNamed:@"danjianbao"]; titleLabel.text = @"单肩包"; }else if (index == 3){ iconView.image = [UIImage imageNamed:@"danjianbao"]; titleLabel.text = @"单肩包"; }else if (index == 4){ iconView.image = [UIImage imageNamed:@"danjianbao"]; titleLabel.text = @"单肩包"; }else if (index == 5){ iconView.image = [UIImage imageNamed:@"danjianbao"]; titleLabel.text = @"单肩包"; } */ // 方式三 (数组: (两个数组之间没有任何联系,容易出错)) /* NSArray<NSString *> *imageNames = @[@"danjianbao", @"qianbao", @"liantiaobao", @"shoutibao", @"shuangjianbao", @"xiekuabao"]; NSArray<NSString *> *titleNames = @[@"单肩包", @"钱包", @"链条包", @"手提包", @"双肩包", @"斜挎包"]; // 设置数据 iconView.image = [UIImage imageNamed:imageNames[index]]; titleLabel.text = titleNames[index]; */ // 方式四 (数组 + 字典) NSArray<NSDictionary *> *dataArr = @[ @{@"name":@"单肩包", @"icon":@"danjianbao"}, @{@"name":@"钱包", @"icon":@"qianbao"}, @{@"name":@"链条包", @"icon":@"liantiaobao"}, @{@"name":@"手提包", @"icon":@"shoutibao"}, @{@"name":@"双肩包", @"icon":@"shuangjianbao"}, @{@"name":@"斜挎包", @"icon":@"xiekuabao"} ]; // 设置数据 NSDictionary *dict = dataArr[index]; iconView.image = [UIImage imageNamed:dict[@"icon"]]; titleLabel.text = dict[@"name"]; /***********************4.设置按钮的状态*****************************/ button.enabled = (index != 5); // 5.设置删除按钮的状态 self.removeButton.enabled = YES; } /** * 从购物车中删除 * * @param button 按钮 */ - (IBAction)remove:(UIButton *)button { // 1. 删除最后一个商品 UIView *lastShopView = [self.shopCarView.subviews lastObject]; [lastShopView removeFromSuperview]; // 3. 设置添加按钮的状态 self.addButton.enabled = YES; // 4. 设置删除按钮的状态 /* if (self.shopCarView.subviews.count == 0) { self.removeButton.enabled = NO; } */ self.removeButton.enabled = (self.shopCarView.subviews.count != 0); } @end 本文转自农夫山泉别墅博客园博客,原文链接:http://www.cnblogs.com/yaowen/p/7449672.html,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Spring

Spring

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

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

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

用户登录
用户注册