Skip to content
This repository has been archived by the owner on Apr 26, 2019. It is now read-only.

howaboutwe/redness

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

71 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Redness

Simple data structures for Redis-backed Ruby applications

Description

Redness extends the redis-rb client library with useful data structures. It provides higher-level access to Redis than the client library while remaining more composable and minimal than a full-featured ORM.

Installation

gem install redness

Playing Around (read the tests for more examples)

  require 'redness'

  Red.redis = Redis.new

  # RedJSON represents a collection of data as JSON
  RedJSON.set("foo", {:foo => ["bar", "baz", "buzz"]})
  #=> "OK"
  RedJSON.get("foo")
  #=> {"foo"=>["bar", "baz", "buzz"]}

  # RedList represents a standard list of data
  RedList.get("users:1:viewers")
  #=> [1]
  RedList.add("users:1:viewers", 2)
  #=> 2
  RedList.get("users:1:viewers")
  #=> [2, 1]
  RedList.add("users:1:viewers", 2)
  #=> 2
  RedList.get("users:1:viewers")
  #=> [2, 2, 1]

  # RedCappedList is a list of data capped at a max length
  capped_list = RedCappedList.new("somekey", 2)
  capped_list.get
  #=> []
  capped_list.add(1)
  #=> "OK"
  capped_list.get
  #=> [1]
  capped_list.add(2)
  #=> "OK"
  capped_list.get
  #=> [2, 1]
  capped_list.add(3)
  #=> "OK"
  capped_list.get
  #=> [3, 2]

  # RedSet represents a unique set of data
  RedSet.add("myset", 1)
  #=> [1]
  RedSet.add("myset", 1)
  #=> nil
  RedSet.get("myset")
  #=> [1]
  RedSet.add("myset", 2)
  RedSet.get("myset")
  #=> [2, 1]
  RedSet.remove("myset", 2)
  #=> true
  RedSet.get("myset")
  #=> [1]
  # You can specify upper and lower bounds...
  RedSet.get("myset").each { |i| RedSet.remove("myset", i) }
  RedSet.get("myset")
  #=> []
  1.upto(10).each { |i| RedSet.add("myset", i) }
  RedSet.get("myset")
  #=> [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
  RedSet.get("myset", lower: 2, upper: 7)
  #=> [8, 7, 6, 5, 4, 3]
  RedSet.count("myset")
  #=> 10

  # RedHash represents a data collection as a Ruby hash
  red_hash = RedHash.new("test")
  red_hash[:mykey]
  #=> nil
  red_hash[:mykey] = "value"
  red_hash[:mykey]
  #=> "value"
  red_hash.all
  #=> {"mykey"=>"value"}
  red_hash.remove(:mykey)
  red_hash.all
  #=> {}

  # RedSetMulti stores a collection of RedSets
  RedSet.add("razzle", 1)
  RedSet.add("razzle", 2)

  RedSet.add("dazzle", 1)
  RedSet.add("dazzle", 2)
  RedSet.add("dazzle", 3)

  multi_set = RedSetMulti.new(RedSet.get("razzle"), RedSet.get("dazzle"))
  multi_set.get
  #=> [[2, 1], [3, 2, 1]]

  # RedSetUnion represents the union of two or more RedSets
  RedSet.add("key1", 1)
  RedSet.add("key1", 2)
  RedSet.add("key1", 3)

  RedSet.add("key2", 1)
  RedSet.add("key2", 6)
  RedSet.add("key2", 7)

  RedSet.add("key3", 9)

  union = RedSetUnion.new("key1", "key2", "key3")
  union.get
  #=> [7,3,6,2,9,1]

  # TimedRedSet is a RedSet with timestamped data
  TimedRedSet.add("somekey", 1)
  TimedRedSet.add("somekey", 2)

  TimedRedSet.get("somekey")
  #=> [2, 1]

  TimedRedSet.get_with_timestamps("somekey")
  #=> [[2, 2012-05-04 14:29:57 -0400], [1, 2012-05-04 14:29:48 -0400]]
  
  TimedRedSet.since("somekey", 5.minutes.ago, lower: 1, upper: 2)
  #=> [1]

  # RedExpire expires the collection with the
  # provided key in a given number of seconds
  RedList.new("somelist")
  RedList.add("somelist", 0)
  # => 1
  RedList.get("somelist")
  #=> [1]
  # Expire the 'somelist' RedList in 1 second
  RedExpire.set("somelist", 1.second)
  #=> true
  RedList.get("somelist")
  #=> []

TODO

  • Ensure all CRUD methods exist for all classes
  • Unify interfaces and method names across all classes (and remove the singleton pattern wherever it is found)

Copyright

Copyright (c) 2012 HowAboutWe. See LICENSE.txt for further details.

About

Simple data structures for Redis-backed Ruby applications

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages