redis.coffee

The addresses store API functions

exports.addresses =
  

add an address to the list

  add: (address, cb) =>
    key = "#{address.host}_#{address.port}"
    @redisClient.hset key, 'host', address.host, (res) =>
      @redisClient.hset key, 'port', address.port, (res) =>
        @redisClient.sadd "#{@namespace}_addresses", key, (err,data) =>
          res = if !err then 'success' else "error: #{err}"
          cb res

add an address from the list

  remove: (address, cb) =>
    key = "#{address.host}_#{address.port}"
    @redisClient.srem "#{@namespace}_addresses", key, (res) =>
      @redisClient.del key, (res) =>
        cb 'success'

get the list

  get: (cb) =>
    resultSet = []
    @redisClient.smembers "#{@namespace}_addresses", (err,members) =>
      if members.length > 0
        for member in members
          @redisClient.hgetall member, (err,hash) =>
            resultSet.push hash if hash?
            cb resultSet if members.indexOf(member) is members.length-1
      else
        cb resultSet

get or set the target Address

exports.targetAddress =
  

Get the current address

  get: (cb) =>
    @redisClient.hgetall "#{@namespace}_targetaddress", (err, ta) ->
     cb ta

Set the current address

  set: (value, cb) =>
    @redisClient.hset "#{@namespace}_targetaddress", 'host', value.host, (err, ta) =>
      @redisClient.hset "#{@namespace}_targetaddress", 'port', value.port, (err, ta) =>
        cb value    

the round robin target address index API

exports.targetAddressIndex =  
  

get the target address index

  get: (cb) =>
    @redisClient.get "#{@namespace}_targetaddressindex", (err, tai) ->
      cb tai

increase the target address index by 1

  increment: (cb) =>
    @redisClient.incr "#{@namespace}_targetaddressindex", (err, tai) ->
      cb 'success'

set the target address index to 0

  reset: (cb) =>
    @redisClient.set "#{@namespace}_targetaddressindex", 0, (err, tai) ->
      cb 'success'
  

the sticky sessions API

exports.stickySessions =
    

get all the sticky sessions, or just one

  get: (keyOrCb, cb=null) =>
    if cb is null
      resultSet = {}
      @redisClient.smembers "#{@namespace}_stickysessions", (err, ss) =>
        if ss.length is 0
          keyOrCb resultSet
        else
          for item in ss
            @redisClient.hgetall item, (err, hash) =>
              resultSet[item] = hash
              if ss.indexOf(item) is ss.length-1
                keyOrCb resultSet    
    else
      @redisClient.hgetall keyOrCb, (err, hash) =>
        hash = undefined if hash is null
        cb hash

set a sticky session by its key and value

  set: (key, value, response) =>
    @redisClient.hset key, 'host', value.host, (res) =>
      @redisClient.hset key, 'port', value.port, (res) =>
        @redisClient.sadd "#{@namespace}_stickysessions", key, (err,data) =>
          response 'success'
  

remove a sticky session

  delete: (key, cb) =>
    @redisClient.srem "#{@namespace}_stickysessions", key, (res) =>
      @redisClient.del key, (err, ss) =>
        cb 'success'