рдкрдЯрд░рд┐рдпреЛрдВ рдореЗрдВ рдСрдирд▓рд╛рдЗрди рдСрдбрд┐рдпрдВрд╕ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Redis EXPIRE рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдЬрд┐рд╕реЗ




рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░ рд░рд╣рд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рд╕рдВрднрд╡рдд: рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рддрдХ рдкрд╣реБрдВрдЪрдиреЗ рдкрд░ рдПрдХ рдЯрд╛рдЗрдо рд╕реНрдЯреИрдореНрдк рд╕реЗрдЯ рдХрд░рдирд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рдЗрд╕ рд╕рдордп рд╕реНрдЯреИрдореНрдк рдХреЗ рд╕рд╛рде рдЙрд╕рдХреА (рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛) рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ - рд╕рд╛рдордВрдЬрд╕реНрдп рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВред рдпрд╣ рдЖрдкрдХреЛ рддрдп рдХрд░рдирд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рд▓реЗрдирд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрд┐рд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдореИрдВ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рд╕рд░рд▓ рд╣реИ рдФрд░ SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, Redis рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдкреНрд░рдореБрдЦ рдЬреАрд╡рдирдХрд╛рд▓ ( expire ) рд╣реИред



рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


init


 # config/initializers/redis.rb $redis_onlines = Redis.new 

рдКрдкрд░ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ

 # config/initializers/redis.rb $redis_onlines = Redis.new path: "/tmp/redis.sock", db: 15, driver: :hiredis 


Gemfile


 # Gemfile gem 'redis' gem 'hiredis' # optional 

bundle рдЪрд▓рд╛рдирд╛ рди рднреВрд▓реЗрдВ

online рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ


current_user рд╡рд┐рдзрд┐
current_user рд╡рд┐рдзрд┐ рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдкрд╣рд▓реЗ рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ - рдпрд╣ рд╡рд╣ рд╡рд┐рдзрд┐ рд╣реИ рдЬреЛ рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдпрд╛ nil рд▓реМрдЯрд╛рддреА рд╣реИ - рдпрджрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рд╣реИред
 def current_user @current_user ||= User.find_by_id( session[ :user_id ] ) end 


 # app/controllers/application_controller.rb after_filter :set_online #  Rails 4 : # after_action :set_online #     set_online private def set_online if !!current_user #   ,    $redis_onlines.set( current_user.id, nil, ex: 10*60 ) # `ex: 10*60` -     - 10 ,  10    end end 

рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ?


  # app/models/user.rb def online? #      -   false,  true $redis_onlines.exists( self.id ) end 


рдЫреЛрдЯрд╛ рдмреЛрдирд╕ - рдСрдирд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА


 # app/cpntrollers/application_controller.rb def all_who_are_in_touch $redis_onlines.keys # => [ "123", "234", "1", "23" ] #    id   end 


рдмрд╕ рдЗрддрдирд╛ рд╣реА

рдЕрдирд╛рдо рдХреЗ рд▓рд┐рдП рдорд╛рдореВрд▓реА рд╕реБрдзрд╛рд░



рдЕрдирд╛рдо рдЖрдЧрдВрддреБрдХреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП (рдЬрд┐рдиреНрд╣реЛрдВрдиреЗ рдкрдВрдЬреАрдХрд░рдг рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ / рд▓реЙрдЧ рдЗрди рдирд╣реАрдВ рдХрд┐рдпрд╛ рд╣реИ), рджреГрд╖реНрдЯрд┐рдХреЛрдг рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдЬреЛрдбрд╝ рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рд╣реИред

рдСрдирд▓рд╛рдЗрди рд╕реНрдерд╛рдкрдирд╛
  # app/controllers/application_controller.rb def set_online if !!current_user #       "user:"  id $redis_onlines.set( "user:#{current_user.id}", nil, ex: 10*60 ) else #      "ip:"    id  $redis_onlines.set( "ip:#{request.remote_ip}", nil, ex: 10*60 ) end end 


рдиреЗрдЯрд╡рд░реНрдХ рдореЗрдВ?
 # app/models/user.rb def online? $redis_onlines.exists( "user:#{self.id}" ) end 


рдиреЗрдЯрд╡рд░реНрдХ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рд╕реВрдЪреА
 # app/cpntrollers/application_controller.rb #     (   id) def all_signed_in_in_touch ids = [] $redis_onlines.scan_each( match: 'user*' ){|u| ids << u.gsub("user:", "") } ids end #      def all_anonymous_in_touch $redis_onlines.scan_each( match: 'ip*' ).to_a.size end #     def all_who_are_in_touch $redis_onlines.dbsize end 



рдареАрдХ рд╣реИ, рдмрд╕ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдереЛрдбрд╝рд╛ рд╕рд╛


9000 + 9000
Redis RAM рдореЗрдВ рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рдмрд╕реНрдЯ рдХрд░рдирд╛ рдкреВрд░реЗ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдкрд░ рдкреНрд░рддрд┐рдХреВрд▓ рдкреНрд░рднрд╛рд╡ рдбрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП, рдПрдХ рдЦрд╛рд▓реА рдбреЗрдЯрд╛рдмреЗрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ( FLUSHALL рдкрд╣рд▓реЗ FLUSHALL рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛) рдФрд░ рдпрд╣рд╛рдВ рдпрд╣ рдЫреЛрдЯреА рд░реВрдмреА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╣реИ ред 9000 рдСрдирд▓рд╛рдЗрди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдФрд░ 9000 рдСрдирд▓рд╛рдЗрди рдЕрдирд╛рдо рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЗрд╕ рддрд░рд╣ рдирд┐рдХрд▓рд╛:

  1. рдЦрд╛рд▓реА рдбреЗрдЯрд╛рдмреЗрд╕: 810.75K
  2. 18000 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ: 3.49M

рдЗрд╕реА рддрд░рд╣ 65000 + 65000 рдХреЗ рд▓рд┐рдП

  1. 130,000 рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпрд╛рдБ: 18.66M



# рдпреВрдбреАрдкреА 1


pipelined рдореЗрдВ рдЖрд╡рд░рдг рдХреЛ set рдХреЙрд▓ рдореЗрдВ ex: timeout рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд pipelined ред рдзрдиреНрдпрд╡рд╛рдж tipcu рдЯрд┐рдк рдХреЗ рд▓рд┐рдПред рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдкрд░реАрдХреНрд╖рдг [ src: ruby ] рдиреЗ рдПрдХ рдареЛрд╕ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджрд┐рдпрд╛ред

# рдпреВрдбреАрдкреА 2


рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг / рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ:
  1. before_filter рдмрдЬрд╛рдп before_filter рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ - рдлрд┐рд░ рд▓реЙрдЧ рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реЗ (рдЕрдЧрд▓реЗ 10 рдорд┐рдирдЯ рдореЗрдВ) рдпрд╛рддреНрд░рд╛ рдкрд░ рдСрдирд▓рд╛рдЗрди рд╕реВрдЪреА рдореЗрдВ рдЦреБрдж рдХреЛ рджреЗрдЦреЗрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдпрд╣рд╛рдБ рдЪреБрдирд╛рд╡ рдХреЗрд╡рд▓ рдЖрдкрдХреА рдЬрд░реВрд░рддреЛрдВ / рдЗрдЪреНрдЫрд╛рдУрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред
  2. рдпрджрд┐ рдЕрдирд╛рдо рдСрдбрд┐рдпрдВрд╕ рдФрд░ рд╕рд╛рде-рд╕рд╛рде рд▓реЙрдЧ-рдЗрди рдХрд┐рдП рдЧрдП рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЧрд┐рдирд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рддреЛ рдЬрдм рдХреЛрдИ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд▓реЙрдЧ рдЗрди / рдЖрдЙрдЯ, рдмрд╛рдп рдФрд░ рдмрдбрд╝рд╛ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рд╡рд┐рдкрд░реАрдд рд╕реВрдЪреА рд╕реЗ рд╕рд╛рдл рдХрд░рдирд╛ рдмреБрд░рд╛ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╛рдЗрдЯ рдкрд░ рд▓реЙрдЧ рдХрд░рддрд╛ рд╣реИ (рдЖрдИрдкреА рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ), рдФрд░ рдлрд┐рд░ рд▓реЙрдЧ рдЗрди рдХрд░рддрд╛ рд╣реИ (рдЖрдИрдбреА рджреНрд╡рд╛рд░рд╛ рджреВрд╕рд░рд╛ рд░рд┐рдХреЙрд░реНрдб) - рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рдХрдЯ рднрд╡рд┐рд╖реНрдп рдореЗрдВ (рд╕рд╢рд░реНрдд 10 рдорд┐рдирдЯ) рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджреЛ рдХреЗ рд▓рд┐рдП рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдиреАрдЪреЗ рдмрд┐рдЧрд╛рдбрд╝рдиреЗ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдиред

рд╡рд┐рдкрд░реАрдд рд╕реВрдЪреА рдХреЛ рд╕рд╛рдлрд╝ рдХрд░реЗрдВ
 # app/cpntrollers/session_controller.rb #   #  -  create #  - destroy before_filter :clear_from_signed_in_touch, only: :destroy before_filter :clear_from_anonymous_in_touch, only: :create # ... private #   -      ip def clear_from_anonymous_in_touch $redis_onlines.del( "ip:#{request.remote_ip}" ) end #   id      - session[:user_id] #   -      id def clear_from_signed_in_touch $redis_onlines.del( "user:#{session[:user_id]}" ) end 



рд╡рд┐рд╖рдп рдкрд░ рдХреБрдЫ рд▓рд┐рдВрдХ ( рдЕрдВрдЧреНрд░реЗрдЬреА ):

Source: https://habr.com/ru/post/In216047/


All Articles