e攻城狮

  • 首页

  • 随笔

  • 分类

  • 瞎折腾

  • 搜索

Schtasks命令详解(计划任务DOS批处理)

发表于 2017-07-14 分类于 服务器运维

安排命令和程序定期运行或在指定时间内运行。从计划表中添加和删除任务,按需要启动和停止任务,显示和更改计划任务。

语法

1
schtasks /create /tn TaskName /tr TaskRun /sc schedule [/momodifier] [/dday] [/mmonth[,month...] [/iIdleTime] [/stStartTime] [/sdStartDate] [/edEndDate] [/scomputer[/u[domain\]user/ppassword]][/ru{[Domain\]User|"System"} [/rpPassword]] /?

参数

/tn TaskName 指定任务的名称。

/tr TaskRun 指定任务运行的程序或命令。键入可执行文件、脚本文件或批处理文件的完全合格的路径和文件名。如果忽略该路径,SchTasks.exe 将假定文件在Systemroot\System32 目录下。

/sc schedule 指定计划类型。有效值为 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY、ONCE、ONSTART、ONLOGON、ONIDLE。

1
2
3
4
5
6
7
8
9
10
11
有效值说明

MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY 指定计划的时间单位。

ONCE 任务在指定的日期和时间运行一次。

ONSTART 任务在每次系统启动的时候运行。可以指定启动的日期,或下一次系统启动的时候运行任务。

ONLOGON 每当用户(任意用户)登录的时候,任务就运行。可以指定日期,或在下次用户登录的时候运行任务。

ONIDLE 只要系统空闲了指定的时间,任务就运行。可以指定日期,或在下次系统空闲的时候运行任务。

/mo modifier 指定任务在其计划类型内的运行频率。这个参数对于 MONTHLY 计划是必需的。对于 MINUTE、HOURLY、DAILY 或 WEEKLY 计划,这个参数有效,但也可选。默认值为 1。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
参数说明

MINUTE 1~1439 任务每n分钟运行一次。

HOURLY 1~23 任务每n小时运行一次。

`DAILY 1~365 任务每n天运行一次。

WEEKLY 1~52 任务每n周运行一次。

MONTHLY 1~12 任务每n月运行一次。

LASTDAY 任务在月份的最后一天运行。

FIRST、SECOND、THIRD、FOURTH、LAST 与 `/d day` 参数共同使用,并在特定的周和天运行任务。例如,在月份的第三个周三。

/d dirlist 指定周或月的一天。只与 WEEKLY 或 MONTHLY 计划共同使用时有效。

1
2
3
4
5
计划类型 

WEEKLY 可选项。有效值是 MON ~ SUN 和 * (每一天)。MON 是默认值。

MONTHLY 在使用 FIRST、SECOND、THIRD、FOURTH 或 LAST 修饰符 (/mo) 时,需要 MON ~ SUN 中的某个值。1 ~ 31 是可选的,只在没有修饰符或修饰符为1 ~ 12类型时有效。默认值是 1 (月份的第一天)。

/m month[,month…] 指定一年中的一个月。有效值是 JAN ~ DEC 和 * (每个月)。/m参数只对于 MONTHLY 计划有效。在使用 LASTDAY 修饰符时,这个参数是必需的。否则,它是可选的,默认值是 * (每个月)。

/i InitialPageFileSize 指定任务启动之前计算机空闲多少分钟。键入一个1 ~ 999之间的整数。这个参数只对于 ONIDLE 计划有效,而且是必需的。

/st StartTime 以HH:MM:SS24 小时格式指定时间。默认值是命令完成时的当前本地时间。/st参数只对于 MINUTE、HOURLY、DAILY、WEEKLY、MONTHLY 和 ONCE 计划有效。它只对于 ONCE 计划是必需的。

/sd StartDate 以MM/DD/YYYY格式指定任务启动的日期。默认值是当前日期。/sd参数对于所有的计划有效,但只对于 ONCE 计划是必需的。

/ed EndDate 指定任务计划运行的最后日期。此参数是可选的。它对于 ONCE、ONSTART、ONLOGON 或 ONIDLE 计划无效。默认情况下,计划没有结束日期。

/s Computer 指定远程计算机的名称或 IP 地址(带有或者没有反斜杠)。默认值是本地计算机。

/u [domain]user 使用特定用户帐户的权限运行命令。默认情况下,使用已登录到运行 SchTasks 的计算机上的用户的权限运行命令。

/p password 指定在/u参数中指定的用户帐户的密码。如果使用/u参数,则需要该参数。

/ru {[Domain]User|”System”} 使用指定用户帐户的权限运行任务。默认情况下,使用用户登录到运行 SchTasks 的计算机上的权限运行任务。

1
2
3
值说明

[domain\}User? 指定用户帐户。 "System"或"" 指定操作系统使用的 NT Authority\System 帐户。

/p Password 指定用户帐户的密码,该用户帐户在/u参数中指定。如果在指定用户帐户的时候忽略了这个参数,SchTasks.exe 会提示您输入密码而且不显示键入的文本。使用 NT Authority\System 帐户权限运行的任务不需要密码,SchTasks.exe 也不会提示索要密码。

/? 在命令提示符显示帮助。

范例

计划任务每 20 分钟运行一次

下面的命令计划安全脚本 Sec.vbs 每 20 分钟运行一次。由于命令没有包含起始日期或时间,任务在命令完成 20 分钟后启动,此后每当系统运行它就每 20 分钟运行一次。请注意,安全脚本源文件位于远程计算机上,但任务在本地计算机上计划并执行。

1
schtasks /create /sc minute /mo 20 /tn "Security scrīpt" /tr \\central\data\scrīpts\sec.vbs
计划命令在每小时过五分的时候运行

下面的命令将计划 MyApp 程序从午夜过后五分钟起每小时运行一次。因为忽略了/mo参数,命令使用了小时计划的默认值,即每 (1) 小时。如果该命令在 12:05 A.M 之后生成,程序将在第二天才会运行。

schtasks /create /sc hourly /st 00:05:00 /tn “My App” /tr c:\apps\myapp.exe

计划命令每五小时运行一次

下面的命令计划 MyApp 程序从 2001 年 3 月的第一天起每五小时运行一次。它使用/mo参数来指定间隔时间,使用/sd参数来指定起始日期。由于命令没有指定起始时间,当前时间被用作起始时间。

1
2
3
schtasks /create /sc hourly /mo 5 /sd 03/01/2001 /tn "My App" /tr c:\apps\myapp.exe

schtasks create daily
计划任务每天运行一次

下面的范例计划 MyApp 程序在每天的 8:00 A.M. 运行一次,直到 2001 年 12 月 31 日结束。由于它忽略了/mo参数,所以使用默认间隔 1 来每天运行命令。

1
schtasks /create /tn "My App" /tr c:\apps\myapp.exe /sc daily /st 08:00:00 /ed 12/31/2001
计划任务每六周运行一次

下面的命令计划 MyApp 程序在远程计算机上每六周运行一次。该命令使用/mo参数来指定间隔。它也使用/s参数来指定远程计算机,使用/ru参数来计划任务以用户的 Administrator 帐户权限运行。因为忽略了/rp参数,SchTasks.exe 会提示用户输入 Administrator 帐户密码。

另外,因为命令是远程运行的,所以命令中所有的路径,包括到 MyApp.exe 的路径,都是指向远程计算机上的路径。

1
schtasks /create /tn "My App" /tr c:\apps\myapp.exe /sc weekly /mo 6 /s Server16 /ru Admin01

如何关闭dos窗口提示

1
2
3
4
5
// 使用vbs 在后台静默执行

Set ws = CreateObject("Wscript.Shell")

ws.run "cmd /c d:\wamp\www\code\queue\task",vbhide

NoSQL 简介

发表于 2017-07-14 分类于 数据库

前言

NoSQL(NoSQL = Not Only SQL ),意即”不仅仅是SQL”。

在现代的计算系统上每天网络上都会产生庞大的数据量。

这些数据有很大一部分是由关系数据库管理系统(RDMBSs)来处理。 1970年 E.F.Codd’s提出的关系模型的论文 “A relational model of data for large shared data banks”,这使得数据建模和应用程序编程更加简单。

通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。

NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

关系型数据库

事务在英文中是transaction,和现实世界中的交易很类似,关系型数据库遵循ACID规则。它有如下四个特性:

  • A (Atomicity) 原子性

原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。

比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。

  • C (Consistency) 一致性

一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。

例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。

  • I (Isolation) 独立性

所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。

比如现有有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。

  • D (Durability) 持久性

持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

分布式系统

分布式系统(distributed system)由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。

分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。

因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。

分布式系统可以应用在在不同的平台上如:Pc、工作站、局域网和广域网上等。

分布式计算的优点

  • 可靠性(容错) : 分布式计算系统中的一个重要的优点是可靠性。一台服务器的系统崩溃并不影响到其余的服务器。

  • 可扩展性:在分布式计算系统可以根据需要增加更多的机器。

  • 资源共享:共享数据是必不可少的应用,如银行,预订系统。

  • 灵活性:由于该系统是非常灵活的,它很容易安装,实施和调试新的服务。

  • 更快的速度:分布式计算系统可以有多台计算机的计算能力,使得它比其他系统有更快的处理速度。

  • 开放系统:由于它是开放的系统,本地或者远程都可以访问到该服务。

  • 更高的性能:相较于集中式计算机网络集群可以提供更高的性能(及更好的性价比)。

分布式计算的缺点

  • 故障排除:故障排除和诊断问题。

  • 软件:更少的软件支持是分布式计算系统的主要缺点。

  • 网络:网络基础设施的问题,包括:传输问题,高负载,信息丢失等。

  • 安全性:开发系统的特性让分布式计算系统存在着数据的安全性和共享的风险等问题。

NoSql

什么是NoSQL

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

为什么使用NoSQL

今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。

实例

社会化关系网:

1
2
3
4
5
Each record: UserID1, UserID2

Separate records: UserID, first_name,last_name, age, gender,...

Task: Find all friends of friends of friends of ... friends of a given user.

Wikipedia 页面 :

1
2
3
4
5
Large collection of documents

Combination of structured and unstructured data

Task: Retrieve all pages regarding athletics of Summer Olympic before 1950.

RDBMS vs NoSQL

RDBMS

  • 高度组织化结构化数据

  • 结构化查询语言(SQL) (SQL)

  • 数据和关系都存储在单独的表中。

  • 数据操纵语言,数据定义语言

  • 严格的一致性

  • 基础事务

NoSQL

  • 代表着不仅仅是SQL

  • 没有声明性查询语言

  • 没有预定义的模式

-键 - 值对存储,列存储,文档存储,图形数据库

  • 最终一致性,而非ACID属性

  • 非结构化和不可预知的数据

  • CAP定理

  • 高性能,高可用性和可伸缩性

NoSQL 简史

NoSQL一词最早出现于1998年,是Carlo Strozzi开发的一个轻量、开源、不提供SQL功能的关系数据库。

2009年,Last.fm的Johan Oskarsson发起了一次关于分布式开源数据库的讨论[2],来自Rackspace的Eric Evans再次提出了NoSQL的概念,这时的NoSQL主要指非关系型、分布式、不提供ACID的数据库设计模式。

2009年在亚特兰大举行的”no:sql(east)”讨论会是一个里程碑,其口号是”select fun, profit from real_world where relational=false;”。因此,对NoSQL最普遍的解释是”非关联型的”,强调Key-Value Stores和文档数据库的优点,而不是单纯的反对RDBMS。

CAP定理(CAP theorem)

在计算机科学中, CAP定理(CAP theorem), 又被称作 布鲁尔定理(Brewer’s theorem), 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:

一致性(Consistency) (所有节点在同一时间具有相同的数据)可用性(Availability) (保证每个请求不管成功或者失败都有响应)分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

因此,根据 CAP 原理将 NoSQL 数据库分成了满足 CA 原则、满足 CP 原则和满足 AP 原则三 大类:

  • CA - 单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。

  • CP - 满足一致性,分区容忍性的系统,通常性能不是特别高。

  • AP - 满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

NoSQL的优点/缺点

优点:

  • 高可扩展性- 分布式计算- 低成本- 架构的灵活性,半结构化数据- 没有复杂的关系

缺点:

  • 没有标准化- 有限的查询功能(到目前为止)- 最终一致是不直观的程序

BASE

BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定义。

CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:

Basically Availble –基本可用Soft-state –软状态/柔性事务。 “Soft state” 可以理解为”无连接”的, 而 “Hard state” 是”面向连接”的Eventual Consistency –最终一致性 最终一致性, 也是是 ACID 的最终目的。

ACID vs BASEACIDBASE原子性(Atomicity)基本可用(Basically Available)一致性(Consistency)软状态/柔性事务(Soft state)隔离性(Isolation)最终一致性 (Eventual consistency)持久性 (Durable)

NoSQL 数据库分类类型部分代表

特点列存储

Hbase

Cassandra

Hypertable

顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。

文档存储

MongoDB

CouchDB

文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。

key-value存储

Tokyo Cabinet / Tyrant

Berkeley DB

MemcacheDB

Redis

可以通过key快速查询到其value。一般来说,存储不管value的格式,照单全收。(Redis包含了其他功能)

图存储

Neo4J

FlockDB

图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。

对象存储

db4o

Versant

通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。

xml数据库

Berkeley DB XML

BaseX

高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

行式数据库与列式数据库

发表于 2017-07-13 分类于 数据库

一 基本概念

在关系数据库领域,除传统的ORACLE、SQLSERVER、MYSQL等行式数据库外,目前在数据仓库领域列式数据库越来越受到关注。目前商用的列式数据库主要是Sybase IQ。

一般,行式数据库主要适合于在线交易性的OLTP应用,而列式数据库主要适合于海量静态数据的分析,一般应用于OLAP。但只是依靠OLTP还是OLAP来区分是采用行式数据库还是列式数据库,在很多时候还不是很明确,特别很多时候有些应用很难说是OLTP还是OLAP,例如对海量数据的查询。

根据笔者最近的对ORACLE和SYBASE IQ的初步研究与测试,笔者认为关键点是行式数据库适合“少数行多数列”的应用,而列式数据库适合于“少数列多数行的应用”。行的多少可理解为sql 查询语句中符合where 之后的过滤条件的行数占总行数的比例,列的多少可理解为select 之后涉及到的行数。

对于普通的 “select f1 ,f2, f3,f4 where xxxx “查询,sybase IQ的查询速度会很快,但是关键问题是如果select 的列很多,则在取数据时会非常慢,而对oracle数据库不管是取一列还是取所有列其时间开销基本不变。

二 对比

1 行式更适合OLTP, 查询一个记录的所有列。

列式更适合OLAP,非常适合于在数据仓库领域发挥作用,比如数据分析、海量存储和商业智能;涉及不经常更新的数据。由于设计上的不同,列式数据库在并行查询处理和压缩上更有优势。而且数据是以列为单元存储,完全不用考虑数据建模或者说建模更简单了。要查询计算哪些列上的数据,直接读取列就行。

2 列式在存储方面占有很大的优势,能有效提高数据压缩比,节省存储空间。

OLAP、OLTP的介绍和比较

发表于 2017-07-13 分类于 服务器运维

OLTP与OLAP的介绍

数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。

OLTP 系统强调数据库内存效率,强调内存各种指标的命令率,强调绑定变量,强调并发操作;

OLAP 系统则强调数据分析,强调SQL执行市场,强调磁盘I/O,强调分区等。

OLTP与OLAP之间的比较:

OLTP与OLAP之间的比较

OLTP与OLAP之间的比较

OLTP,也叫联机事务处理(Online Transaction Processing),表示事务性非常高的系统,一般都是高可用的在线系统,以小的事务以及小的查询为主,评估其系统的时候,一般看其每秒执行的Transaction以及Execute SQL的数量。在这样的系统中,单个数据库每秒处理的Transaction往往超过几百个,或者是几千个,Select 语句的执行量每秒几千甚至几万个。典型的OLTP系统有电子商务系统、银行、证券等,如美国eBay的业务数据库,就是很典型的OLTP数据库。

OLTP系统最容易出现瓶颈的地方就是CPU与磁盘子系统。

(1)CPU出现瓶颈常表现在逻辑读总量与计算性函数或者是过程上,逻辑读总量等于单个语句的逻辑读乘以执行次数,如果单个语句执行速度虽然很快,但是执行次数非常多,那么,也可能会导致很大的逻辑读总量。设计的方法与优化的方法就是减少单个语句的逻辑读,或者是减少它们的执行次数。另外,一些计算型的函数,如自定义函数、decode等的频繁使用,也会消耗大量的CPU时间,造成系统的负载升高,正确的设计方法或者是优化方法,需要尽量避免计算过程,如保存计算结果到统计表就是一个好的方法。

(2)磁盘子系统在OLTP环境中,它的承载能力一般取决于它的IOPS处理能力. 因为在OLTP环境中,磁盘物理读一般都是db file sequential read,也就是单块读,但是这个读的次数非常频繁。如果频繁到磁盘子系统都不能承载其IOPS的时候,就会出现大的性能问题。

OLTP比较常用的设计与优化方式为Cache技术与B-tree索引技术,Cache决定了很多语句不需要从磁盘子系统获得数据,所以,Web cache与Oracle data buffer对OLTP系统是很重要的。另外,在索引使用方面,语句越简单越好,这样执行计划也稳定,而且一定要使用绑定变量,减少语句解析,尽量减少表关联,尽量减少分布式事务,基本不使用分区技术、MV技术、并行技术及位图索引。因为并发量很高,批量更新时要分批快速提交,以避免阻塞的发生。

OLTP 系统是一个数据块变化非常频繁,SQL 语句提交非常频繁的系统。 对于数据块来说,应尽可能让数据块保存在内存当中,对于SQL来说,尽可能使用变量绑定技术来达到SQL重用,减少物理I/O 和重复的SQL 解析,从而极大的改善数据库的性能。

这里影响性能除了绑定变量,还有可能是热快(hot block)。 当一个块被多个用户同时读取时,Oracle 为了维护数据的一致性,需要使用Latch来串行化用户的操作。当一个用户获得了latch后,其他用户就只能等待,获取这个数据块的用户越多,等待就越明显。 这就是热快的问题。 这种热快可能是数据块,也可能是回滚端块。 对于数据块来讲,通常是数据库的数据分布不均匀导致,如果是索引的数据块,可以考虑创建反向索引来达到重新分布数据的目的,对于回滚段数据块,可以适当多增加几个回滚段来避免这种争用。

OLAP,也叫联机分析处理(Online Analytical Processing)系统,有的时候也叫DSS决策支持系统,就是我们说的数据仓库。在这样的系统中,语句的执行量不是考核标准,因为一条语句的执行时间可能会非常长,读取的数据也非常多。所以,在这样的系统中,考核的标准往往是磁盘子系统的吞吐量(带宽),如能达到多少MB/s的流量。

磁盘子系统的吞吐量则往往取决于磁盘的个数,这个时候,Cache基本是没有效果的,数据库的读写类型基本上是db file scattered read与direct path read/write。应尽量采用个数比较多的磁盘以及比较大的带宽,如4Gb的光纤接口。

在OLAP系统中,常使用分区技术、并行技术。

分区技术在OLAP系统中的重要性主要体现在数据库管理上,比如数据库加载,可以通过分区交换的方式实现,备份可以通过备份分区表空间实现,删除数据可以通过分区进行删除,至于分区在性能上的影响,它可以使得一些大表的扫描变得很快(只扫描单个分区)。另外,如果分区结合并行的话,也可以使得整个表的扫描会变得很快。总之,分区主要的功能是管理上的方便性,它并不能绝对保证查询性能的提高,有时候分区会带来性能上的提高,有时候会降低。

并行技术除了与分区技术结合外,在Oracle 10g中,与RAC结合实现多节点的同时扫描,效果也非常不错,可把一个任务,如select的全表扫描,平均地分派到多个RAC的节点上去。

在OLAP系统中,不需要使用绑定(BIND)变量,因为整个系统的执行量很小,分析时间对于执行时间来说,可以忽略,而且可避免出现错误的执行计划。但是OLAP中可以大量使用位图索引,物化视图,对于大的事务,尽量寻求速度上的优化,没有必要像OLTP要求快速提交,甚至要刻意减慢执行的速度。

绑定变量真正的用途是在OLTP系统中,这个系统通常有这样的特点,用户并发数很大,用户的请求十分密集,并且这些请求的SQL 大多数是可以重复使用的。

对于OLAP系统来说,绝大多数时候数据库上运行着的是报表作业,执行基本上是聚合类的SQL 操作,比如group by,这时候,把优化器模式设置为all_rows是恰当的。 而对于一些分页操作比较多的网站类数据库,设置为first_rows会更好一些。 但有时候对于OLAP 系统,我们又有分页的情况下,我们可以考虑在每条SQL 中用hint。 如:

Select a.* from table a;

分开设计与优化

在设计上要特别注意,如在高可用的OLTP环境中,不要盲目地把OLAP的技术拿过来用。

如分区技术,假设不是大范围地使用分区关键字,而采用其它的字段作为where条件,那么,如果是本地索引,将不得不扫描多个索引,而性能变得更为低下。如果是全局索引,又失去分区的意义。

并行技术也是如此,一般在完成大型任务时才使用,如在实际生活中,翻译一本书,可以先安排多个人,每个人翻译不同的章节,这样可以提高翻译速度。如果只是翻译一页书,也去分配不同的人翻译不同的行,再组合起来,就没必要了,因为在分配工作的时间里,一个人或许早就翻译完了。

位图索引也是一样,如果用在OLTP环境中,很容易造成阻塞与死锁。但是,在OLAP环境中,可能会因为其特有的特性,提高OLAP的查询速度。MV也是基本一样,包括触发器等,在DML频繁的OLTP系统上,很容易成为瓶颈,甚至是Library Cache等待,而在OLAP环境上,则可能会因为使用恰当而提高查询速度。

对于OLAP系统,在内存上可优化的余地很小,增加CPU 处理速度和磁盘I/O 速度是最直接的提高数据库性能的方法,当然这也意味着系统成本的增加。

比如我们要对几亿条或者几十亿条数据进行聚合处理,这种海量的数据,全部放在内存中操作是很难的,同时也没有必要,因为这些数据快很少重用,缓存起来也没有实际意义,而且还会造成物理I/O相当大。 所以这种系统的瓶颈往往是磁盘I/O上面的。

对于OLAP系统,SQL 的优化非常重要,因为它的数据量很大,做全表扫描和索引对性能上来说差异是非常大的。

其他

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Oracle 10g以前的版本建库过程中可供选择的模板有:

Data Warehouse (数据仓库)

General Purpose (通用目的、一般用途)

New Database

Transaction Processing (事务处理)

Oracle 11g的版本建库过程中可供选择的模板有:

一般用途或事务处理

定制数据库

数据仓库

个人对这些模板的理解为:

联机分析处理(OLAP,On-line Analytical Processing),数据量大,DML少。使用数据仓库模板

联机事务处理(OLTP,On-line Transaction Processing),数据量少,DML频繁,并行事务处理多,但是一般都很短。使用一般用途或事务处理模板。

决策支持系统(DDS,Decision support system),典型的操作是全表扫描,长查询,长事务,但是一般事务的个数很少,往往是一个事务独占系统。

修改PHP上传文件大小限制

发表于 2017-07-13 分类于 PHP

修改PHP上传文件大小限制的方法

  1. 一般的文件上传,除非文件很小.就像一个5M的文件,很可能要超过一分钟才能上传完.但在php中,默认的该页
    最久执行时间为 30 秒.就是说超过30秒,该脚本就停止执行. 这就导致出现 无法打开网页的情况.这时我们可以修改 max_execution_time*。在php.ini里查找 *max_execution_time 默认是30秒. 改为 max_execution_time = 0,0表示没有限制。

  2. 修改 post_max_size 设定 POST 数据所允许的最大大小。此设定也影响到文件上传。php默认的 post_max_size 为2M.如果 POST 数据尺寸大于 post_max_size $_POST 和 $_FILES superglobals 便会为空 post_max_size 改为 post_max_size = 150M

  3. 但上传文件时最大仍然为 8M. 我们还要改一个参数 upload_max_filesize 表示所上传的文件的最大大小。查找upload_max_filesize,默认为 8M 改为 upload_max_filesize = 100M 另外要说明的是,post_max_size 大于 upload_max_filesize 为佳.

把上述参数修改后,在网络所允许的正常情况下,就可以上传大体积文件了

1
2
3
4
5
6
7
8
9
10
11
12
13
max_execution_time = 600

max_input_time = 600

memory_limit = 32m

file_uploads = on

upload_tmp_dir = /tmp

upload_max_filesize = 32m

post_max_size = 32m

如何修改PHP的memory_limit限制

发表于 2017-07-13 分类于 PHP

在运行PHP程序,通常会遇到“Fatal Error: Allowed memory size of xxxxxx bytes exhausted”的错误, 这个意味着PHP脚本使用了过多的内存,并超出了系统对其设置的允许最大内存。解决这个问题,首先需要查看你的程序是否分配了过多的内存,在程序没有问题的情况下,你可以通过一下方法来增加PHP的内存限制(memory_limit)。

检查php的内存限制值

为了查看这个值,你需要建立一个空的php文件,比如view-php-info.php。然后将一下代码贴到里面。

1
2
3
<?php 
phpinfo();
?>

将这个脚本放到你的PHP主机上,然后在浏览器中调用它。这时你可以看到你的PHP环境配置的信息,其中有一部分是关于”memory_limit”的, 如下图:

注:你可以用这种方法来查看php的其他参数设置,不仅仅是memory_limit

memory_limit应该设为多少?

这个完全依赖于你的应用的要求。比如Wordpress,运行起核心代码需要32MB。Drupal 6则要求这个值最小为16MB,并推荐设置为32MB。如果你又安装不少的插件(plugins),尤其是那些要进行图像处理的模块,那么你可能需要128MB或更高的内存。

如何设置memory_limit

方法1: php.ini

最简单或常用的方法是修改php.ini

  • 首先找到对你的网站生效的php.ini文件

由于有多个地方都可以设置php的参数,找到正确的配置文件,并进行更改是首先要做的一步。如果你上面的方法建立了php文件来查看其配置参数,则你可以找到 Loaded Configuration File 这一项,以下是个例子:

对于Linux用户,你可以通过执行php -i | grep Loaded Configuration File来找到对应的配置文件。而Windows用户,你可以尝试修改你的php安装目录下的php.ini。

  • 编辑php.ini

在php.ini中,找到memory_limit这一项,如果没有,你可以在文件的尾部自己增加这个参数。以下是一些设置范例

1
memory_limit = 128M ; 可以将128M改为任何你想设置的值
  • 保存文件

  • 重启web 服务器

如果是web服务器使用Apache, 则执行:

1
httpd restart

有些情况下,你可能不被允许私修改php.ini。比如如果你购买了虚拟主机服务,但是你的服务商确禁止你修改这个文件。那么,你可以需要考虑用其他方法来增加memory_limit的值。

方法2: .htaccess

说明: 这种方法只有在php以Apache模块来执行时才生效.

在你的网站的根目录下找到”.htaccess”文件,如果没有,可以自己创建一个。然后把以下配置放入其中

1
php_value memory_limit 128M ; // 可以将128M改为任何你想设置的值

方法3: 运行时修改php的内存设置

在你的php代码中增加以下命令行即可。

1
ini_set('memory_limit', '128M');

如果你使用虚拟主机,有可能会出现memory_limit的值修改失败。这个需要联系你的服务商看怎么处理,通常他们限制了可以设置的最大值或者根本就不允许你修改。如果他们的环境真的无法满足你的要求,那么你可能要考虑换一个主机服务商。

Winform MDI窗体切换不闪烁的解决办法(测试通过)

发表于 2017-07-13 分类于 .NET

MDI窗体不闪烁方法测试通过:

1
2
3
4
5
//.net 4.0用OptimizedDoubleBuffer

this.SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);

this.UpdateStyles();

真正有效的方法:在最上层窗体加上

1
2
3
4
5
6
7
protected override CreateParams CreateParams {
get {
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x02000000; /* Turn on WS_EX_COMPOSITED */
return(cp);
}
}

在下层的窗体和自定义控件加上

1
2
3
4
5
6
7
8
9
protected override CreateParams CreateParams
{
get
{
CreateParams cp = base.CreateParams;
cp.Style &= ~0x02000000; /* Turn off WS_CLIPCHILDREN */
return(cp);
}
}

注意:如果加错地方或人品不好,某些时候可能会造成控件绘制略微不正常。

如果人品爆发的话,貌似在下层窗体直接加 cp.Style &= ~0x02000000 就行,不需要在上层窗体加 cp.ExStyle |= 0x02000000;

注意下层窗体代码在ListBox或者ListView的Anchor设有Right,且窗体BackColor与控件背景不同的时候,可能会发现控件初始化显示不正常。需要做一下MdiParent.Refresh或者取消Right;

引用MSDN中对CreateParams的说明:

在你开发的重载控件中不要重写这个属性,通过这个属性控制控件的某些风格。只有在你封装Windows控件或者想实现某些WinForm没有提供的风格(比如Layered Window)控制的时候再使用这个属性。更多信息请参照MSDN上对CreateWindow方法和CreateWindowEx方法的参数CREATESTRUCT结构体的文档注释。

简述为何CreateParams能够实现这样高级的样式控制,因为从CreateWindow和CreateWindowEx的名字就可以看出,CreateParam是传递给这俩个方法的参数,而这两个方法又是在窗体创建的时候调用的。所以,CreateParam才能够实现如此强大的样式控制。

节点更新要使用 BeginUpdate 和 EndUpdate

这一对操作对于需要批量操作更新控件的情景有比较好的效果,比如初始化时批量添加了大量节点。坏处就在于不能即时更新。所以,对于频繁的更新节点并希望立即反映到界面的情况不适用。如果使用并且没有禁掉清除界面消息的话,则控件看起来就会不停的闪烁,而且以白底为主,内容几乎不可见(这个视频繁程度而定)。因为界面更新都在EndUpdate处完成,操作太多导致EndUpdate阻塞时间过长,且清空在先,更新在后,导致界面看起来长时间处于空白状态。

某些情况下可以使用禁止背景更新

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
protected override void WndProc( ref Message m )
{
if ( m.Msg == 0x0014 )
return; /* 禁掉清除背景消息 */
base.WndProc( ref m );
}


public ListViewNF()
{
/* 开启双缓冲 */
this.SetStyle( ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint, true );

/* Enable the OnNotifyMessage event so we get a chance to filter out */
/* Windows messages before they get to the form's WndProc */
this.SetStyle( ControlStyles.EnableNotifyMessage, true );
}

protected override void OnNotifyMessage( Message m )
{
/* Filter out the WM_ERASEBKGND message */
if ( m.Msg != 0x14 )
{
base.OnNotifyMessage( m );
}
}


// 采 用LockWindowUpdate API

[DllImport( "user32.dll" )]

static extern bool LockWindowUpdate( IntPtr hWndLock );

LockWindowUpdate( panelContainer.Handle );

/* Clear Panel */
panelContainer.Controls.Clear();

/* my temporary TextBox */
TextBox myT;

for ( int lauf = 0; lauf < 200; lauf++ )
{
/* Create New TextBox */
myT = new TextBox();
/* Add TextBox to the Panel */
panelContainer.Controls.Add( myT );
}

/* redraw the window */
LockWindowUpdate( IntPtr.Zero );

frmChild1.Hide(); /* 隐藏当前显示的子窗体2 3 */
LockWindowUpdate( this.Handle ); /* 锁定父窗体4 */
frmChild2.Show(); /* 显示窗体等其他需要再显示前做的事5 */
LockWindowUpdate( IntPtr.Zero ); /* 解锁父窗体6 */
RedrawWindow( this.Handle, IntPtr.Zero, IntPtr.Zero, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN );
/* (0x04 | 0x01 | 0x80)立即强制重绘父窗体及其所有子窗体效果好转,但人眼还能看到一些花屏现象,仍不能一次全部完整显示。 */

使用Windows API中的SendMessage函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/* 拦截控件重绘 */
class DrawingControl
{
[DllImport( "user32.dll" )]

public static extern int SendMessage( IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParam );

private const int WM_SETREDRAW = 11;

public static void SuspendDrawing( Control parent )
{
SendMessage( parent.Handle, WM_SETREDRAW, false, 0 );
}

public static void ResumeDrawing( Control parent )
{
SendMessage( parent.Handle, WM_SETREDRAW, true, 0 );
parent.Refresh();
}
}

/* 禁止窗体中的绘制操作 */
frmChild1.Hide();
SendMessage( this.Handle, WM_SETDRAW, false, null );

/* 显示窗体等其他需要再显示前做的事 */
frmChild2.Show();
SendMessage( this.Handle, WM_SETDRAW, true, null );

/* 解除禁止绘制操作 */
RedrawWindow( this.Handle, IntPtr.Zero, IntPtr.Zero, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN ); /* (0x04 | 0x01 | 0x80)立即强制重绘父窗体及其所有子窗 */

SendMessage函数中,发送消息 WM_SETREDRAW,设置SETREDRAW为FALSE,导致窗口不进行绘制。

此时,看到的窗体是假的,现象:鼠标形状是后面应用程序的形状;鼠标划过,后面的应用程序就显示出来了。人眼看到的就是“花屏”。

微信版本判断

发表于 2017-07-11 分类于 前端开发

微信团队建议通过user agent来确定用户当前的版本号。以iPhone版本为例,可以通过user agent可获取如下版本示例信息:

“Mozilla/5.0(iphone;CPU iphone OS 5_1_1 like Mac OS X)

AppleWebKit/534.46(KHTML,like Geocko)Mobile/9B206 MicroMessenger/6.0.2 “

其中6.0.2为用户安装的微信版本号

CSS选择器优先级

发表于 2017-01-15 分类于 前端开发

原理

CSS选择器的优先级关系是:

内联 > ID选择器 > 类选择器 > 标签选择器

《CSS REFACTORING》 中提到了算法的过程 :

A specificity is determined by plugging numbers into (a, b, c, d):

If the styles are applied via the style attribute, a=1; otherwise, a=0.
b is equal to the number of ID selectors present.
c is equal to the number of class selectors, attribute selectors, and pseudoclasses present.
d is equal to the number of type selectors and pseudoelements present.

即优先级是由 A 、B、C、D 的值来决定的,其中它们的值计算规则如下:

  • 如果存在内联样式,那么 A = 1, 否则 A = 0;

  • B 的值等于 ID选择器 出现的次数;

  • C 的值等于 类选择器 和 属性选择器 和 伪类 出现的总次数;

  • D 的值等于 标签选择器 和 伪元素 出现的总次数 。

例如:

1
2
3
4
5
6
7
8
9
10
11
12
li                                  /* (0, 0, 0, 1) */
ul li /* (0, 0, 0, 2) */
ul ol+li /* (0, 0, 0, 3) */
ul ol+li /* (0, 0, 0, 3) */
h1 + *[REL=up] /* (0, 0, 1, 1) */
ul ol li.red /* (0, 0, 1, 3) */
li.red.level /* (0, 0, 2, 1) */
a1.a2.a3.a4.a5.a6.a7.a8.a9.a10.a11 /* (0, 0, 11,0) */
#x34y /* (0, 1, 0, 0) */
li:first-child h2 .title /* (0, 0, 2, 2) */
#nav .selected > a:hover /* (0, 1, 2, 1) */
html body #nav .selected > a:hover /* (0, 1, 2, 3) */

优先级比较规则:

从左往右依次进行比较 ,较大者胜出,如果相等,则继续往右移动一位进行比较 。如果4位全部相等,则后面的会覆盖前面的

例子

有如下html代码:

1
2
3
<div id="b">
<a href="" class="a" id="a">ALink</a>
</div>

如果设置css样式:

1
2
#b a {color:red;}
#a {color: green;}

问题:#b a生效,还是#a生效?

答案:ALink

解析:

1
2
#b a  /* (0, 1, 0, 1) */
#a /* (0, 1, 0, 0) */

比较得出 #b a优先级更高

特例

如果我们给#a的css后加上!important

那么#a的优先级变为最高,甚至比在html标签上加style的优先级还要高。

比如如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>CSS Test</title>
<style>
#a{ color: green !important; }
</style>
</head>
<body>
<div id="b">
<a href="" id="a" style="color:blue">ALink</a>
</div>
</body>
</html>

显示的结果 ALink
如果在标签内联样式加入!important那么显示 ALink

如何开发公司年会抽奖系统

发表于 2017-01-12

需求出现

年会将近,而年会抽奖环节必不可少,但是抽奖系统却还没有。所以某一天,PM走过来说:小伙,手头的需求修完成了吧!在年会开始之前必须做出一个抽奖系统。这个系统很简单,后台可以设置总金额,然后每个用户可以获得的金额范围,金额派完则显示很遗憾没有中奖,还要设置抽奖活动时间。

需求分析

一看这东西,就觉得非常简单。最简单的一个方案,活动时间放在一个数据表,总金额和已经使用金额存放在一个表,已经派送的日志一个表。后台提供一个接口,客户端手动点击按钮,则发送一个请求。账号体系直接使用微信的oauth,接口首先判断活动有没有开始,如果开始则随机一个金额,然后判断如果派送该金额会不会超预算,如果不超预算,则调用微信的现金接口发放零钱。

并发问题

这个简单方案存在一个致命的问题,就是并发下,可能导致超预算的问题。如果采用加锁的方式,面对1000多员工同时请求,系统100%瘫痪。(因为抽奖系统的服务器是最普通的1核1G 1M带宽的服务器)

那么不加锁的情况,又能如何避免并发造成的派送超过预算的问题呢? 一个简单的办法,把分配派送金额的操作从并行变成串行。那么就需要异步的编程方法。最简单的处理方法,把任务写入mysql,然后启动一个独立的进程来一个任务一个任务的串行处理。异步的话,客户端如何知道服务器已经处理了呢?最简单就是采用轮询的方法了,客户端每隔几秒就请求服务器一次。

性能问题

由于抽奖是短时间大量用户请求的,如果直接让请求落到mysql,类似DDOS攻击,一般的数据库是扛不住的。而redis是1种基于内存的高并发NoSQL,在很多公司广泛使用,由于其性能非常好,并且其丰富的数据接口完全可以胜任抽奖任务需求。 这个时候,你可能有这样的疑问,我们的系统设计是怎么样的呢?

抽奖系统相关配置存储在redis的一个key值,直接使用json格式客户端请求的时候判断,时间是否在活动时间范围内客户端请求如果时间在活动范围内,则把用户添加到一个redis集合,用于防止用户重复请求,只有第一次请求才会添加到集合后,再添加到一个redis列表。后台一个独立的进程,从redis列表pop第一位用户,然后分配一个金额,然后把金额和用户信息压入另一个redis列表B,同时写入redis的hash结构,标示用户获得多少现金。一直循环该过程。后台另一个独立的进程,从redis列表B pop第一位用户,然后调用发送现金接口,一直循环该过程。客户端不停轮询获取用户金额的接口,该接口从哪个hash结构获取用户金额,然后没有数据,则告诉客户端若干秒后再次请求。

前端优化

由于参与活动的人数较多,而且服务器是放在外网的,所以需要考虑带宽的问题。

第一步,把静态资源放到cdn。第二步,抽奖页面静态化,同时也放到cdn,这样子服务器只需要承受用户请求和登录即可。第三步,由于采用了微信登录,所以登录系统采用一个独立的进程,并且使用异步框架来处理高并发。第四步,前端发送请求队列化处理,避免用户不停点击,造成大量请求。

总结

整套系统开发没有任何难度,唯一需要注意高并发下性能和数据问题。静态资源放到cdn,避免带宽成为瓶颈。把mysql操作变成redis操作,解决io问题

1…13141516
Mr.Gou

Mr.Gou

155 日志
11 分类
38 标签
RSS
GitHub E-Mail Weibo
Links
  • 阮一峰的网络日志
  • 离别歌 - 代码审计漏洞挖掘pythonc++
  • 一只猿 - 前端攻城尸
  • 雨了个雨's blog
  • nMask's Blog - 风陵渡口
  • 区块链技术导航
© 2023 蜀ICP备2022014529号