Once PR1158 <https://github.com/web2py/web2py/pull/1158>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 <https://github.com/web2py/web2py/issues/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
cache.redis = RedisCache('10.0.0.10:5555',debug=True)

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 
<http://github.com/niphlod/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. 

-- 
Resources:
- http://web2py.com
- http://web2py.com/book (Documentation)
- http://github.com/web2py/web2py (Source code)
- https://code.google.com/p/web2py/issues/list (Report Issues)
--- 
You received this message because you are subscribed to the Google Groups 
"web2py-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to