redis数据库python代码

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值