Redis
 sql >> Baza danych >  >> NoSQL >> Redis

Autouzupełnianie Redis

Jeśli masz do czynienia z dużym zbiorem danych, sugerowałbym rozważenie wdrożenia tego jako próby. Złożyłem trochę Ruby, który by to zrobił:

    require 'rubygems'
    require 'redis'
    
    class RedisTrie
      TERMINAL = '+'
    
      def initialize(prefix)
        @prefix = prefix
        @r = Redis.new
      end
    
      def add_word(word)
        w = word.gsub(/[^a-zA-Z0-9_-]/, '')
        key = "#{@prefix}:"
    
        w.each_char do |c|
          @r.zset_add key, c.bytes.first, c
          key += c
        end
    
        @r.zset_add key, 0, TERMINAL
      end
    
      def add_words(*words)
        words.flatten.compact.each {|word| add_word word}
      end
    
      def suggest(text)
        @r.zset_range("#{@prefix}:#{text}", 0, -1).map do |c|
          (c == TERMINAL) ? text : suggest(text + c)
        end.flatten
      end
    end
    
    rt = RedisTrie.new('trie')
    
    rt.add_words %w( apple automobile carwash oil-change cranky five ruthie axe auto )
    
    p rt.suggest(ARGV.shift.to_s)

Na przykład:

    $ ruby RedisTrie.rb
    ["apple", "auto", "automobile", "axe", "carwash", "cranky", "five", "oil-change", "ruthie"]
    $ ruby RedisTrie.rb a
    ["apple", "auto", "automobile", "axe"]
    $ ruby RedisTrie.rb au
    ["auto", "automobile"]
    $ ruby RedisTrie.rb aux
    []

Przeczytaj więcej o próbach we wpisie Wikipedii na temat prób.

Na pewno będziesz chciał zoptymalizować metodę sugerowania, aby nie zwracała WSZYSTKICH wartości, zamiast tego zwracała tylko pierwsze znalezione wartości X. Byłoby to sprzeczne z celem iteracji całej struktury danych.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Czy implementuję serializację i deserializację NodesJS + Passport + RedisStore?

  2. Redis, Node.js i Socket.io :Uwierzytelnianie między serwerami i zrozumienie node.js

  3. Redis INCRBY z ograniczeniami

  4. Wygaśnięcie powiadomienia o przestrzeni kluczy Redis nie uruchamia się

  5. Jaki jest właściwy sposób obsługi połączenia Redis w Tornado? (Asynchroniczny — Pub/Sub)