Skip to content

Instantly share code, notes, and snippets.

@reusee
Created October 28, 2011 19:35
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save reusee/1323259 to your computer and use it in GitHub Desktop.
Save reusee/1323259 to your computer and use it in GitHub Desktop.
graph-like structure in redis
class Isred(Redis):
def node(self, serial = None):
return Node(self, serial)
class Node(dict):
def __init__(self, r, serial = None):
self.redis = r
self.serial = str(serial) if serial else r.incr('serial')
def __getitem__(self, key):
return self.redis.hget('attr-%s' % key, self.serial)
def __setitem__(self, key, value):
return self.redis.hset('attr-%s' % key, self.serial, value)
def delete(self):
raise Exception('you should extend the base class'
' to determine what attributes is to be deleted')
def link(self, target, self_type = '', target_type = ''):
self._link(self, self_type, target)
self._link(target, target_type, self)
def _link(self, node, link_type, target):
links_key = ('link-%s' % link_type) if link_type else 'link'
links = self.redis.hget(links_key, node.serial)
if links:
links = set(links.split())
links.add(str(target.serial))
else:
links = set([str(target.serial)])
self.redis.hset(links_key, node.serial, ' '.join(links))
def get_links(self, link_type = ''):
links_key = ('link-%s' % link_type) if link_type else 'link'
links = self.redis.hget(links_key, self.serial)
return links.split() if links else []
def is_link_to(self, target, link_type = ''):
return target.serial in self.get_links(link_type)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment