cf-LRU-cache 0.0.2
LRU Cache Distributed
License: MIT

## Ormuco Code Challenge

This project has been created only for demonstration purpose.
>
> ### The challenge
>
> At Ormuco, we want to optimize every bits of software we write. Your goal is to write a new library that can be integrated to the Ormuco stack. Dealing with network issues everyday, latency is our biggest problem. Thus, your challenge is to write a new Geo Distributed LRU (Least Recently Used) cache with time expiration. This library will be used extensively by many of our services so it needs to meet the following criteria:
> 1. Simplicity. Integration needs to be dead simple.
> 2. Resilient to network failures or crashes.
> 3. Near real time replication of data across Geolocation. Writes need to be in real time.
> 4. Data consistency across regions
> 5. Locality of reference, data should almost always be available from the closest region
> 6. Flexible Schema
> 7. Cache can expire 
>

### The Answer

source directory: `./cache`

>
> This feature is not finished yet, but the idea to implement is:
> 1. In each remote server create a local cache
> 2. Each independent cache will have other 2 optional roles at the same time; as server cache and as client cache
> 3. As server cache it will have the responsibility to synchronize all its client caches
> 4. As client cache it will have the responsibility to notify its server cache each time a change occurs
> 5. All this communication will be through sockets in independent threads each one
> 6. If the connection gets broken in any point the caches networks remaining will continue working as independent networks
> 7. If a server gets disconnected from the caches network, its cache will work locally without any problem
> 8. The developer in charge to deploy the system will have the responsibility to decide which server is a cache server or client or both
>

usage:

- Run `pip3 install cf_LRU_cache`

usage for a local cache only: 
```
from lru_cache.lru_cache import LRUCache

def load_callback(key):
    """This function has the responsibility to load the content 
       to store into the cache
    """
    return key

local_cache = LRUCache(
    load_callback=load_callback,
    maximum_capacity=5555,
    expiration_time=5555
)

# get data from the cache; it will call `load_callback` if the 
# value is not available
data_from_cache = local_cache.get('test_key')

# set data manually into the cache
data_from_cache = local_cache.set('test_key', 'test_value')

# More options are only documented into the source code
```

usage for a distributed cache: 
```
from lru_cache.lru_cache_distributed import LRUCacheDistributed

def load_callback(key):
    """This function has the responsibility to load the content 
       to store into the cache
    """
    return key

local_cache = LRUCacheDistributed(
    load_callback=load_callback,
    maximum_capacity=5555,
    expiration_time=5555,
    connection_timeout=5555,
    remote_address=('192.168.1.1', '5555'),  # to be a client
    local_address=('', '5555')  # to be a server
)

# get data from the cache; it will call `load_callback` if the 
# value is not available
data_from_cache = local_cache.get('test_key')

# set data manually into the cache
data_from_cache = local_cache.set('test_key', 'test_value')

# More options are only documented into the source code
```