redis setnx 原子性_redis 原子性 测试探究

因为redis是单线程的,很多时候以为所有的操作都是原子性的,也就是一组事务里的操作要么全部执行,要么全部不执行,不存在中间状态。

今天出于好奇,测试了下多进程下数据的准确性,发现并不是那样的。 如下。

import time
import threading
import redis


class BaseThread(threading.Thread):

    def __init__(self, thread_id, func, **kwargs):
        threading.Thread.__init__(self)
        self.threadID = thread_id
        self.func = func
        self.kwargs = kwargs

    def run(self):
        print("start:" + self.name)
        self.func(**self.kwargs)
        print("end:" + self.name)


def redis_atom():
    """

    :return:
    """

    redis_client = redis.Redis(host="127.0.0.1",
                               port=6379,
                               password="111111",
                               db=2,
                               decode_responses=True, )

    _key = "demo3"
    for x in range(1000):
        a = int(redis_client.get(_key) or 0)
        redis_client.set(_key, a + 1)
        time.sleep(0.1)


def run():
    """
    run
    :return:
    """

    # t = Tree()
    #
    # for x in range(10):
    #     t.add(x)
    #
    # t.view()

    th = []

    for x in range(3):
        _thread_temp = BaseThread(x, redis_atom)
        th.append(_thread_temp)

    for x in th:
        x.start()

    for x in th:
        x.join()


if __name__ == '__main__':
    """ __main__ """

    run()

以上是多线程写入redis , 没用incr. 结果是每次的数值都不相同。并非所有的操作都是原子性,逻辑上顺序的。

再次记录一下。本来是想看看分布式锁的实现,突然想起测试这个。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值