Ruby程序猿,写OC的果黑程序猿,蝉游记2号保管猿

  • 这种需求下,你的 DFA 结构没有必要添加 is_end / value ,直接用 hash 是否为空来判断就可以知道是否是最后一个,另外代码里面用了很多 clone ,会很消耗内存,可以用 inject:

    def add_word(word)
      word = word.strip.gsub(%r{[^\p{Han}+/ua-zA-Z0-9]}, '')
      word.chars.inject(self.words) do |words, char|
        if !words.key?char)
          words[char] = {}
        end
        words[char]
      end
    end
    
    def filter(word)
      sensitive_word = ''
      word = word.strip.gsub(%r{[^\p{Han}+/ua-zA-Z0-9]}, '')
      word.chars.each_with_index.inject(self.words) do |words, (char, index)|
        if words.key?(char)
          sensitive_word += char
          break if words[char].empty?
          # 如果被检测的词已是最后一个,但关键字还不是最后,则返为空
          return '' if index == word.size - 1
          words[char]
        else
          # 如果上一步在关键字中,这次又不在关键字中,需要重新初始化检测
          if !sensitive_word.empty?
            sensitive_word = ''
            words = self.words and redo
          else
            words
          end
        end
      end
      sensitive_word
    end
    

    以上代码是手写的,filter 部分应该还能再简化一下

  • 比如 PHP

  • 你在 location 里面添加这 2 个试试看,具体说明请参考 nginx 的文档:

    proxy_http_version 1.1;
    proxy_set_header Connection "";
    
  • 把 Nginx 配置贴上来看看?

  • 看这个 TIME_WAIT 是 nginx 和 puma 之间的连接,试试设置 nginx upstream keepalive 应该能解决这个问题。

  • 可以多创建一个表,记录被用户单条忽略的动态:

    ignored_events
    ------------------------
    user_id,  event_id
    3      ,  10
    

    然后加一个 not exists 或者 not in 查询

    select e.* from events e, event_subscribers es
        where e.user_id = es.subscribed_user_id
          and es.user_id = 3
          and e.id not in (
            select id from ignored_events ie
              where ie.user_id = 3
          )
    
    
  • 文章写的好详细,赞。

    如果担心大数据量的性能问题,还有一个选择是用 PostgreSQL 的 array ,可以给它设置 GIN 类型的索引,本质上是一个全文索引的字段,Rails 也有相关的 gem : https://github.com/tmiyamon/acts-as-taggable-array-on

  • [*0..5, *2..8, *3..12, 2, 2, 2, 2].each{|i| print' '*(40-2*i-i/2)+'*'*(4*i+1+i)+"\n"}
    
  • 可以看一下 ProxySQL 它能满足你提到的这些需求: https://github.com/sysown/proxysql

    另外一个是 Vitess 但我对它不熟,听 Github 的人说他们在评估这个,你也可以看一下: https://github.com/vitessio/vitess

  • ActiveJob 目的是为了并发/异步执行,改成长度为 1 的队列,未免削足适履,更合适的解决方案是用 flock,用 Exclusive lock 和 None blocking 来保证一个文件只能被一个 JobWorker 处理,同时也有并发处理多文件的能力

    f = File.open(...)
    if f.flock(File::LOCK_EX | File::LOCK_NB)
      ...
    end
    

Ruby 程序猿,写 OC 的果黑程序猿,蝉游记 2 号保管猿