草庐IT

redis分布式锁原子性设置超时问题

1.问题:  最近客服有报无法上报运动记录,通过日志查看是分布式锁等待超时所致。  redis出现一个分布式锁的TTL为-1,正常情况都会设置超时时间的。   2.分析:通过k8s发现sport服务在50几天内重启了40几次,机器上内存比较紧缺,暂时只能重启,占用内存高的问题也先不解决。看下之前加锁的代码:acquire_lock defacquire_lock(redis_client,lock_key,lock_value,expire=10,timeout=5):"""获取锁:paramredis_client:redis;连接:paramlock_key:lockkey:paramlo

redis分布式锁原子性设置超时问题

1.问题:  最近客服有报无法上报运动记录,通过日志查看是分布式锁等待超时所致。  redis出现一个分布式锁的TTL为-1,正常情况都会设置超时时间的。   2.分析:通过k8s发现sport服务在50几天内重启了40几次,机器上内存比较紧缺,暂时只能重启,占用内存高的问题也先不解决。看下之前加锁的代码:acquire_lock defacquire_lock(redis_client,lock_key,lock_value,expire=10,timeout=5):"""获取锁:paramredis_client:redis;连接:paramlock_key:lockkey:paramlo

redis(10)事务和锁机制

Redis事务定义Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis事务的主要作用就是串联多个命令防止别的命令插队。 Multi、Exec、discardRedis事务中有Multi、Exec和discard三个指令,在Redis中,从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。而组队的过程中可以通过discard来放弃组队 案列说明组队成功:我们输入multi进行组队,将setk1v1和setk2v2两条

redis(10)事务和锁机制

Redis事务定义Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。Redis事务的主要作用就是串联多个命令防止别的命令插队。 Multi、Exec、discardRedis事务中有Multi、Exec和discard三个指令,在Redis中,从输入Multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,直到输入Exec后,Redis会将之前的命令队列中的命令依次执行。而组队的过程中可以通过discard来放弃组队 案列说明组队成功:我们输入multi进行组队,将setk1v1和setk2v2两条

SqlServer 高并发的情况下,如何利用锁保证数据的稳定性

   sql的锁机制,是时刻贯彻在每一次的sql事务中的,为了理解更透彻,介绍锁之前,我们得先了解,锁是为了干什么!! 1、数据库异常情况    1.1先来聊聊数据可能发生个异常状况    1)脏读:读未提交,顾名思义,读到了不该读的东西,如:        事务B读到了事务A回滚的数据,就是脏读      2)不可重复读:读已提交,同个事务内,多次读取同个数据,却返回不同结果,偏向数据更新        事务B发生了不可重复读    3) 幻读:同个事务内,因其他事务插入或删除数据,导致读取到不同的数据量(本质和不可重复读相似)         事务B发生了幻读  1.2数据库用什么机制来处

SqlServer 高并发的情况下,如何利用锁保证数据的稳定性

   sql的锁机制,是时刻贯彻在每一次的sql事务中的,为了理解更透彻,介绍锁之前,我们得先了解,锁是为了干什么!! 1、数据库异常情况    1.1先来聊聊数据可能发生个异常状况    1)脏读:读未提交,顾名思义,读到了不该读的东西,如:        事务B读到了事务A回滚的数据,就是脏读      2)不可重复读:读已提交,同个事务内,多次读取同个数据,却返回不同结果,偏向数据更新        事务B发生了不可重复读    3) 幻读:同个事务内,因其他事务插入或删除数据,导致读取到不同的数据量(本质和不可重复读相似)         事务B发生了幻读  1.2数据库用什么机制来处

怎么使用硬件同步原语替代锁?

什么是硬件同步原语?硬件同步原语(AtomicHardwarePrimitives)是由计算机硬件提供的一组原子操作。我们常见的原语操作有CAS和FAA两种。CASCompareandSwap(CAS),字面意思是先比较,再计算。它的伪代码如下。>functioncas(p:pointertoint,old:int,new:int)returnsbool{if*p≠old{returnfalse}*p←newreturntrue}它的输入参数有三个:p:要修改的变量的指针old:旧值new:新值返回值是一个布尔值,标识是否赋值成功。FAAFetchandAdd(FAA),它的含义是先获取变量当

怎么正确使用锁?

锁的原理:任何时间都只能有一个线程持有锁,只有持有锁的线程才能访问被锁保护的资源。我们接下来看一下在锁的使用上有什么最佳实践。避免滥用锁如果能不用锁,就不用锁;如果你不确定是不是应该用锁,那也不要锁。使用锁后带来的代价:加锁和解锁过程都需要CPU时间的,这是一个性能的损失。使用锁还可能导致线程等待锁,等待锁过程中的线程是阻塞状态,过多的锁等待会显著降低程序的性能。如果对锁使用不当,很容易造成死锁,导致整个程序“卡死”,这是非常严重的问题。我们不可以看到一个共享数据,在没有搞清楚它在并发环境中是否会出现争用问题,就“为了保险,给它加个锁吧。”,千万不要有这种不负责任的想法,否则你将会付出惨痛的代

怎么使用硬件同步原语替代锁?

什么是硬件同步原语?硬件同步原语(AtomicHardwarePrimitives)是由计算机硬件提供的一组原子操作。我们常见的原语操作有CAS和FAA两种。CASCompareandSwap(CAS),字面意思是先比较,再计算。它的伪代码如下。>functioncas(p:pointertoint,old:int,new:int)returnsbool{if*p≠old{returnfalse}*p←newreturntrue}它的输入参数有三个:p:要修改的变量的指针old:旧值new:新值返回值是一个布尔值,标识是否赋值成功。FAAFetchandAdd(FAA),它的含义是先获取变量当

怎么正确使用锁?

锁的原理:任何时间都只能有一个线程持有锁,只有持有锁的线程才能访问被锁保护的资源。我们接下来看一下在锁的使用上有什么最佳实践。避免滥用锁如果能不用锁,就不用锁;如果你不确定是不是应该用锁,那也不要锁。使用锁后带来的代价:加锁和解锁过程都需要CPU时间的,这是一个性能的损失。使用锁还可能导致线程等待锁,等待锁过程中的线程是阻塞状态,过多的锁等待会显著降低程序的性能。如果对锁使用不当,很容易造成死锁,导致整个程序“卡死”,这是非常严重的问题。我们不可以看到一个共享数据,在没有搞清楚它在并发环境中是否会出现争用问题,就“为了保险,给它加个锁吧。”,千万不要有这种不负责任的想法,否则你将会付出惨痛的代