高并发数据的重复写入问题

8 篇文章 0 订阅
4 篇文章 0 订阅

高并发数据的重复写入问题

  • 使用Redis的setnx来解决这个问题。setnx key value 若 value 存在 则返回 False.
    def db_op_thread_func(i, num_of_op):
        r = redis.Redis(host='redisHost', port=6379, db=0)
        conn = MySQLdb.connect(host="dbHost", port=3306, user="root", passwd="pass", db="blog")
        cursor = conn.cursor()
    
        for j in range(0, int(num_of_op)):
            nickname = 'User' + str(int(i % 10))
            lockkey = "lock"+nickname
    
            getsql = ("select ID from User  where Username = '%s'") % (nickname)
            cursor.execute(getsql)
            fetchData = cursor.fetchall()
    
            reply = r.setnx(lockkey, 1)
            if (reply == True):
                r.expire(lockkey, 30)
                RedisLock =  False
            else:
                RedisLock =  True
    
            if not fetchData  and RedisLock == False:
                sql = ("insert into User (Username)  values('%s')   ")%(nickname)
                cursor.execute(sql)
                id = int(conn.insert_id())
                print int(id)
                print "thread", i, ":", " num:", j
                conn.commit()
            else:
                print '已经有'
        conn.close()
    
  • 每当插入前设置 UserName 的一个 redis Lock ,expire 设置为30s ,这样就可以利用 setnx 的原子性 来实现分布式锁来保证数据唯一性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值