ring icon indicating copy to clipboard operation
ring copied to clipboard

Best way to change backend on the fly

Open majorgilles opened this issue 5 years ago • 2 comments

Hello, sorry if this questions is a bit broad, but I'm looking for a way to not make ring be specifically tied to one precise backend, after the functions have been evaluated.

For example, I often need to dynamically switch from a dev environment to a staging or prod environment, and it would really be problematic if the cache was sharing values from all of those different environment.

One solution I have found is just to disable ring for non prod environments with my own decorator.

def redis_cache(expire: int, coder: str):
    def decorator_redis_cache(func):
        if get_current_stage() == Stage.PROD:
            client = get_redis_client()
            return ring.redis(client=client, expire=expire, coder=coder)(func)
        else:
            return func

    return decorator_redis_cache

but this is far from perfect.

I don't know if there would be a way to get the client dynamically inside ring via a function call...

Sorry if this seems a bit noobish.

majorgilles avatar Oct 24 '19 15:10 majorgilles

Hello,

For now, it is one of major missing feature of ring. I am working for that in #137 for now.

It is up to the complexity of your project, but in easy case when stage/prod is decided statically, this code worked for my projects

if get_current_stage() == stage.PROD:
    redis_cache = functools.partial(ring.redis, coder=coder)
else:
    redis_cache = functools.partial(ring.dict, coder=coder, default_action='execute')

If you are using python3.7+, passing ContextVar is also possible to switch only backend storage, but it doesn't help when you don't want to run function.

youknowone avatar Oct 24 '19 16:10 youknowone

Thanks for your answer, this is more static than I would like, but would still improve the situation. Thanks again.

majorgilles avatar Oct 24 '19 17:10 majorgilles