招聘还在继续,欢迎自荐和推荐,😄
感谢 @gene_wu 就是发得好像晚了一点,😄
这篇文件讲的是 Capistrano 2 的用法,有些在 Capistrano 3 下已经没法用了。比如 run
已经被 execute
取代,等等,文字应该声明一下适用的版本。
@jasonliu @hooooopo @Rei @42thcoder @msg7086 可能对于论坛帖子的例子优化的必要性不大,但楼主提到的情形还是有很多现实的场景。
例如:有很大的用户表 users(数千万),用户有一些属性包括性别,年龄,地区等等,另外通过 redis 记录用户最新访问时间,业务上有很多筛选客户的需求,需要组合各种属性条件和最新访问时间,这个时候就需要聚合数据了。
针对你提到的例子,我想可以这样子解决:
同时在 MySQL 里存储一份数据,也就是说帖子的喜欢数和点击数同时也放在帖子表(或者新建一张帖子统计信息表),因为实时更新 MySQL 可能导致性能问题,可以定期同步数据,比如每天凌晨的时候跑一个任务更新数据表。 这样就可以使用 MySQL 查询过滤获取所需数据,但是存在数据不那么精确问题,需要考虑需求方能否接受。
推广到更广泛的问题,因为 Redis 和 MySQL 分开存储,如果业务需要联合使用这两部分的数据,就需要聚合数据,简单的聚合数据可以在程序里完成,复杂的聚合可能需要在 MySQL 同时保持数据的副本,而且可能导致数据非实时同步问题。
再广泛的情况,聚合数据,还可以通过建立数据集市(数据仓库),导入专门的检索系统(比如 solr / elastic search)完成。
#23 楼 @linjunhalida 这张是在薄荷办公室里办的 ruby 聚会的图片,大多是 ruby 程序员,当然绝大部分都是男的的,不是薄荷的员工照哦,哎,看来还是得上一些薄荷 girl 的图片才行,:)
#11 楼 @meeasyhappy 现在有 5 位 ruby 工程师,需要扩充到 10 位。
#2 楼 @xiaoronglv 看来真得上一些图片,哈
貌似你已经有很深的技术背景了,为什么还需要找技术合伙人呢?通常这种情况找产品领域或者市场方面的合伙人更合适啊,难道是纯技术领域的创业?
Tengine(nginx 淘宝版本) http://tengine.taobao.org/changelog.html 支持 gzip_clear_etag 声明,可以通过
gzip_clear_etag off;
设置不去除 etag,避免 hack nginx 源码,:)
#95 楼 @akirapanda #96 楼 @tzwm 谢谢!酸奶可以在薄荷 app 里买哦,现在还有优惠,送酸奶机的,:)
#93 楼 @akirapanda #91 楼 @Grant 抱歉,忘记提示停车地方了,展想这边停车很贵,对面天之骄子广场周六周日停车免费,说晚了,😚
非常欢迎大家到薄荷参加这一次的 Ruby 活动!为方便大家,附上导航地图。 薄荷科技办公地点: 祖冲之路 2290 号 1 号楼 2101 室 2 号线广兰路站下车,2 号口出,向中环方向(往东走),步行 8 分钟左右,最高的一幢楼,进入大厦后,就会有薄荷的美女引导了,:)
1.因为 ruby 最擅长的就是这个领域,rails 引领潮流
@yedingding 玎玎已经确定了一个 topic 哦,是关于 MySQL 的
MyToken.acquire
是资源生成的过程,生产后就加入到 connection pool 内部的队列里了,所以只会调用 5 次,connection pool 在调用 MyToken.acquire 会加锁的。没有必要再 token 放到 @tokens 中了。
#5 楼 @kingwkb 那我就好人做到底吧,你看看下面的代码:
class MyToken
@tokens = %w(111 222 333 444 5555)
def self.acquire
@tokens.pop
end
end
$token_pool = ConnectionPool.new(size: 5, timeout: 5) { MyToken.acquire }
$token_pool.with do |token|
# use token
puts token
end
把每一个 token 作为 connection pool 里一个资源,通过 MyToken.acquire 生成新的资源,这里有一个要注意的问题是,connection pool 的 size 不能超过 tokens 的长度,否则可能引起 pool 里存在空 token 的情况。 另外,不能保证顺序读到 token,但能保证某一个 token 同一时间只被一个线程使用,保证如果 token 不够使用时,申请使用的线程等待执行。
@kingwkb 不客气。其实我对你的问题有一些疑惑,我理解应该是两种问题:
如何保证多线程(以及多进程)环境下对某个资源的互斥使用。 这个问题通过一个分布式锁处理就可以了,redis 很好实现这个机制。
如何在多线程下对有限个资源的使用,保证每个资源不会被多个线程同时使用。 例如 sidekiq 中对 database connection 的使用,资源有限,线程数多于资源数,通过 ActiveRecord 自带的 connection pool 实现这种方式的资源使用。有一个 gem https://github.com/mperham/connection_pool 就是用于解决这个问题的,作者也是 sidekiq 的作者。
你可以用 redis 实现跨进程分布式锁来解决这个问题。 关于 redis 分布式锁,详见 http://redis.io/topics/distlock。
直接使用 redis 的命令实现原理并不复杂,但是蛮繁琐的,好在有一个 gem redis-objects https://github.com/nateware/redis-objects 可以简化操作。
举个例子,假如对某一个 user 有一个长时间处理的任务,希望避免同时执行,就可以用下面的代码实现。
class User
include Redis::Objects
lock :large_job, expiration: 120.seconds
#...
def execute_large_job
large_job_lock.lock do
# do something slowly
end
end
# ...
end
把执行 execute_large_job 过程放入 sidekiq 处理,sidekiq 本身有重试机制,当出现同时争取执行这个任务时,只有一个可以执行,另一个会抛异常,然后过一段时间之后重试。
希望对你有帮助。