rails 应用程序中的会话过多
Too many sessions in a rails application
我正在 rails 从头开始在 ruby 上构建一个 电子商务 网站。(这是我在 ruby 上的第一个项目在 rails)
我的产品属于一个子类别,而该子类别又属于一个类别。
我的过滤器部分包括 多个复选框 用于类别、子类别、additional_category(如手工制作的衣服、工厂制造等)、生活方式(放松、公司等)和 cloth_material_type(这有大约 30 个选项)
我正在将每个案例的 5 个数组 发送到后端以搜索关联。
现在,当未登录的用户重新加载页面时,用户设置的过滤器将重置为默认值。
为了避免这种情况,我想到了四个选项。
选项 1。将用户设置的过滤器值存储在 cookies 中,fast.But 它可能会降低用户浏览器的速度。
选项 2。使用 ActiveRecord::SessionStore gem 将值存储在会话中,这会将我的会话大小增加到 65K,但会降低应用程序的速度。
Option 3 .Using jquery modify/create document.url options 以便每个过滤器选项附加到 document.url 并在重新加载时我得到用户为 filtering.But 设置的参数,这看起来实施起来非常麻烦。
选项 4。使用 gem 如 rails 临时数据库 等
我选择了选项 2 并为此目的使用会话存储,但我认为将来维护它会变得很麻烦。
只是需要一些建议,比如其他 rails 电子商务网站如何解决这个问题,或者有没有更好的方法来解决这个问题。
Redis
我要做的是添加一个抽象层;具体来说,我认为你会从使用 Redis
或类似的 temporary db 中受益(正如你在问题中提到的那样)。
Redis 是一个 key:value
数据库,它主要存储 JSON 值供您在应用程序中使用。如果将其绑定到模型,您将能够存储临时值而不会影响应用的性能。
我认为您可以设置 Redis 来存储客人 ID,以及您的值的数组:
[guest_user_id] => [
1 => "x"
2 => "y"
3 => ["z", "a", "b"]
]
您可以在初始化 Redis
系统时生成 guest_user_id
,并将其存储在用户的 session
中。这样,您只在用户的浏览器中存储最少的数据,并且可以使用 Redis
数据填充各种控制器操作:
#config/routes.rb
resources :categories do
resources :subcategories
end
#app/models/user.rb
Class User < ActiveRecord::Base
def self.new_data
# create guest_id and send to Redis
end
end
这将允许您使用您的 guest_id
如果 用户未注册:
#app/controllers/products_controller.rb
class ProductsController < ApplicationController
def show
@user = user_signed_in? ? current_user : User.new_data
#You'll then be able to populate their Redis values with the data from the product selection etc
end
end
我可以详细说明,但由于您只是在寻找建议,所以这就是我目前必须推荐的内容
我正在 rails 从头开始在 ruby 上构建一个 电子商务 网站。(这是我在 ruby 上的第一个项目在 rails)
我的产品属于一个子类别,而该子类别又属于一个类别。
我的过滤器部分包括 多个复选框 用于类别、子类别、additional_category(如手工制作的衣服、工厂制造等)、生活方式(放松、公司等)和 cloth_material_type(这有大约 30 个选项)
我正在将每个案例的 5 个数组 发送到后端以搜索关联。
现在,当未登录的用户重新加载页面时,用户设置的过滤器将重置为默认值。
为了避免这种情况,我想到了四个选项。
选项 1。将用户设置的过滤器值存储在 cookies 中,fast.But 它可能会降低用户浏览器的速度。
选项 2。使用 ActiveRecord::SessionStore gem 将值存储在会话中,这会将我的会话大小增加到 65K,但会降低应用程序的速度。
Option 3 .Using jquery modify/create document.url options 以便每个过滤器选项附加到 document.url 并在重新加载时我得到用户为 filtering.But 设置的参数,这看起来实施起来非常麻烦。
选项 4。使用 gem 如 rails 临时数据库 等
我选择了选项 2 并为此目的使用会话存储,但我认为将来维护它会变得很麻烦。
只是需要一些建议,比如其他 rails 电子商务网站如何解决这个问题,或者有没有更好的方法来解决这个问题。
Redis
我要做的是添加一个抽象层;具体来说,我认为你会从使用 Redis
或类似的 temporary db 中受益(正如你在问题中提到的那样)。
Redis 是一个 key:value
数据库,它主要存储 JSON 值供您在应用程序中使用。如果将其绑定到模型,您将能够存储临时值而不会影响应用的性能。
我认为您可以设置 Redis 来存储客人 ID,以及您的值的数组:
[guest_user_id] => [
1 => "x"
2 => "y"
3 => ["z", "a", "b"]
]
您可以在初始化 Redis
系统时生成 guest_user_id
,并将其存储在用户的 session
中。这样,您只在用户的浏览器中存储最少的数据,并且可以使用 Redis
数据填充各种控制器操作:
#config/routes.rb
resources :categories do
resources :subcategories
end
#app/models/user.rb
Class User < ActiveRecord::Base
def self.new_data
# create guest_id and send to Redis
end
end
这将允许您使用您的 guest_id
如果 用户未注册:
#app/controllers/products_controller.rb
class ProductsController < ApplicationController
def show
@user = user_signed_in? ? current_user : User.new_data
#You'll then be able to populate their Redis values with the data from the product selection etc
end
end
我可以详细说明,但由于您只是在寻找建议,所以这就是我目前必须推荐的内容