#21 思考:关于存储的解决方案
开发者 2019-04-14有空思考一下几种场景下的文件存储方案。
- 场景 1. Web 静态资源
- 场景 2. 虚拟化中的卷存储
- 场景 3. 邮件系统中的邮件
- 场景 4. 大量图片,音频,视频(二进制)
- 场景 5. 大量日志(文本)
coding in a complicated world
有空思考一下几种场景下的文件存储方案。
- 场景 1. Web 静态资源
- 场景 2. 虚拟化中的卷存储
- 场景 3. 邮件系统中的邮件
- 场景 4. 大量图片,音频,视频(二进制)
- 场景 5. 大量日志(文本)
突然想了解一下我们 SMTP 服务中的入栈邮件大小,于是写了点脚本分析一下。
先上结论:
方便资产统计
我本来就想记录一下请求搜集服务的,结果扩大化,发现完全兜不住,好吧,就这样吧!
中国人习惯年月日时分秒,这可能也是一般符合国际通行规范的时间格式。
yymmdd
yyyymmdd
yyyy-mm-dd hh:mm:ss
yyyy/mm/dd hh:mm:ss
如果加上毫秒/微秒,在秒后面接上 ,SSS
或 .SSS
就行。
但是由于英美的国际地位,以及由于历史原因而导致的英语的强势地位,英文国家的表述习惯也不能不考虑,
用阿拉伯数字表示的话,可以用小数点、横杠、斜杠连接,数字可以用前导 0,
不过有一点很悲剧了,5/4/1919
,如果不清楚上下文语境中的文化背景,谁 TM 知道应该算五四,还是四五。
Unix Timestamp
又叫 Unix 时间(Unix Time),又叫 POSIX 时间(POSIX Time),又叫 Epoch Time。
以 UTC+0:00 1970/01/01 00:00:00 为起点,至今的秒数就是时间戳的值。
实际上我在很多项目中用到的时间戳都没有考虑时区,直接用当前系统默认时区的 1970/01/01 00:00:00 为起点,或者说是把当前时区时间当作零时区时间。
Internet Message Format, 邮件格式
date-time = [ day-of-week "," ] date FWS time [CFWS]
day-of-week = ([FWS] day-name) / obs-day-of-week
day-name = "Mon" / "Tue" / "Wed" / "Thu" /
"Fri" / "Sat" / "Sun"
date = day month year
year = 4*DIGIT / obs-year
month = (FWS month-name FWS) / obs-month
month-name = "Jan" / "Feb" / "Mar" / "Apr" /
"May" / "Jun" / "Jul" / "Aug" /
"Sep" / "Oct" / "Nov" / "Dec"
day = ([FWS] 1*2DIGIT) / obs-day
time = time-of-day FWS zone
time-of-day = hour ":" minute [ ":" second ]
hour = 2DIGIT / obs-hour
minute = 2DIGIT / obs-minute
second = 2DIGIT / obs-second
zone = (( "+" / "-" ) 4DIGIT) / obs-zone
1992/02/12 12:23:22+0800
Wed, 21 Jul 2017 10:35:00 +0000 (UTC)
Wed, 21 Jul 2017 18:35:19 +0800 (CST)
Wed, 21 Jul 2017 03:35:02 -0700 (PDT)
import time
import datetime
time.strftime('%a, %d %b %Y %H:%M:%S %z') # local timezone
time.strftime('%a, %d %b %Y %H:%M:%S %z', time.gmtime()) # UTC
tz_e8 = datetime.timezone(datetime.timedelta(hours=8)) # +08:00
dt_e8 = datetime.datetime.now(tz_e8)
print(dt_e8)
print(dt_e8.strftime('%a, %d %b %Y %H:%M:%S %z'))
tz_w8 = datetime.timezone(datetime.timedelta(hours=-8)) # -08:00
dt_w8 = datetime.datetime.now(tz_w8)
print(dt_w8.strftime('%a, %d %b %Y %H:%M:%S %z'))
# dt_e8.strftime('%Y-%m-%d %H:%M:%S.%f')
约定了时间中各个部分的格式,比如年份应该采用四位数字,日期应该怎么表示,时间范围(比如一个月),循环时间,时间区间应该如何表示之类,是一份完整的时间相关规范。
对应的中国国家标准是 GB/T 7408-2005
。
比如我们要说的完整时间格式化就有几种允许的格式,下面就是常见的一种符合规范的表述:
YYYY-MM-DDThh:mm:ss+offset
例如:
2004-05-03T17:30:08Z
2004-05-03T17:30:08+08:00
JavaScript 日期输出:
Sat Jul 24 2017 15:42:49 GMT+0800 (中国标准时间)
Python datatime 类型转字符串:
2017-07-25 12:09:39.123173+08:00
对于一个服务来讲,代码部署的速度和便捷性并不是一件很要紧的事情。但是对于开发者来说,能够高效部署代码,还是能够在一定程度上提升自己开发和测试的效率。
前言:可能是最近一直在想怎么成为一个优秀的程序员,程序员职业生涯如何可持续发展,从而引发了这一次的思考。
阮一峰发表了一篇新文章《你的命运不是一头骡子》,看完之后很受触动。
/proc/uptime
在开发中的一点应用
在一些和时间关联紧密的操作中,可要提防修改时间对系统运行的影响,这个时候 /proc/uptime
就派上用场了。
通过命令调用,随机生成密码。
我常用的方法:date | md5sum | base64 | head -c16; echo
重装系统,记录安装过程,留给日后重建同样的开发环境作参考。
其实还有好多细节没有记录,日后慢慢补充完整。
时间是客观存在的,但我们对时间的认识却是主观的。
我们的计时方法深受我们的语言和文化的影响。
做一个高效的、能为团队带来更多价值的 Web 开发者。