django中开启事务,GEO地理位置信息、持久化方案、主从复制原理和方案、哨兵高可用、集群原理及搭建、缓存优化、mysql主从、django做读写分离

发布时间 2023-04-20 18:33:11作者: 缀月

django中开启事务

# django中如何开启事务
     全局开启:每个http请求都在一个事务中
        DATABASES = {
         'default': {
             'ENGINE': 'django.db.backends.mysql',
             'NAME': 'lqz',
             'HOST': '127.0.0.1',
             'PORT': '3306',
             'USER': 'lqz',
             'PASSWORD': 'lqz123',
              #全局开启事务,绑定的是http请求响应整个过程
             'ATOMIC_REQUESTS': True, 
         }
    }
     每个视图函数开启
        from django.db import transaction
        @transaction.atomic
        def seckill(request):
            
            
      局部开启
        from django.db import transaction
        def seckill(request):
            with transaction.atomic():
                pass
            return HttpResponse('秒杀成功')
    
     保存点,回滚保存点Savepoint
         设置回滚点:sid = transaction.savepoint()
         提交回滚点:transaction.savepoint_commit(sid)       transaction.commit()
         回滚到回滚点:transaction.savepoint_rollback(sid)   transaction.rollback()
      事务提交后回调函数
       transaction.on_commit(send_email)

GEO地理位置信息

# GEO(地理信息定位):存储经纬度,计算两地距离,范围等
     根据经纬度---》确定具体地址的---》高德开放api---》返回具体地址
    
    
# redis 可以存储经纬度,存储后可以做运算,
    比如:两个经纬度之间距离 (直线距离)
    比如:统计某个经纬度范围内有哪些好友,餐馆

    
    
# 经纬度如何获取
     跟后端没关系:只需要存
     app,有定位功能
     网页,集成了高德地图,定位功能
    
    
# redis存储
geoadd key  经度  纬度 名字
# 添加
geoadd cities:locations 116.28 39.55 beijing
# 查看位置信息
geopos cities:locations beijing #获取北京地理信息

#计算两个点距离
geodist cities:locations beijing tianjin km

# 计算附近的 xx
georadiusbymember cities:locations beijing 150 km

# 5大数据类型的 : 有序集合

持久化方案

# 什么是持久化
redis的所有数据保存在内存中,把内存中的数据同步到硬盘上这个过程称之为持久化

# 持久化的实现方式
    快照:某时某刻数据的一个完整备份(有可能丢数据)
        mysql的Dump
        redis的RDB
    写日志:任何操作记录日志,要恢复数据,只要把日志重新走一遍即可
       mysql的 Binlog
       Redis的 AOF

RDB

# rdb 持久化配置方式
    方式一:通过命令---》同步操作
         save:生成rdb持久化文件
    方式二:异步持久化---》不会阻塞住其他命令的执行
        bgsave
     方式三:配置文件配置--》这个条件触发,就执行bgsave
        save   900        1
        save   300        10
        save   60         10000
        dbfilename dump.rdb
        dir "/root/redis-6.2.9/data"
        如果60s中改变了1w条数据,自动生成rdb
        如果300s中改变了10条数据,自动生成rdb
        如果900s中改变了1条数据,自动生成rdb

AOF方案

# 可能会数据丢失---》可以使用aof方案

# aof是什么:客户端每写入一条命令,都记录一条日志,放到日志文件中,如果出现宕机,可以将数据完全恢复

# AOF的三种策略
	日志不是直接写到硬盘上,而是先放在缓冲区,缓冲区根据一些策略,写到硬盘上
    always:redis–》写命令刷新的缓冲区—》每条命令fsync到硬盘—》AOF文件
    everysec(默认值):redis——》写命令刷新的缓冲区—》每秒把缓冲区fsync到硬盘–》AOF文件
    no:redis——》写命令刷新的缓冲区—》操作系统决定,缓冲区fsync到硬盘–》AOF文件

        
# AOF重写
    随着命令的逐步写入,并发量的变大, AOF文件会越来越大,通过AOF重写来解决该问题
    本质就是把过期的,无用的,重复的,可以优化的命令,来优化,这样可以减少磁盘占用量,加速恢复速度
    
    
# AOF重写配置参数
    auto-aof-rewrite-min-size:500m
    auto-aof-rewrite-percentage:增长率
        
        
# aof持久化的配置
appendonly yes #将该选项设置为yes,打开
appendfilename "appendonly.aof" #文件保存的名字
appendfsync everysec #采用第二种策略
no-appendfsync-on-rewrite yes #在aof重写的时候,是否要做aof的append操作,因为aof重写消耗性能,磁盘消耗,正常aof写磁盘有一定的冲突,这段期间的数据,允许丢失

混合持久化

# 可以同时开启aof和rdb,他们是相互不影响的

# redis 4.x以后,出现了混合持久化,其实就是aof+rdb,解决恢复速度问题

#开启了混合持久化,AOF在重写时,不再是单纯将内存数据转换为RESP命令写入AOF文件,而是将重写这一刻之前的内存做RDB快照处理

# 配置参数:必须先开启AOF
# 开启 aof
appendonly yes
# 开启 aof复写
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
# 开启 混合持久化
aof-use-rdb-preamble yes  # 这正有用的是这句话
# 关闭 rdb
save ""

# aof重写可以使用配置文件触发,也可以手动触发:bgrewriteaof