Redis 基于实用主义,它有着非常广泛的应用场景,例如:消息队列,缓存,排行榜等等。我们已经学习了 Redis 的常用命令,接下来开始在应用中使用这些命令吧!
本实训通过四个典型的应用介绍 Redis 能做什么事情,并通过四个关卡检测你对 Redis 基本命令的掌握程度。
**
第1关:使用Redis管理登录令牌**
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import time
import redis
conn = redis.Redis()
# 核对令牌,并返回该令牌对应的用户 ID
def check_token(token):
# 请在下面完成要求的功能
#********* Begin *********#
return conn.hget('login', token)
#********* End *********#
# 更新令牌,同时存储令牌的创建时间
def update_token(token, user_id):
# 请在下面完成要求的功能
#********* Begin *********#
timestamp = time.time()
pipe = conn.pipeline()
pipe.hset('login', token, user_id)
pipe.zadd('recent:token', token, timestamp)
pipe.execute()
#********* End *********#
# 清理过期令牌
def clean_tokens():
# 请在下面完成要求的功能
#********* Begin *********#
one_week_ago_timestamp = time.time() - 86400
expired_tokens = conn.zrangebyscore('recent:token', 0, one_week_ago_timestamp)
conn.zremrangebyscore('recent:token', 0, one_week_ago_timestamp)
conn.hdel('login', *expired_tokens)
#********* End ********
**
第2关:使用Redis实现购物车**
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import redis
conn = redis.Redis()
# 添加商品
def add_item(name, price):
# 请在下面完成要求的功能
#********* Begin *********#
item_id = conn.incr('item_id')
item_info_key = 'item:' + str(item_id) + ':info'
conn.hmset(item_info_key, {
"name": name, "price": price})
conn.expire(item_info_key, 30 * 24 * 60 * 60)
return item_id
#********* End *********#
# 加入购物车
def add_to_cart(user_id, item, count):
# 请在下面完成要求的功能
#********* Begin *********#
if count > 0:
conn.hset('cart:' + user_id, item, count)
else:
conn.hrem('cart:' + user_id, item)
#********* End *********#
# 获取购物车详情
def get_cart_info(user_id):
# 请在下面完成要求的功能
#********* Begin *********#
return conn.hgetall('cart:' + user_id)
#********* End *********#
第三关:使用Redis做页面缓存
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import redis
conn = redis.Redis()
# 使用 Redis 做页面缓存
def cache_request(request_url):
# 请在下面完成要求的功能
#********* Begin *********#
page_key = 'cache:' + str(hash(request_url))
content = conn.get(page_key)
if not content:
content = "content for " + request_url
conn.setex(page_key, content, 600)
return content
#********* End *********#
第4关:使用Redis做数据缓存
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import time
import json
import redis
conn = redis.Redis()
# 将数据加入缓存队列
def add_cache_list(data_id, delay):
# 请在下面完成要求的功能
#********* Begin *********#
conn.zadd('cache:delay', data_id, delay)
conn.zadd('cache:list', data_id, time.time())
#********* End *********#
# 缓存数据
def cache_data():
# 请在下面完成要求的功能
#********* Begin *********#
next = conn.zrange('cache:list', 0, 0, withscores=True)
now = time.time()
if not next or next[0][1] > now:
time.sleep(0.1)
data_id = next[0][0]
delay = conn.zscore('cache:delay', data_id)
if delay <= 0:
conn.zrem('cache:delay', data_id)
conn.zrem('cache:list', data_id)
conn.delete('cache:data:' + data_id)
else:
data = {
'id': data_id, 'data': 'fake data'}
conn.zadd('cache:list', data_id, now + delay)
conn.set('cache:data:' + data_id, json.dumps(data))
#********* End *********#