


How can an http request return the absolute number of the current request under high concurrency?
For example, my first access request returned json: {"n": 1}
My 100th access request returned json: {"n": 100}
The traditional method of writing to the database and then checking the database to return the results seems not guaranteed when the concurrency is large. What should I do? This should be the most simplified question
Reply content:
For example, my first access request returned json: {"n": 1}
My 100th access request returned json: {"n": 100}
The traditional method of writing to the database and then checking the database to return the results seems not guaranteed when the concurrency is large. What should I do? This should be the most simplified question
The simplest way is to build a mysql table with an auto-incremented primary key of id, then insert a record for each request, and then read the record. The id read out is the value you want.
Then you can easily handle high-concurrency scenarios based on the id value. For example, [Instant Kill] can use the rule that the id is less than 300 and divisible by 6 to consider the instant kill successful; [Lottery] can use the rule that the id is less than 300 and divisible by 6; [Lottery] can use the rule that the id is divisible by 100 (one hundredth) Probability) as winning etc.
If you implement it yourself, it is nothing more than a single-threaded infinite loop processing socket requests and maintaining a global variable. It is not as convenient and reliable as using ready-made mysql.
If it is java
, a global AtomicLong
can meet your needs, getAndIncrement
atomic operation, plus volatile
modification, if it is other languages, it will be similar
Using setnx(id) in redis, a single thread guarantees increment by 1 each time, and it is also an in-memory database, so it is super fast.
Read operation: use cache
Write operation: asynchronous writing using queue
In pure Java, the counter object can be made into a singleton, and all requests to the calculator can be intercepted by filter
and incremented by 1 (synchronization is required). I don’t know what you mean by database, {n : 100}
, n
is taken from the database?
In fact, what you want to do is a permanent memory queue, which is queued and processed according to the request.
On a single machine, you can try reading and writing SQLite from /dev/shm on the Linux memory file system (tmpfs).
Reading files does not require going through the network , and there is no need to implement memory resident, lock, auto-increment and unique constraints by yourself.
<code><?php header('Content-Type: text/plain; charset=utf-8'); // sudo mkdir -m 777 /dev/shm/app $file = '/dev/shm/app/data.db3'; $ddl = " BEGIN; CREATE TABLE IF NOT EXISTS queue ( id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER ); CREATE UNIQUE INDEX IF NOT EXISTS queue_user_id_idx ON queue(user_id); COMMIT; "; if(!file_exists($file)) { //多核下多进程并发时可能都会进入到这个判断分支,所以DDL中要用IF NOT EXISTS $db = new PDO('sqlite:'.$file); $db->exec($ddl); // pdo_sqlite 的 query 和 prepare 不支持一次执行多条SQL语句 } else { $db = new PDO('sqlite:'.$file); } $stmt = $db->prepare('INSERT INTO queue(user_id) VALUES(?)'); $stmt->execute(array(time())); //time()换成你的用户ID echo $stmt->rowCount()."\n"; //查询中受影响(改动)的行数,插入失败时为0 echo $db->lastInsertId(); //插入的自增ID,插入失败时为0 // php -S 127.0.0.1:8080 -t /home/eechen/www >/dev/null 2>&1 & // ab -c100 -n1000 http://127.0.0.1:8080/</code>
The simplest way is to use redis's zset for auto-increment, which is efficient and simple. If you are using a single machine, you can also consider using atomiclong (it will become invalid after a shutdown and restart)

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



MySQL is suitable for beginners because it is simple to install, powerful and easy to manage data. 1. Simple installation and configuration, suitable for a variety of operating systems. 2. Support basic operations such as creating databases and tables, inserting, querying, updating and deleting data. 3. Provide advanced functions such as JOIN operations and subqueries. 4. Performance can be improved through indexing, query optimization and table partitioning. 5. Support backup, recovery and security measures to ensure data security and consistency.

Navicat itself does not store the database password, and can only retrieve the encrypted password. Solution: 1. Check the password manager; 2. Check Navicat's "Remember Password" function; 3. Reset the database password; 4. Contact the database administrator.

View the MySQL database with the following command: Connect to the server: mysql -u Username -p Password Run SHOW DATABASES; Command to get all existing databases Select database: USE database name; View table: SHOW TABLES; View table structure: DESCRIBE table name; View data: SELECT * FROM table name;

Navicat for MariaDB cannot view the database password directly because the password is stored in encrypted form. To ensure the database security, there are three ways to reset your password: reset your password through Navicat and set a complex password. View the configuration file (not recommended, high risk). Use system command line tools (not recommended, you need to be proficient in command line tools).

Create a database using Navicat Premium: Connect to the database server and enter the connection parameters. Right-click on the server and select Create Database. Enter the name of the new database and the specified character set and collation. Connect to the new database and create the table in the Object Browser. Right-click on the table and select Insert Data to insert the data.

Copying a table in MySQL requires creating new tables, inserting data, setting foreign keys, copying indexes, triggers, stored procedures, and functions. The specific steps include: creating a new table with the same structure. Insert data from the original table into a new table. Set the same foreign key constraint (if the original table has one). Create the same index. Create the same trigger (if the original table has one). Create the same stored procedure or function (if the original table is used).

Common reasons why Navicat cannot connect to the database and its solutions: 1. Check the server's running status; 2. Check the connection information; 3. Adjust the firewall settings; 4. Configure remote access; 5. Troubleshoot network problems; 6. Check permissions; 7. Ensure version compatibility; 8. Troubleshoot other possibilities.

You can create a new MySQL connection in Navicat by following the steps: Open the application and select New Connection (Ctrl N). Select "MySQL" as the connection type. Enter the hostname/IP address, port, username, and password. (Optional) Configure advanced options. Save the connection and enter the connection name.
