lib/redis/objects.rb in redis-objects-0.6.1 vs lib/redis/objects.rb in redis-objects-0.7.0
- old
+ new
@@ -1,9 +1,18 @@
# Redis::Objects - Lightweight object layer around redis-rb
# See README.rdoc for usage and approach.
require 'redis'
+
class Redis
+ autoload :Counter, 'redis/counter'
+ autoload :List, 'redis/list'
+ autoload :Lock, 'redis/lock'
+ autoload :Set, 'redis/set'
+ autoload :SortedSet, 'redis/sorted_set'
+ autoload :Value, 'redis/value'
+ autoload :HashKey, 'redis/hash_key'
+
#
# Redis::Objects enables high-performance atomic operations in your app
# by leveraging the atomic features of the Redis server. To use Redis::Objects,
# first include it in any class you want. (This example uses an ActiveRecord
# subclass, but that is *not* required.) Then, use +counter+, +lock+, +set+, etc
@@ -15,11 +24,11 @@
# counter :joined_players
# counter :active_players, :key => 'game:#{id}:act_plyr'
# lock :archive_game
# set :player_ids
# end
- #
+ #
# The, you can use these counters both for bookeeping and as atomic actions:
#
# @game = Game.find(id)
# @game_user = @game.joined_players.increment do |val|
# break if val > @game.max_players
@@ -36,34 +45,37 @@
#
#
module Objects
dir = File.expand_path(__FILE__.sub(/\.rb$/,''))
- autoload :Counters, File.join(dir, 'counters')
- autoload :Lists, File.join(dir, 'lists')
- autoload :Locks, File.join(dir, 'locks')
- autoload :Sets, File.join(dir, 'sets')
- autoload :SortedSets, File.join(dir, 'sorted_sets')
- autoload :Values, File.join(dir, 'values')
- autoload :Hashes, File.join(dir, 'hashes')
+ autoload :Counters, 'redis/objects/counters'
+ autoload :Lists, 'redis/objects/lists'
+ autoload :Locks, 'redis/objects/locks'
+ autoload :Sets, 'redis/objects/sets'
+ autoload :SortedSets, 'redis/objects/sorted_sets'
+ autoload :Values, 'redis/objects/values'
+ autoload :Hashes, 'redis/objects/hashes'
class NotConnected < StandardError; end
class NilObjectId < StandardError; end
class << self
- def redis=(conn) @redis = conn end
+ def redis=(conn)
+ @redis = conn
+ end
def redis
- @redis ||= $redis || Redis.current || raise(NotConnected, "Redis::Objects.redis not set to a Redis.new connection")
+ @redis || $redis || Redis.current ||
+ raise(NotConnected, "Redis::Objects.redis not set to a Redis.new connection")
end
def included(klass)
# Core (this file)
- klass.instance_variable_set('@redis', @redis)
+ klass.instance_variable_set('@redis', nil)
klass.instance_variable_set('@redis_objects', {})
klass.send :include, InstanceMethods
klass.extend ClassMethods
-
+
# Pull in each object type
klass.send :include, Redis::Objects::Counters
klass.send :include, Redis::Objects::Lists
klass.send :include, Redis::Objects::Locks
klass.send :include, Redis::Objects::Sets
@@ -73,12 +85,20 @@
end
end
# Class methods that appear in your class when you include Redis::Objects.
module ClassMethods
- attr_writer :redis
- attr_accessor :redis_objects
- def redis() @redis ||= Objects.redis end
+ # Enable per-class connections (eg, User and Post can use diff redis-server)
+ attr_writer :redis
+ def redis
+ @redis || Objects.redis
+ end
+
+ # Internal list of objects
+ attr_writer :redis_objects
+ def redis_objects
+ @redis_objects ||= {}
+ end
# Set the Redis redis_prefix to use. Defaults to model_name
def redis_prefix=(redis_prefix) @redis_prefix = redis_prefix end
def redis_prefix(klass = self) #:nodoc:
@redis_prefix ||= klass.name.to_s.