Skip to content

Instantly share code, notes, and snippets.

@HeartSaVioR
Created October 13, 2012 09:11
Show Gist options
  • Save HeartSaVioR/3883915 to your computer and use it in GitHub Desktop.
Save HeartSaVioR/3883915 to your computer and use it in GitHub Desktop.
Redis in action, chapter 2
#!/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
@mjrulesamrat
Copy link

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?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment