Состояние гонки, алгоритм сокращения URL / Rails / MongoDB / MongoMapper - PullRequest
0 голосов
/ 30 декабря 2010

Я создал алгоритм сокращения URL с помощью Ruby + MongoMapper

Это простой алгоритм сокращения URL с максимум 3 цифрами http://pablocantero.com/###

Где каждый # может быть [a-z] или [A-Z] или [0-9]

Для этого алгоритма мне нужно сохранить четыре атрибута на MongoDB (через MongoMapper)

class ShortenerData
  include MongoMapper::Document
  VALUES = ('a'..'z').to_a + ('A'..'Z').to_a + (0..9).to_a
  key :col_a, Integer
  key :col_b, Integer
  key :col_c, Integer
  key :index, Integer
end

Я создал еще один класс для управления ShortenerData и создания уникального идентификатор

class Shortener
  include Singleton

  def get_unique
    unique = nil
    @shortener_data.reload 
    # some operations that can increment the attributes col_a, col_b, col_c and index
    # ...
    @shortener_data.save
    unique
  end
end

Использование Shortener

Shortener.instance.get_unique

Я сомневаюсь, как я могу синхронизировать get_unique, мое приложение будет развернут на героку, по параллельным запросам можно звонить Shortener.instance.get_unique

1 Ответ

2 голосов
/ 31 декабря 2010

Я изменил поведение, чтобы получить идентификатор base62. Я создал самоинкрементный гем в MongoMapper

С автоматически увеличенным идентификатором я кодирую в base62

Камень доступен на GitHub https://github.com/phstc/mongomapper_id2

# app/models/movie.rb
class Movie
  include MongoMapper::Document

  key :title, String
  # Here is the mongomapper_id2
  auto_increment!
end

Использование

movie = Movie.create(:title => 'Tropa de Elite')
movie.id # BSON::ObjectId('4d1d150d30f2246bc6000001')
movie.id2 # 3
movie.to_base62 # d

Короткий URL

# app/helpers/application_helper.rb
def get_short_url model
    "http://pablocantero.com/#{model.class.name.downcase}/#{model.to_base62}"
end

Я решил условие гонки с MongoDB find_and_modify http://www.mongodb.org/display/DOCS/findAndModify+Command

model = MongoMapper.database.collection(:incrementor).
   find_and_modify(
   :query => {'model_name' => 'movies'}, 
   :update => {'$inc' => {:id2 => 1}}, :new => true)

model[:id2] # returns the auto incremented_id

Если это новое поведение, я решил проблему состояния гонки!

Если вам понравился этот драгоценный камень, пожалуйста, помогите улучшить его. Вы можете внести свой вклад и отправить его в виде запроса на отправку или просто отправьте мне сообщение http://pablocantero.com/blog/contato

...