2010-12-30 19 views
0

habe ich eine URL Shortener Algorithmus Ruby + MongoMapperRace Condition, URL Shortener Algorithmus/Rails/MongoDB/MongoMapper

Es ist eine einfache URL Shortener Algorithmus mit maximal 3 Ziffern http://pablocantero.com/###

Wo jeder # kann sein [az] oder [AZ] oder [0-9]

Für diesen Algorithmus, ich brauche vier Attribute auf MongoDB ( durch 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 
persistieren

habe ich eine andere Klasse ShortenerData zu verwalten und die einzigartige Kennung

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 

Die Shortener Nutzung

Shortener.instance.get_unique 

Meine Zweifel zu erzeugen, wie kann ich get_unique synchronisiert, meine app machen wird eingesetzt auf Heroku, können gleichzeitige Anfragen Shortener.instance.get_unique

Antwort

2

Ich habe das Verhalten geändert, um die base62 id Ich habe Juwel eine Autoinkrement

Mit dem Auto erhöht id ich Base62 kodieren

Das Juwel MongoMapper ist auf 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 

Nutzungs

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

Kurze URL

löste ich die Race-Bedingung mit MongoDB http://www.mongodb.org/display/DOCS/findAndModify+Command

find_and_modify
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 

Wenn dieses neue Verhalten, das ich das Rennen Zustand Problem gelöst!

Wenn Ihnen dieses Juwel gefallen hat, helfen Sie bitte, es zu verbessern. Sie können gerne Ihre Beiträge machen und als Pull-Anfrage senden oder senden Sie mir einfach eine Nachricht http://pablocantero.com/blog/contato

Verwandte Themen