前言:
积累知识没有尽头!
ORM操作:
在ORM操作数据库的时候应当尽量减少对数据库的查询,在一次查询中把数据都拿到,这样可以大幅提高运行效率
- only(只查询指定字段)
- defer(查询不包括指定字段的字段)
- seleted_related(联合查询关联表) 连表操作,相当于主动做join
- prefetch_related(两次单表查询) 多次单表操作,先查询想要的数据,然后构造条件,如:id=[1,2,3],再次查询其他表根据id做条件。
-通过ORM写偏原生SQL:
- extra
Entry.objects.extra(select={'new_id': "select col from sometable where othercol > %s"}, select_params=(1,))
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
Entry.objects.extra(select={'new_id': "select id from tb where id > %s"}, select_params=(1,), order_by=['-nid'])
- raw
#执行原生SQL
models.UserInfo.objects.raw('select * from userinfo')
#如果SQL是其他表时,必须将名字设置为当前UserInfo对象的主键列名
models.UserInfo.objects.raw('select id as nid from其他表')
#为原生SQL设置参数
models.UserInfo.objects.raw('select id as nid from userinfo where nid>%s', params=[12,])
name_map = {'first': 'first_name', 'last': 'last_name', 'bd': 'birth_date', 'pk': 'id'}
Person.objects.raw('SELECT * FROM some_other_table', translations=name_map)
-原生SQL
from django.db import connection, connections
cursor = connection.cursor() # cursor = connections['default'].cursor()
cursor.execute("""SELECT * from auth_user where id = %s""", [1])
row = cursor.fetchone() # fetchall()/fetchmany(..)
PS:选择数据库
queryset = models.Course.objects.using('default').all()
示例:
class Depart(models.Model):5个部门
title = models.CharField(...)
class User(models.Model):10个用户
name = models.CharField(...)
email = models.CharField(...)
dp = models.FK(Depart)
1.以前的你:11次单表查询
result = User.objects.all()
for itemin result:
print(item.name,item.dp.title)
2. seleted_related,主动做连表查询(1次链表)
result = User.objects.all().seleted_related('dp')
for itemin result:
print(item.name,item.dp.title)
问题:如果链表多,性能越来越差。
3. prefetch_related:2次单表查询
# select * from user ;
# 通过python代码获取:dp_id = [1,2]
# select * from depart where id in dp_id
result = User.objects.all().prefetch_related('dp')
for itemin result:
print(item.name,item.dp.title)
赠送:
数据量比较大,不会使用FK,允许出现数据冗余。
Django的rest framework组件怎么做到的频率控制呢?
-访问频率控制原理:
匿名:
1.1.1.1:[时间,时间,时间,时间,]
登录:
user:[时间,时间,时间,时间,]
默认将访问记录放在缓存中:redis/memcached
不能做到完全的控制,应当对资源做限制比如需要登陆,再对账户加以辨别,,比如账户需要绑定唯一的标志(手机号等)来防止小号出现
rest framework组件的序列化
from rest_framework.serializersimport Serializer
class XX(Serializer):
pass
ser =XX(queryset,many=True)# ListSerializer对象
ser =XX(obj,many=False)# XX对象
当设定many=False时实际上不是用ListSerializer对象实例化
类的构造函数:
类的构造函数是 __init__
但是在实例化的时候在执行 __init__ 之前会先执行 __new__ 函数
git的使用:
git是一个用于帮助用户实现版本控制的软件。
常用命令:
git init 初始化git
git status 查看当前文件夹的状态。
git add文件名 对指定文件进行版本控制
git add . 对指定文件夹下的所有文件及子目录进行版本控制
git config --global user.name "John Doe"
git config --global user.email [email protected]
git commit -m'详细的描述信息' 创建提交记录(版本)
git log 查看低版本的记录
git reflog 查看所有版本的记录
git reset --hard 提交记录(版本号) 回到某个版本
git checkout 切换分支
方式一:
git stash 将当前工作区所有修改过的内容存储到“某个地方”,将工作区还原到当前版本未修改过的状态
git stash list 查看“某个地方”存储的所有记录
git stash clear 清空“某个地方”
git stash pop 将第一个记录从“某个地方”重新拿到工作区(可能有冲突)
git stash apply 编号, 将指定编号记录从“某个地方”重新拿到工作区(可能有冲突)
git stash drop 编号,删除指定编号的记录
git stash作用,帮助我们暂时存储已经开发一些功能的代码,继续做其他事情,做完之后,再回来继续开发
方式二:
git branch 查看所有分支
git branch dev 建立名为dev的分支
git branch bug 建立bug的分支
git branch -d bug 删除bug分支
git checkout dev 切换到dev分支
git merge bug 将bug分支合并到dev分支
将代码同步到线上
git remote add origin ......... 将连接修改名称
git push origin dev 提交dev到origin
git clone https://github.com/WuPeiqi/dbhot.git 从网址下载代码
git pull origin dev 下载origin代码中的dev
git fetch origin dev 下载dev
git merge origin/dev 改: git rebase origin/dev 建立dev
git pull origin master 下载master代码
git fetch origin master
git merge origin/master
版本控制
git tag -a v1.0 -m'版本介绍' 本地创建Tag
git show v1.0 查看
git tags -n查看本地Tag
git tag -l'v1.4.2.*' 查看本地Tag,模糊匹配
git tag -d v1.0 删除Tag
git push origin :refs/tags/v0.2 更新远程tag
git checkout v.10 切换tag
git fetch origin tag V1.2
git push origin --tags 提交指定版本
git pull origin --tags 下载指定版本
git clone -b v1.0 https://github.com/WuPeiqi/dbhot.git 克隆指定版本
redis
mysql是一个软件,帮助开发者对一台机器的硬盘进行操作。
redis是一个软件,帮助开发者对一台机器的内存进行操作。redis是单线程单进程的。
关键字:
缓存,优先去redis中获取,如果没有就是数据库。
安装:
- redis软件
- yum install redis
redis-server /etc/redis.conf
-
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar xzf redis-3.0.6.tar.gz
cd redis-3.0.6
make
/src/redis-server redis.conf
默认端口:6379
配置文件:
bind 0.0.0.0
port 6379
requirepass dskjfsdf
- python连接redis的模块
pip3 install redis
基本使用:
a.
import redis
# 创建连接
# conn = redis.Redis(host='47.94.172.250',port=6379,password='luffy1234')
# conn.set('x1','wanghuaqiang',ex=5)
# val = conn.get('x1')
# print(val)
b.
#连接池
使用连接池
本质,维护一个已经和服务端连接成功的socket。
以后再次发送数据时,直接获取一个socket,直接send数据。
# import redis
# pool = redis.ConnectionPool(host='10.211.55.4', port=6379,password='luffy1234',max_connections=1000)
# conn = redis.Redis(connection_pool=pool)
#
# conn.set('foo', 'Bar')
连接池注意:连接池只创建一次
Django redis
特点:
a. 持久化
RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中。
AOF 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。
b. 单进程、单线程
c. 5大数据类型
redis={
k1:'123', 字符串
k2:[1,2,3,4,4,2,1], 列表
k3:{1,2,3,4}, 集合
k4:{name:123,age:666}, 字典
k5:{('alex',60),('eva-j',80),('rt',70),},有序集合
}
使用字典:
- 基本操作
- 慎重使用hgetall, 优先使用hscan_iter
- 计数器
注意事项:redis操作时,只有第一层value支持:list,dict ....
使用列表:
-左右操作 l,r
-阻塞 b
-通过yield创建一个生成器完成一点一点获取(通过字典操作的源码来的灵感)
队列:先进先出
栈:后进先出
可以做事务
应用(django):
1. 自定义使用redis
2. 使用第三方组件
pip3 install django-redis
配置:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100}
# "PASSWORD": "密码",
}
}
}
使用:
import redis
from django.shortcuts import render,HttpResponse
from django_redis import get_redis_connection
def index(request):
conn = get_redis_connection("default")
return HttpResponse('设置成功')
def order(request):
conn = get_redis_connection("back")
return HttpResponse('获取成功')
高级使用:
1. 全站缓存 写到settings
'django.middleware.cache.UpdateCacheMiddleware',
# 其他中间件...
'django.middleware.cache.FetchFromCacheMiddleware',
2. 单视图 @cache_page(60 * 15)
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
3. 局部页面 模板语言的{% load cache %}
{% cache 5000 缓存key %}
缓存内容
{% endcache %}
补充:rest framework框架访问频率限制推荐放到redis/memecached