范畴学基本知识

范畴学基本知识

范畴学(category theory)是数学中的一个抽象分支,能够形式化诸如集合论(set theory)、类型论(type theory)、群论(group theory)以及逻辑学(logic)等数学分支中的一些概念。范畴学主要处理对象(object)、态射(morphism)和变化式(transformation),而这些概念跟编程的联系非常紧密。下图是一些相同的概念分别在不同理论下的形式:

函数式编程入门

curring

A curried function is one where multiple arguments are descirbed by a series of one
argument funtions.For example, curried addition would be :

记录传入的参数,在需要的时候求值。
1
2
3
4
var curry = require('curry')
var add = curry(function(a, b){ return a + b})
var add100 = add(100)
add100(1) // =101

Curry allows you can aslo call a function with multiple arguments at once:

1
2
3
4
var sum3 = curry(function(a, b, c) { return a + b + c})
sum3(1,2,3) // =6
sum3(1)(2,3) // =6
sum3(1,2)(3) // =6

函数式编程入门

Functional programs

PURE FUNCTIONS

Pure functions are functions that have no side-effects.They don't assign to any outside variables, they don't consume input, they don't produce output, they don't read from or writ to a database, they don't modify the parameters they're passed, etc.

The basic idea is that, if you call a function with the same inputs over and over again, you alwyas get the same result.

You can certainly do things with impure functions(and you must, if your program is going to do amything interesting), but for the most part you'll want to keep most of your funtions pure.

javascript模式

javascriptPattern

《javascript设计模式与开发实践》学习记录

模式


什么是模式

模式是一个可复用的解决方案,可用于解决软件设计中的常见问题。三大好处:

  1. 模式是已验证的解决方案
  2. 模式很容易被复用
  3. 模式富有表达力

优秀的模式

优秀的模式应当可以执行以下操作:

  1. 解决特殊问题
  2. 没有显而易见的解决方案
  3. 描述经过验证的概念
  4. 描述一种关系

设计模式的类别

MySQL双主一致性架构优化

MySQL双主一致性架构优化

一、双主保证高可用

MySQL数据库集群常使用一主多从,主从同步,读写分离的方式来扩充数据库的读性能,保证读库的高可用,但此时写库仍然是单点。

在一个MySQL数据库集群中可以设置两个主库,并设置双向同步,以冗余写库的方式来保证写库的高可用。

二、并发引发不一致

数据冗余会引发数据的一致性问题,因为数据的同步有一个时间差,并发的写入可能导致数据同步失败,引起数据丢失:

如上图所述,假设主库使用了auto increment来作为自增主键:

  • 两个MySQL-master设置双向同步可以用来保证主库的高可用
  • 数据库中现存的记录主键是1,2,3
  • 主库1插入了一条记录,主键为4,并向主库2同步数据
  • 数据同步成功之前,主库2也插入了一条记录,由于数据还没有同步成功,插入记录生成的主键也为4,并向主库1也同步数据
  • 主库1和主库2都插入了主键为4的记录,双主同步失败,数据不一致

mysql调优

MySQL 调优

mysql中的两个关键参数

(1)interactive_timeout:

参数含义:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
参数默认值:28800秒(8小时)

(2)wait_timeout:

参数含义:服务器关闭非交互连接之前等待活动的秒数。
在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。
参数默认值:28800秒(8小时)

wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能,不过也不能把这个指设置的过小,否则你可 能会遭遇到“MySQL has gone away”之类的问题,通常来说,我觉得把wait_timeout设置为10是个不错的选择,但某些情况下可能也会出问题,比如说有一个CRON脚本, 其中两次SQL查询的间隔时间大于10秒的话,那么这个设置就有问题了(当然,这也不是不能解决的问题,你可以在程序里时不时mysql_ping一下, 以便服务器知道你还活着,重新计算wait_timeout时间)

Redis学习记录

Redis学习记录

业界常用的一些 key-value分布式缓存系统如下:

  • Redis
  • Memcached
  • Cassandra(Facebook 开源)
  • Tokyo Tyrant (Tokyo Cabinet)

Redis的几个特点:

  • Redis 是一个 key-value 的缓存(cache)和存储(store)系统(适合作缓存或DB)
  • 支持丰富的数据结构
    • List 就专门用于存储列表型数据,默认按操作时间排序
    • Sorted Set 可以按分数排序元素,分数是一种广义概念,可以是时间或评分
    • 其丰富的数据结构为日后扩展提供了很大的方便。
  • 提供的所有操作都是原子操作,为并发天然保驾护航。
  • 超快的性能,见其官方性能测试《How fast is Redis?》。
  • 拥有比较成熟的Java客户端 - Jedis,像新浪微博都是使用它作为客户端。(官方推荐的Clients)

Redis学习记录2

redis bgrewriteaof问题

一、背景

  1. AOF:

    Redis的AOF机制有点类似于Mysql binlog,是Redis的提供的一种持久化方式(另一种是RDB),
    它会将所有的写命令按照一定频率(no, always, every seconds)写入到日志文件中,当Redis停机
    重启后恢复数据库。


redis配置

redis 配置

redis.conf 配置项说明如下:

  1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程
    daemonize no
  2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定
    pidfile /var/run/redis.pid
  3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字
    port 6379
  4. 绑定的主机地址
    bind 127.0.0.1
    5.当 客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
    timeout 300
  5. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose
    loglevel verbose
  6. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null
    logfile stdout
  7. 设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id
    databases 16
,
Fork me on GitHub