Python面试题总结(8)--操作类

这篇博客总结了Python面试中关于数据库操作的问题,包括计算文件中大写字母数量、数据库三范式、分布式锁的概念及实现,特别是Redis分布式锁的原理与实现。还涉及了Python连接MongoDB和Redis的代码示例。
摘要由CSDN通过智能技术生成

1. 请写一个 Python 逻辑,计算一个文件中的大写字母数量

答:读取‘A.txt’中的大写字母数量
在这里插入图片描述

with open('A.txt') as f:
    """计算一个文件中的大写字母数量
    """
    count = 0
    for i in f.read():
        if i.isupper():
            count += 1
print(count)

运行结果为4。

2.了解数据库的三范式么?

答: 经过研究和对使用中问题的总结,对于设计数据库提出了一些规范,这些规范被称为范式,一般需要遵守下面3范式即可::

第一范式(1NF):强调的是列的原子性,即列不能够再分成其他几列。

第二范式(2NF):首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。

第三范式(3NF):首先是 2NF,另外非主键列必须直接依赖于主键,不能存在传递依赖。即不能存在:非主键列 A 依赖于非主键列 B,非主键列 B 依赖于主键的情况。

数据库三大范式和五大约束

3.了解分布式锁么

答: 分布式锁是控制分布式系统之间的同步访问共享资源的一种方式。 对于分布式锁的目标,我们必须首先明确三点:

任何一个时间点必须只能够有一个客户端拥有锁。
不能够有死锁,也就是最终客户端都能够获得锁,尽管可能会经历失败。
错误容忍性要好,只要有大部分的Redis实例存活,客户端就应该能够获得锁。

分布式锁的条件:
互斥性:分布式锁需要保证在不同节点的不同线程的互斥
可重入性:同一个节点上的同一个线程如果获取了锁之后,能够再次获取这个锁。
锁超时:支持超时释放锁,防止死锁 高效,
高可用:加锁和解锁需要高效,同时也需要保证高可用防止分布式锁失效,可以增加降级。
支持阻塞和非阻塞:可以实现超时获取失败,tryLock(long timeOut) 支持公平锁和非公平锁
分布式锁的实现方案 1、数据库实现(乐观锁) 2、基于zookeeper的实现 3、基于Redis的实现(推荐)
添加链接描述
添加链接描述

4.用 Python 实现一个 Reids 的分布式锁的功能

答:REDIS分布式锁实现的方式:SETNX + GETSET,NX是Not eXists的缩写,如SETNX命令就应该理解为:SET if Not eXists。 多个进程执行以下Redis命令:

SETNX lock.foo <current Unix time + lock timeout + 1>
如果 SETNX 返回1,说明该进程获得锁,SETNX将键 lock.foo 的值设置为锁的超时时间(当前时间 + 锁的有效时间)。 如果 SETNX 返回0,说明其他进程已经获得了锁,进程不能进入临界区。进程可以在一个循环中不断地尝试 SETNX 操作,以获得锁。


//锁定的方法-伪代码
publicbooleanlock(){
   
    connection.setAutoCommit(false)
          for(){
   
          result =select* from user where id = 100 for update;
          if(result){
   //结果不为空,
               //则说明获取到了锁
               return true; 
                 }//没有获取到锁,继续获取
                 sleep(1000); 
               }
               return false;
            }
            //释放锁-伪代码
    connection.commit();

import time
import redis
from conf.config import REDIS_HOST, REDIS_PORT, REDIS_PASSWORD
 
class RedisLock:
    def __init__(self):
        self.conn = redis.Redis(host=REDIS_HOST, port=REDIS_PORT, password=REDIS_PASSWORD, db=1)
        self
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值