> If you just need to store data for a single user across requests, you can
> store it in the session (each user has a separate session). But if you need
> to store data from multiple users and then process it all together, you can
> store it in the cache: http://web2py.com/books/default/chapter/29/4#cache.
>
> Anthony
>
Thanks Anthony. The data come from multiple users in my case.
After looking at the caching mechanism provided by web2py, I have a rough
design in pseudo-code as below.
in controller:
user_data = cache.ram('user_data', lambda:dict(), time_expire=None)
# add the data from this user, this should also update the cached dict?
user_data[this_user_id] = submitted_data
if len(user_data) == some_pre_defined_number:
# get data out of the dictionary 'user_data' by user Ids
...
# process them and persist results to DB
...
# reset 'user_data' dict by removing it from cache
cache.ram('user_data', None)
The above implies that the 'if' check is made upon every request by
individual users, which is somewhat inefficient, but I am not sure if there
is other better way(s) to implement this logic within web2py. If so, please
enlighten me!
In addition, I have some specific questions regarding the cache mechanism
in web2py:
1. when exactly does an object expire in cache? My understanding is that,
as long as the 'time_expire' value of *the current request* is greater than
the gap between *the time of current request* and *the time at which the
requested object was last updated in cache*, then the object behaves as if
it never expires in cache. This is illustrated by an example in the book,
if I understand it correctly. Therefore, the only perceivable way (to me)
for an object to expire is to supply a 'time_expire' value in a request
that is smaller than the gap between the time of this request and the time
when the requested object was updated in cache. In other words, if I do:
something = cache.ram('something', lambda:'blah blah', time_expire=1)
effectively, 'something' never expires in cache until I call something like
the following after t seconds (with t > make_it_expire):
something = cache.ram('something', lambda:'blah blah',
time_expire=make_it_expire
)
2. An follow-up question is that, when an objects eventually expires in
cache, does it mean it is completely removed from the cache? i.e.
equivalent to:
cache.ram(key, None)
or something else happens?
3. The manual says that by setting 'time_expire = 0', it forces the cached
object to be refreshed. Am I correct in understanding this as the cached
object will be immediately set to whatever is supplied by the second
argument of the 'cache.ram' call? Thus 'refreshed' here means 'updated'.
Your thoughts and comments are much appreciated. Thanks!