High Level Cache Tool.
Project description
High level key-value storage and cache tool.
Installation
pip install hilcat
Usage
Cache api is designed to determine a unique node by scope
and key
.
In some implements, scope
may be always None
and should be ignored, thus unique node determined only by key
.
Init by different backends
auto backend
create a cache based on redis
from hilcat import Cache
cache = Cache.from_uri('redis://localhost:1458')
create a cache based on sqlite
from hilcat import Cache
cache = Cache.from_uri('sqlite:///t.db')
in memory cache
from hilcat import MemoryCache
cache = MemoryCache()
file based cache
cache text content in file
from hilcat import SimpleTextFileCache
cache = SimpleTextFileCache()
redis
init from url
from hilcat import RedisCache
cache = RedisCache(url='redis://localhost:6379')
init from host
from hilcat import RedisCache
cache = RedisCache(host='localhost', port=6579)
elasticsearch
from hilcat import ElasticSearchCache
cache = ElasticSearchCache(hosts=['https://localhost:9200'])
sqlite
from hilcat import SqliteCache, SqliteScopeConfig
cache = SqliteCache(database=db_file, scopes=[
SqliteScopeConfig(scope='a', uniq_column='id', columns=['id', 'name', 'comment', 'count'],
column_types={'count': 'int'}),
SqliteScopeConfig(scope='b', uniq_column='eid', columns=['eid', 'name', 'comment', 'status'])
])
postgresql
from hilcat import PostgresqlCache, PostgresqlScopeConfig
cache = PostgresqlCache(database="postgresql://postgres:123@localhost:5432/hilcat_test", scopes=[
PostgresqlScopeConfig(scope='a', uniq_column='id', columns=['id', 'name', 'comment', 'count'],
column_types={'count': 'int'}),
# PostgresqlScopeConfig(scope='b', uniq_column='eid', columns=['eid', 'name', 'comment', 'status'])
])
mysql
from hilcat import MysqlCache, MysqlScopeConfig
cache = MysqlCache(connection=connection, scopes=[
MysqlScopeConfig(scope='a', uniq_column='id', columns=['id', 'name', 'comment', 'count'],
column_types={'id': 'varchar(50)', 'count': 'int'}),
MysqlScopeConfig(scope='b', uniq_column='eid', columns=['eid', 'name', 'comment', 'status'],
column_types={'eid': "int"})
])
cache api
Assume there is a cache named cache
.
exists(key, scope=None)
Test if a key exists in cache for certain scope.
fetch(key, default=None, scope=None)
If key not exists, return default value.
value = cache.fetch('one', 1, scope='a')
set(key, value, scope=None)
cache.set('one', 1, scope='a')
update(key, value, scope=None, **kwargs)
Same as method set
, but return value may diff in some implements.
get(key, func=None, scope=None)
If key exists, just return value stored in cache; else if key not exists, calculate value and store to cache, the return value.
value = cache.get('one', lambda: 1, scope='a')
pop(key, scope=None)
Delete value of given key for certain scope.
scopes()
Get all scopes in the cache.
May not supported for some implements.
keys(scope=None)
Get all keys for certain scope.
May not supported for some implements.
load(scopes=None)
Load scope data from persistence storage.
Some implements may have no persistence storage, thus this method do nothing.
backup(scopes=None)
Save scope data to persistence storage.
Some implements may have no persistence storage, thus this method do nothing.
Decorate a function
import collections
from hilcat import SqliteCache, SqliteScopeConfig
db_file = "decorator.db"
cache = SqliteCache(database=db_file, scopes=[
SqliteScopeConfig(scope='f1', uniq_column='x', columns=['y']),
SqliteScopeConfig(scope='f3', uniq_column='key', columns=['key', 'value'])
])
c1 = collections.Counter()
@cache(scope="f1")
def f1(x: int):
c1[x] += 1
return x + 1 + c1[x]
c2 = collections.Counter()
def f2(x: int):
c2[x] += 1
return x + 1 + c2[x]
def make_key(x: int, y: int):
return '-'.join(map(str, [x, y]))
c3 = collections.Counter()
@cache(scope="f3", make_key_func=make_key)
def f3(x: int, y: int):
c3[(x, y)] += 1
return {
"key": make_key(x, y),
"value": x + y + c3[(x, y)],
}
# with cache, same result
assert f1(1) == 3
assert f1(1) == 3
# without cache, different result
assert f2(1) == 3
assert f2(1) == 4
assert f3(1, 2) == {"key": "1-2", "value": 4}
assert f3(1, 2) == {"key": "1-2", "value": 4}
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
File details
Details for the file hilcat-1.2.3.tar.gz
.
File metadata
- Download URL: hilcat-1.2.3.tar.gz
- Upload date:
- Size: 19.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 2519c5c335a3c881bb6561081da83348ef3386023967fab2b8e79eab48cc018e |
|
MD5 | 5b5b0dd3eaa09f891915100af95c9aad |
|
BLAKE2b-256 | d0e270e63361e26bc613ae9c49931c5389b110f91feca3f6f25eae6bd7e8f4cf |
File details
Details for the file hilcat-1.2.3-py3-none-any.whl
.
File metadata
- Download URL: hilcat-1.2.3-py3-none-any.whl
- Upload date:
- Size: 22.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.0.0 CPython/3.12.3
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | f7664b4d2c9c6f1fec0081ba3e22569d0da152d74273b0d58aec7a7992c2e019 |
|
MD5 | 21096b69e5a63c668889be9db37c1321 |
|
BLAKE2b-256 | 02bc71d4067b42306c649df5014930ef9ba47d3c4c033cc40529466f38a2eb88 |