Meaning, they don't have to be distributed. I'm thinking about using memcached or redis for that. Probably the latter one. What I'm concerned about is "we've got to free some memory, so we'll delete this key/value before it expired" thing. But I'm open to other suggestions as well.
How to implement non-distributed locks which expire?
525 views Asked by x-yuri At
1
There are 1 answers
Related Questions in CONCURRENCY
- Unexpected inter-thread happens-before relationships from relaxed memory ordering
- Multiple Processes, Multiple Processors, Single Priority Queue - Java Thread-Safe and Concurrency -
- Efficiently processing many small elements of a collection concurrently in Java
- Zig Concurrency Vs Erlang Concurrency, is Zig less efficient than Erlang?
- Two Update statements on a row are running simultaneously with no locking in MYSQL
- How to Identify Specific Transaction Anomalies in a Given Schedule?
- How can I improve concurrent message processing with Google Task Queue?
- Why does the following program printf "thread 1 exists" twice in WSL2?
- ModelState.IsValid is false when its Data Model Concurrency Token is non nullable
- .NET A second operation was started on this context instance before a previous operation completed
- Can someone tell me what's wrong with mi Task.await?
- I am a beginner. More than problems, I have ideas I share my code ;D. NO RULES
- Understanding Potential Deadlock in Resource Pool Implementation Described in "Go in Action"
- Why are pre-allocated stacks expensive, given 64-bit virtual memory?
- Concurrency issues with server-sent events in Python
Related Questions in REDIS
- How to Socket.IO Multithreading on a Raspberry Pi?
- How to get the session ID returned by cookie with spring-session-data-redis
- Cannot serialize (Spring Boot)
- JEDIS/REDIS 'ON' Keyword or broken query?
- Quart_Sessions Redis deletes keys and create backups instead
- Docker builds redis, mounts the host network and uses 192.168.*.* to access the redis server and is denied
- Need a script to fetch the redis latency values over 20 seconds and store the results in a file
- Service in Docker Compose not connecting to Redis container in docker, Failed to connect to any host resolved for DNS name
- Install redis vector database on GCP in a GKE cluster
- how to avoid while loop while waiting for future complete?
- Is it possible to append the data in Redis command
- Not able to inject RedisCache/SyncCache/StatefulRedisConnection beans in micronaut 4.2.1 version
- RedisConnectionFailureException intermittently
- using redis timeseries in aredes error =>Error handling publish event: [ErrorReply: ERR TSDB: invalid value]
- HttpResponseMessage caching using redis
Related Questions in LOCKING
- The problem of "fine-grained locks and two-phase locking algorithm"
- Two Update statements on a row are running simultaneously with no locking in MYSQL
- When does shared and exclusive locks are acquired and released in a MySql transactions?
- SQL Server opportunistic locking
- Choosing the right hints during select for update in SQL Server
- Locking PDF after filling out text field
- Using dask.distributed with rioxarray rio.to_raster results in `ValueError: Lock is not yet acquired`
- Oracle 19c. REF Partitioning. Start redefinition Holds TM lock on parent table in 4 mode (when insert data into interim table)
- How to avoid LFS lock conflicts after merging master into feature branch?
- Maatwebsite excel global transaction problems
- How to implement read and write locking for a MongoDB collection?
- How to synchronize a python dictionary across a flask app and a background thread
- SQL Server SELECT WITH (NOLOCK) causing exclusive lock in tempdb
- Lock Acquisition Order in MYSQL
- Why is this giving me an IllegalMonitorStateException when all I'm doing is locking and then awaiting a condition?
Related Questions in MEMCACHED
- How can I properly delete a cache key on a Ruby on Rails project using memcached on multiple nodes?
- Cannot clear APCu Cache from Console, it's shared in the Webserver memory and not accessible from the CLI
- How do I update memcache php extension
- Memcached: How to remove all the keys
- Memcached lost items before expiration
- Once data is cache , make it available for other microservice
- pods connectivity chatbotexternal and mongodb
- How to connect my Nodejs Lambda to a Serverless Elasticache running memcached distribution
- Large number of rejected connections in memcached using django
- unable to retrieve data from Memcached cluster consistently
- Unable to connect to Elasticache serverless memcached from Lambda within same VPC
- Memcached does not work on local machine | Docker
- Memcache - some keys are getting deleted before expiration
- Tomcat session does not persist for multiple tomcat pods with the Memcached session manager
- Failure in Xmemcached CRAM-MD5 authentication
Related Questions in CONCURRENT-PROGRAMMING
- Setting a static variable in a run () method in java
- Does this uphold Mutual Exclusion: Concurrent programming?
- Why do I need to synchronize this variable
- Types of Concurrent processes
- ConcurrentHashMap putIfAbsent first time
- puzzled when using synchronized lock
- Python concurrent.futures calling same function twice
- Java ConcurrentHashMap actions atomicity
- Populating list separately using async and await
- in java concurrent programming, is need to using synchronized when read value?
- Execute multiple downloads and wait for all to complete
- Hoare Monitor implementation using semaphores?
- Which implementations of Condition do not require current thread to hold the lock?
- Finite State Process - Modelling Concurrency Issue?
- What's the difference between dovetailing and concurrency?
Popular Questions
- How do I undo the most recent local commits in Git?
- How can I remove a specific item from an array in JavaScript?
- How do I delete a Git branch locally and remotely?
- Find all files containing a specific text (string) on Linux?
- How do I revert a Git repository to a previous commit?
- How do I create an HTML button that acts like a link?
- How do I check out a remote Git branch?
- How do I force "git pull" to overwrite local files?
- How do I list all files of a directory?
- How to check whether a string contains a substring in JavaScript?
- How do I redirect to another webpage?
- How can I iterate over rows in a Pandas DataFrame?
- How do I convert a String to an int in Java?
- Does Python have a string 'contains' substring method?
- How do I check if a string contains a specific word?
Trending Questions
- UIImageView Frame Doesn't Reflect Constraints
- Is it possible to use adb commands to click on a view by finding its ID?
- How to create a new web character symbol recognizable by html/javascript?
- Why isn't my CSS3 animation smooth in Google Chrome (but very smooth on other browsers)?
- Heap Gives Page Fault
- Connect ffmpeg to Visual Studio 2008
- Both Object- and ValueAnimator jumps when Duration is set above API LvL 24
- How to avoid default initialization of objects in std::vector?
- second argument of the command line arguments in a format other than char** argv or char* argv[]
- How to improve efficiency of algorithm which generates next lexicographic permutation?
- Navigating to the another actvity app getting crash in android
- How to read the particular message format in android and store in sqlite database?
- Resetting inventory status after order is cancelled
- Efficiently compute powers of X in SSE/AVX
- Insert into an external database using ajax and php : POST 500 (Internal Server Error)
tl;dr Use ready-made solution, suggested by developers.
So, I decided not to use
memcachedfor the purpose. Since it's a caching server. I don't see a way to ensure that it doesn't delete my keys because it's out of memory. With,redisthat's not an issue as long asmaxmemory-policy = noeviction.There are 3 links I want to share with you. They are basically 3 ways, that I now know, to solve the issue. As long as you have
redis >= 2.6.0that is.redis >= 2.6.12
If you've got
redis >= 2.6.12, you're lucky and can simply usesetnxcommand with its new optionsexandnx:But we can't just delete the lock in the end, if we are to allow for critical section taking longer then we expected (
>= ttl). Consider the following situation:For that not to happen we are going to store current timestamp as a value of the lock. Then, knowing that Lua scripts are atomic (see Atomicity of scripts):
However, is it possible for two clients to have equal
nowvalues? For that all the above actions should happen within one second andttlmust be equal to0.Resulting code:
expire
The other solution I found here. You simply make the value expire with
expirecommand:So, only
acquire_lockfunction changes:getset
And the last one is described again in documentation. Marked with "left for historical reasons" note.
This time we store timestamp of the moment when the lock is to expire. We store it with
setnxcommand. If it succeeds, we've acquired the lock. Otherwise, either someone else's holding the lock, or the lock has expired. Be it the latter, we usegetsetto set new value and if the old value hasn't changed, we've acquired the lock:What makes me uncomfortable here is that we seem to have changed someone else's
expires_atvalue, don't we?On a side note, you can check which
redisis it that you're using this way:Some debugging functions: