django 实现读写分离

作者:神秘网友 发布时间:2021-02-23 17:20:19

django 实现读写分离

  • 主要目的:单个数据库进行读写操作频繁,降低速度,增加服务器读写数据库压力,为了解决这一问题,对数据库进行读写分离,将大大提升项目的性能。其基本原理是:
    • 让主数据库处理事务性的增删改查,而从数据库处理查询操作,当主数据库因一些事务性操作导致数据变更后,同步更新到其他读库。写库一个,读库可以有多个。采用日志同步的方式实现主从同步。
  1. 在Django的配置文件settings.py中,DATABASES中添加代码如下:

    DATABASES = {
        'default': {
            'ENGINE': 'django.db.backends.mysql',
            'HOST': '127.0.0.1',  # 主服务器的运行ip
            'PORT': 3306,   # 主服务器的运行port
            'USER': 'django',  # 主服务器的用户名
            'PASSWORD': 'django',  # 主服务器的密码
            'NAME': 'djangobase'   #  数据表名
        },
        'slave': {
            'ENGINE': 'django.db.backends.mysql', 
            'HOST': '127.0.0.1',
            'PORT': 8306,
            'USER': 'django_slave',
            'PASSWORD': 'django_slave',
            'NAME': 'djangobase_slave'
        }
    }  
    
  2. 在models.py创建完表后,进行数据库迁移

    python manage.py makemigrations  # 在migrations文件夹下生成记录
    python manage.py migrate --database default  # 默认可以不写参数
    python manage.py migrate --database slave  # 在从库再迁移一次,就可以在上面建立相同的表
    
  3. 创建数据库操作的路由分类

    • 使用sqllite
  • 使用mysql
  • 在项目的utils中创建db_router.py文件,并在该文件中定义一个db类,用来进行读写分离
#读写分离
class MasterSlaveDBRouter(object):
 
    def db_for_read(self, model, **hints):
        """读数据库"""
        return "slave"
 
    def db_for_write(self, model, **hints):
        """写数据库"""
        return "default"    #默认的库 读
 
    def allow_relation(self, obj1, obj2, **hints):
        """是否运行关联操作"""
        return True  

#一主多从  多个数据库读  一个数据库写
class Router:

    def db_for_write(self, model, **kwargs):
        return 'db1'

    def db_for_read(self, model, **kwargs):
        return random.choices['db2', 'db3', 'db4']
    
#分库分表
class Router:

    def db_for_write(self, model, **kwargs):
        app_name = model._meta.app_label
        if app_name == 'app01':
            return 'db1'
        elif app_name == 'app02':
            return 'db2'

    def db_for_read(self, model, **kwargs):
        app_name = model._meta.app_label
        if app_name == 'app01':
            return 'db1'
        elif app_name == 'app02':
            return 'db2'
  1. 配置读写分离路由

    • 在配置文件中增加
    #配置读写分离
    DATABASE_ROUTERS = ['项目名.utils.db_router.MasterSlaveDBRouter("自定义的类名称")']
    
  2. 还可以使用手动的方式进行读写分离

    • 进行orm操作的时候使用using操作对应数据库
    def write(request):
        models.User.objects.using('default').create(name='张三', pwd='123', phone=1234)
        return HttpResponse('写成功')
    
    
    def read(request):
        obj = models.User.objects.filter(id=1).using('db2').first()
        return HttpResponse('读成功')
    

django 实现读写分离 相关文章

  1. 安卓自动化测试--Momkey 自定义脚本实现自动化

    MonkeyScript MS 是官方提供的,除了像猴子一样随机乱点之外,还可以通过编写脚本的形式,完成一系列固定的操作。MS 提供一整套完善的 API 来进行支持,主要还是基于坐标点的操作,包含常用的:点击、长按、输入、等待等操作。 脚本用法 1、LaunchActivity(p

  2. 数据迁移时报错——django.db.migrations.exceptions.NodeNotFoundError: Migration apitest.0001_initial dependencies reference nonexistent parent node (product, 0001_initial)

    执行python manage.py makemigrations时出现以下错误 D:\autotestplatpython manage.py makemigrationsTraceback (most recent call last): File "manage.py", line 21, in module main() File "manage.py", line 17, in main execute_from_command_line(sys

  3. 如何实现一个圣杯布局

    什么是圣杯布局 圣杯布局是为了讨论「三栏液态布局」的实现,最早的完美实现是由 Matthew Levine 在 2006 年写的一篇文章 《In Search of the Holy Grail》 ,它主要讲述了网页中关于最佳圣杯的实现方法。 它有以下几点要求: 上部(header)和下部(footer)各

  4. springboot 如何使用自定义注解+aop实现全局日志持久化操作

    1.自定一个注解 package com.hc.manager.common.aop.annotation; import java.lang.annotation.*; /** * LogAnnotation * * @author summer.chou * @version V1.0 * @date 2020年3月18日 */ @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME

  5. AnnoViper -分布式锁服务端怎么实现

    1、Anno简介 Anno 是一个微服务框架引擎。 入门简单 、 安全 、 稳定 、 高可用 、 全平台可监控、依赖第三方框架少。 底层通讯RPC(Remote Procedure Call)采用稳定可靠经过无数成功项目验证过的跨语言的 thrift、 grpc 。自带服务注册发现健康检查(不依赖

  6. Django model中的 class Meta 详解

    Model 元数据就是 "不是一个字段的任何数据" -- 比如排序选项, admin 选项等等. 下面是所有可能用到的 Meta 选项. 没有一个选项是必需的. 是否添加 class Meta 到你的 model 完全是可选的. app_label app_label这个选项只在一种情况下使用,就是你的模型类不

  7. 30 行代码实现蚂蚁森林自动“偷”能量

    虽然我支付宝加了好多好友,平时有很多能量可以“偷”,但由于太懒,至今一棵树都没种成,所以心心念念把偷能量这事自动化。而且由于蚂蚁森林改版,连续偷能量的操作流程也简单了好多,于是乎我就实现了自动偷能量,效果如下, 完整视频戳这里(https://www.

  8. JavaGui入门---通过文本框和按钮监听实现简易加减计算器

    class Calc extends Frame{TextField num1,num2,num3;public void loadFrame() {/* * TextField num1=new TextField();TextField num2=new TextField();TextField num3=new TextField();因为num1已经在前面定义了变量num1被重载定义,会导致Exception in thr

  9. 方法相关知识点

    定义 方法是实现某个功能的语句块的集合。最好一个方法只完成一个功能。 attention:在一个类中定义一个方法时要定义static类型,否则会报错,检测不到这个方法。 public static void main(String[] args) { int a=run(3,4); } public static int run(int a,i

  10. 10 Django与Ajax

    内容预览: Ajax 文件上传 Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是“异步Javascript和XML”。即使用Javascript语言与服务器进行异步交互,传输的数据为XML(当然,传输的数据不只是XML,现在更多使用json数据)。 同步交互:客户端

每天更新java,php,javaScript,go,python,nodejs,vue,android,mysql等相关技术教程,教程由网友分享而来,欢迎大家分享IT技术教程到本站,帮助自己同时也帮助他人!

Copyright 2020, All Rights Reserved. Powered by 跳墙网(www.tqwba.com)|网站地图|关键词