Project

redness

0.0
Repository is archived
No commit activity in last 3 years
No release in over 3 years
Helpful Ruby classes for improved Redis data structures
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
 Dependencies

Development

>= 0
>= 0

Runtime

>= 0
~> 3.0.0
 Project Readme

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.