Once
PR1158 gets merged web2py will have a preferred way to use redis. It's through the new gluon.contrib.redis_utils "RConn".
Some redis libraries are coming along and redis-py, while maintaining a solid "#1 position" among them, could be one day in #2.
Moreover, connection parameters passed to redis have been added and it's been almost impossible to keep web2py's modules that use redis in sync. It'd have meant to lock a particular release of redis-py to a particular release of web2py's contrib redis_* modules.
Seen that and
issue#958, a refactor was needed. Better late than ever, the refactor is here.
This bring BREAKING changes for the next version of web2py. Anyone using gluon.contrib.redis_cache and/or gluon.contrib.redis_session will need to alter app's code to match the new behaviour.
Basically now every module in web2py that uses redis needs (and should, for new modules you may want to contrib) to have a redis_conn parameter that takes a redis instance. That redis instance can be provided out of the box - tuned for the unique environment of web2py - with
from gluon.contrib.redis_utils import RConn
rconn = RConn()
now, RConn takes ALL parameters and passes them unchanged down the pipe directory to redis.StrictRedis .
This means that any parameter that was used to connect to redis for those modules isn't there anymore.
Specifically, if you had a redis instance available at 10.0.0.10 on port 5555, your instantiation of RedisCache was similar to
from gluon.contrib.redis_cache import RedisCache
from here on, it'll be instead
from gluon.contrib.redis_utils import RConn
from gluon.contrib.redis_cache import RedisCache
rconn = RConn(host='10.0.0.10', port=5555)
cache.redis = RedisCache(redis_conn=rconn,debug=True)
want to connect to redis through ssl (previously unavailable)? pass the relevant ssl, ssl_keyfile, etc etc etc to RConn.
You can also reuse the rconn object as if it was a redis.StrictRedis instance in your app's code. Everything will work fine. Just use a sane key prefix (all modules use "w2p") in order to avoid conflicts. redis_cache, redis_session and redis_scheduler (and your app) can use a single RConn instance without issues.
Was this only a refactor ? Nope!
There is also a new (not so shiny, 'cause - guilty as charged - I'm using it for 10 months in production now) redis-backed scheduler.
Of course it's experimental (as everything in contrib) but it's not untested (all
w2p_scheduler_tests passed).
This is one of the first modules completely coded on Windows (sigh). Linux has been tested too through w2p_scheduler_tests (still waiting for someone to come up with unittests that will run on our CI) but the production environment kicking for 10 months is WS2012R2 with redis 3.0 .
RScheduler is a slip-in of the factory scheduler, with the - usual - redis_conn parameter.
from gluon.contrib.redis_utils import RConn
from gluon.contrib.redis_scheduler import RScheduler
rconn = RConn()
mysched = RScheduler(db, ..., redis_conn=rconn)
This first release basically moves everything happening in the scheduler_worker table to redis, to alleviate locking and contention where it happens the most.
It'll probably enable usage patterns for who had problems in production with a high number of workers. It's also a lot snappier because with redis tasks gets from QUEUED to RUNNING without passing from ASSIGNED. Use it, test it, break it, fix it (or report bugs). Read the source code, improve it, move ideas around.... just crunch tasks...do whatever you want with it. Hope you'll find it as useful as I am.