Created
October 13, 2012 09:11
-
-
Save HeartSaVioR/3883915 to your computer and use it in GitHub Desktop.
Redis in action, chapter 2
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python2.6 | |
import time | |
# | |
# token cookie | |
# | |
def check_token(conn, token): | |
return conn.hget('login:', token) | |
def update_token(conn, token, user, item=None): | |
timestamp = time.time() | |
conn.hset('login:', token, user) | |
conn.zadd('recent:', token, timestamp) | |
if item: | |
conn.zadd('viewed:' + token, item, timestamp) | |
conn.zremrangebyrank('viewed:' + token, 0, -26) | |
conn.zincrby('viewed:', item, -1) | |
LIMIT = 10000000 | |
def clean_sessions(conn): | |
#while not QUIT: | |
while True: | |
size = conn.zcard('recent:') | |
if size <= LIMIT: | |
time.sleep(1) | |
continue | |
end_index = min(size - LIMIT, 100) | |
sessions = conn.zrange('recent:', 0, end_index - 1) | |
vsessions = [] | |
for sess in sessions: | |
vsessions.append('viewed:' + sess) | |
vsessions.append('cart:' + sess) | |
conn.delete(*vsessions) | |
conn.hdel('login:', *sessions) | |
conn.zrem('recent:', *sessions) | |
def add_to_cart(conn, session, item, count): | |
if count <= 0: | |
conn.hrem('cart:' + session, item) | |
else: | |
conn.hset('cart:' + session, item, count) | |
# | |
# page cache | |
# | |
def cache_request(conn, request, callback): | |
if not can_cache(conn, request): | |
return callback(request) | |
page_key = 'cache:' + hash_request(request) | |
content = conn.get(page_key) | |
if not content: | |
content = callback(request) | |
conn.setex(page_key, content, 600) | |
return content | |
# | |
# row cache | |
# | |
def schedule_row_cache(conn, rowid, delay): | |
conn.zadd('delay:', rowid, delay) | |
conn.zadd('schedule:', rowid, time.time()) | |
def cache_rows(conn): | |
#while not QUIT: | |
while True: | |
next = conn.zrange('schedule:', 0, 0, withscores=True) | |
if not next or next[0][1] > time.time(): | |
time.sleep(.05) | |
continue | |
rowid = next[0][0] | |
delay = conn.zscore('delay:', rowid) | |
if delay <= 0: | |
conn.zrem('delay:', rowid) | |
conn.zrem('schedule:', rowid) | |
conn.delete('inv:' + rowid) | |
continue | |
row = Inventory.get(rowid) | |
conn.zadd('schedule:', rowid, time.time() + delay) | |
conn.set('inv:' + rowid, json.dumps(row.to_dict())) | |
def rescale_viewed(conn): | |
#while not QUIT: | |
while True: | |
conn.zremrangebyrank('viewed:', 20000, -1) | |
conn.zinterstore('viewed:', {'viewed:', .5}) | |
time.sleep(300) | |
def can_cache(conn, request): | |
itemid = extract_item_id(request) | |
if not itemid or is_dynamic(request): | |
return False | |
rank = conn.zrank('viewed:', itemid) | |
return rank is not None and rank < 10000 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
hey there..i'm newbie to redis as well as into python.
I read first chapter from redis in action abut having trouble to understand the code given in python language.
So, Can you just help me to start over with redis-python?