01_command.py
import redis
# 1.连接到redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)
# 2.调用方法 key_list:[b'name',b'age',b'score']
key_list = r.keys('*')
for key in key_list:
print(key.decode())
print(r.type('teachers'))
# exists()返回值: 0 | 1
print(r.exists('spider:urls'))
# delete()
r.delete('teachers')
02_list.py
import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)
r.rpush('teachers','Wang','Guo','Tao','Lv','Qi')
# LINSERT teachers after Guo Xu
r.linsert('teachers','after','Guo','Xu')
# result: 6
print(r.llen('teachers'))
# lrange: [b'Wang','Guo','Xu','Tao','Lv','Qi']
print(r.lrange('teachers',0,-1))
print(r.rpop('teachers'))
# [b'Wang','Guo','Xu','Tao','Lv']
r.ltrim('teachers',0,4)
# brpop : 超时不会抛出异常,返回None
while True:
# result为元组: (b'teachers', b'Lv')
result = r.brpop('teachers',1)
if not result:
break
print(result)
r.delete('teachers')
03_list_queue.py
import redis
from multiprocessing import Process
import time
import random
class LianjiaSpider(object):
def __init__(self):
self.r = redis.Redis(
host='127.0.0.1',port=6379,db=0
)
# 生产者事件函数 - 生成100个URL,放到redis列表中
def product(self):
for i in range(1,101):
url = 'http://lianjia.com/pg{}'.format(i)
self.r.lpush('lianjia:urls',url)
time.sleep(random.randint(1,2))
# 消费者事件函数 - 获取URL,进行数据抓取
def consumer(self):
while True:
result = self.r.brpop('lianjia:urls',3)
if result:
print('正在抓取:',result[1].decode())
else:
break
# 入口函数
def run(self):
p1 = Process(target=self.product)
p2 = Process(target=self.consumer)
p1.start()
p2.start()
p1.join()
p2.join()
if __name__ == '__main__':
spider = LianjiaSpider()
spider.run()
01_bitmap.py
'''寻找活跃用户,>=100次为活跃用户'''
import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)
# 模拟4个用户,user001 - user004
# user001: 第1天和第50天登录
r.setbit('user001',0,1)
r.setbit('user001',49,1)
# user002: 第20天登录1次
r.setbit('user002',19,1)
# user003: 一年登录100次以上
for i in range(0,365,2):
r.setbit('user003',i,1)
# user004: 一年登录100次以上
for i in range(0,365,3):
r.setbit('user004',i,1)
user_list = r.keys('user*')
active_users = []
noactive_users = []
for user in user_list:
number = r.bitcount(user)
if number >= 100:
active_users.append((user,number))
else:
noactive_users.append((user,number))
print('活跃用户:',active_users)
print('非活跃用户:',noactive_users)
02_hash.py
import redis
r = redis.Redis(host='localhost',port=6379,db=0)
# 设置
r.hset('xiongba','name','niefeng')
# 更新
r.hset('xiongba','name','bujingyun')
# 获取
print(r.hget('xiongba','name'))
# HMSET : 多个field和value
user_dict = {
'gender' : 'M',
'wuqi': 'HaoJian'
}
r.hmset('xiongba',user_dict)
# HGETALL : 字典
print(r.hgetall('xiongba'))
# HKEYS : 列表
print(r.hkeys('xiongba'))
# HVALS : 列表
print(r.hvals('xiongba'))
# 删除field
r.hdel('xiongba','gender')
# 删除key
r.delete('xiongba')
03_redis+mysql+hash.py
import redis
import pymysql
# 1.先到redis中查询
# 2.redis中没有,到mysql中查询
# 3.再缓存到redis中一份,设置过期时间30秒
# 4.再查一遍
r = redis.Redis(host='localhost',port=6379,db=0)
db = pymysql.connect(
'localhost','root','123456','userdb',
charset='utf8'
)
cursor = db.cursor()
# 开始 - 用户点击查询个人信息
username = input('请输入用户名:')
# redis查询
result = r.hgetall(username)
if result:
print('redis:',result)
else:
# redis中没有,需要到mysql中查询
sel = 'select name,gender,wuqi from user ' \
'where name=%s'
cursor.execute(sel,[username])
# result: (('bujingyun','M','haojian'),)
result = cursor.fetchall()
if result:
print('mysql:',result)
# 缓存到redis一份
user_dict = {
'gender' : result[0][1],
'wuqi' : result[0][2]
}
r.hmset(username,user_dict)
# 设置过期时间
r.expire(username,30)
04_redis+mysql+update.py
import redis
import pymysql
# 1.先到mysql更新update更新数据
# 2.缓存到redis中
# 2种情况: (1)redis中之前没有缓存 - 缓存(所有字段)
# (2)redis中之前缓存过 - 直接更新字段
class Update(object):
def __init__(self):
self.db = pymysql.connect(
'localhost','root','123456','userdb',
charset='utf8'
)
self.cursor = self.db.cursor()
self.r = redis.Redis(
host='localhost',port=6379,db=0
)
# 更新mysql表记录
def update_mysql(self,wuqi,username):
upd = 'update user set wuqi=%s where name=%s'
try:
self.cursor.execute(upd,[wuqi,username])
self.db.commit()
return True
except Exception as e:
self.db.rollback()
print('Failed',e)
# 更新redis
def update_redis(self,username,wuqi):
result = self.r.hgetall(username)
# result非空: 更新wuqi字段
# result为空: 到mysql查询,然后再缓存
if result:
self.r.hset(username,'wuqi',wuqi)
else:
self.select_mysql(username)
def select_mysql(self,username):
sel = 'select name,gender,wuqi from user where name=%s'
self.cursor.execute(sel,[username])
result = self.cursor.fetchall()
# 同步到redis
user_dict = {
'gender':result[0][1],
'wuqi':result[0][2],
}
self.r.hmset(username,user_dict)
self.r.expire(username,30)
# 主函数
def main(self):
username = input('请输入用户名:')
wuqi = input('请输入新武器:')
if self.update_mysql(wuqi,username):
self.update_redis(username,wuqi)
else:
print('更新失败')
if __name__ == '__main__':
syn = Update()
syn.main()
05_set_weibo.py
import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)
r.sadd('user:1','qiaozhi','peiqi','danni')
r.sadd('user:2','qiaozhi','peiqi','lingyang')
r.sinterstore('interset','user:1','user:2')
result = r.smembers('interset')
r_set = set()
for res in result:
r_set.add(res.decode())
print(r_set)
print('共同关注人数:',r.scard('interset'))
05_set.py
import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)
r.sadd('shengdoushi','xingshi','zilong')
# 数据类型: 集合 {b'zilong', b'xingshi'}
# {'zilong','xingshi'}
result = r.smembers('shengdoushi')
# 创建空集合
r_set = set()
for res in result:
r_set.add(res.decode())
# print(r.spop('shengdoushi'))
r.sadd('shengdoushi2','xingshi','yadianna')
r.sinterstore('interset','shengdoushi','shengdoushi2')
print(r.smembers('interset'))
print('共同好友数:',r.scard('interset'))
01_music.py
import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)
# 1.在有序集合中添加几首歌曲,播放次数为1
r.zadd('ranking',{'song1':1,'song2':1,'song3':1})
r.zadd('ranking',{'song4':1,'song5':1,'song6':1})
r.zadd('ranking',{'song7':1,'song8':1,'song9':1})
# 2.播放部分歌曲
r.zincrby('ranking',30,'song1')
r.zincrby('ranking',50,'song6')
r.zincrby('ranking',80,'song8')
# 3.获取前3名
# result: [(b'song8', 81.0), (b'song6', 51.0), (b'song1', 31.0)]
result = r.zrevrange('ranking',0,2,withscores=True)
i = 1
for name in result:
print('第{}名:{} 播放次数:{}'.format(
i,name[0].decode(),int(name[1])
))
i += 1
project
models.py
from django.db import models
import random
# Create your models here.
# 表名 user_profile
# 库名 mywiki
def choice_sign():
s = ['I am very happy!', 'I am so happy!']
return random.choice(s)
class UserProfile(models.Model):
username = models.CharField(max_length=11, verbose_name='用户名', primary_key=True)
nickname =models.CharField(max_length=30,verbose_name='昵称')
email = models.EmailField()
password = models.CharField(max_length=32,verbose_name='密码')
sign = models.CharField(max_length=50,default=choice_sign, verbose_name='个人签名')
info = models.CharField(max_length=150, default='', verbose_name='个人描述')
created_time = models.DateTimeField(auto_now_add=True)
updated_time = models.DateTimeField(auto_now=True)
#image字段
#upload_to 存储文件夹 settings.py MEDIA_ROOT + upload_to值
avatar = models.ImageField(upload_to='avatar/', null=True)
#登录时间
login_time = models.DateTimeField(null=True)
# 添加score字段 - 测试分布式锁
score = models.IntegerField(verbose_name=u'分数',null=True,default=0)
class Meta:
db_table = 'user_profile'
pass
test_score.py
from threading import Thread
import random
import requests
# 功能: 随机向8000或8001发1个请求
def get_request():
url1 = 'http://127.0.0.1:8000/test_cors'
url2 = 'http://127.0.0.1:8001/test_cors'
url = random.choice([url1,url2])
# 发请求 - 在浏览器地址栏输入url地址,敲回车
requests.get(url)
t_list = []
for i in range(30):
t = Thread(target=get_request)
t_list.append(t)
t.start()
for t in t_list:
t.join()
views.py
from django.http import JsonResponse
from user.models import UserProfile
def test_cors(request):
# 对数据库中score字段进行+1操作
u = UserProfile.objects.get(username="guoxiaonao")
u.score += 1
u.save()
res = {'data':{},'code':200}
return JsonResponse(res)