Home Database Redis A brief discussion on three methods of redis to implement real-time subscription push

A brief discussion on three methods of redis to implement real-time subscription push

Mar 25, 2021 am 11:49 AM
redis Push message Subscribe to news

How can 20w push users be completed concurrently in seconds? This article will introduce to you three methods for redis to implement real-time subscription push: MQ, traditional scheduled tasks, and Redis' SortSet queue. It has certain reference value. Friends in need can refer to it. I hope it will be helpful to everyone.

A brief discussion on three methods of redis to implement real-time subscription push

[Related recommendations: Redis Video Tutorial]

A while ago, we developed a project for the company’s coupon collection center. This project is based on Redis is implemented as a key technology.

Let’s talk about the coupon collection center project first. This project is similar to the coupon collection center of JD.com app. Of course, the picture is taken from JD.com, not the company’s. . .

A brief discussion on three methods of redis to implement real-time subscription push

There is a function called subscription push for receiving coupons.

What is the subscription push for coupon collection?

means that the user has subscribed to the push notification of the coupon, and the reminder information will be pushed to the user's app one minute before it can be claimed.

Originally, this subscription function was supposed to be implemented by the message center, but they said it could not be implemented in a short time. So I, the person in charge of coupons, did it -.-!. The specific plan is to reach the specific push time point. The coupon system calls the push interface of the message center to push the information out.

Let’s analyze the business scenario of this function. The company currently has 6000W registered users, so don’t ask who it is. . . For example, if there is a no-threshold discount coupon that offers an instant discount of 20 yuan when placing an order, more people will grab this coupon. We conservatively estimate it to be 10W, and it is hard to say if it is a million yuan. Our initial target is 200,000 people, so these 200,000 push messages will be pushed out in one minute! And one user can subscribe to multiple coupons. So we know that there are two outstanding difficulties with this subscription function:

  • Effectiveness of push: If the push is slow, users will complain that they have not been notified in time and missed the opportunity to start grabbing.

  • The volume of the push is large: a popular coupon that everyone wants to grab!

However, the volume of push will affect the effectiveness of push. This is really a headache!

Then let us solve the problems one by one!

Issues with the effectiveness of push: When a user subscribes to a coupon collection reminder in the coupon collection center, a user's subscription reminder record will be generated in the background, which records the time point at which it was given to the user. Send push messages. So the question becomes how the system can quickly select which records to push in real time!

Option 1:

Delayed delivery of MQ. Although MQ supports delayed delivery of messages, the scale is too large, 1s 5s 10s 30s 1m, and it cannot be used for precise time point delivery! And if the user cancels the subscription after executing the subscription, the operation of deleting the MQ message sent is a bit cumbersome and difficult to implement in a short time! And users can cancel and then subscribe, which again involves the problem of deduplication. Therefore, MQ’s plan is rejected.

Option 2:

Traditional scheduled tasks. This is relatively simple. To use a scheduled task, load the user's subscription reminder records in the db and select the records that can currently be pushed. But there is a saying that goes well: Any design that is divorced from actual business is a rogue. Let's analyze whether traditional scheduled tasks are suitable for our business!

Can it support multiple machines running at the same time? Generally not, the same It can only be run alone at all times.

Storage data source

It is usually mysql or other traditional database, and it is a single table storage
Frequency Supports seconds, minutes, hours and days, generally not too fast

To sum up, we know that general traditional scheduled tasks have the following shortcomings:

1. Performance bottleneck. Only one machine is processing it, which is unable to cope with the large amount of data!

2. Poor effectiveness. The frequency of scheduled tasks cannot be too high. If it is too high, it will put a lot of pressure on the business database!

3. Single point of failure.

If the running machine hangs up, then the entire business will be unavailable -. - This is a terrible thing! Therefore, traditional scheduled tasks are not suitable for this business. . . So are we at our wits’ end? Actually no! We just need to make a simple transformation of the traditional scheduled tasks! You can turn it into a scheduled task cluster that can run on multiple machines at the same time, and the effectiveness can be accurate to the second level, and reject single points of failure! This requires the help of our powerful redis.

Option 3:

Scheduled task cluster First we need to define the three problems that the scheduled task cluster needs to solve!

1. The effectiveness must be high

2. The throughput must be large

3. The service must be stable and there must be no single point of failure. The following is the architecture diagram of the entire scheduled task cluster. .

A brief discussion on three methods of redis to implement real-time subscription push

The architecture is very simple: we store the user's subscription push records in the sortedSet queue of the redis cluster, and use the reminder timestamp as the score value, and then in our personal Each business server starts a timer with a frequency of seconds. My setting is 1s. Then after load balancing, the user records to be pushed are obtained from a queue and pushed. Next we analyze the following architecture.​

1. Performance: excluding bandwidth and other factors, it is basically linearly related to the number of machines. The greater the number of machines, the greater the throughput. When the number of machines is small, the relative throughput decreases.​

2. Effectiveness: It has been improved to the second level, and the effect is acceptable.​

3. Single point of failure? nonexistent! Unless the redis cluster or all servers are down. . . .

Here is an analysis of why redis is used?

First, redis can be used as a high-performance storage db. Its performance is much better than MySQL, and it supports persistence and has good stability.

The second redis SortedSet queue naturally supports sorting based on time as a condition, which perfectly satisfies us in selecting the records to be pushed.

ok~ Now that the plan is available, how can we implement it within one day? Yes, it only took me one day from designing this plan to completing the basic coding. . . Because time is too late.

First we use user_id as the key, and then mod the queue number hash into the redis SortedSet queue. Why is this? Because if the user subscribes to two coupons at the same time and the push time is very close, the two pushes can be merged into one~, and the hash is relatively even. The following is a screenshot of part of the code:

A brief discussion on three methods of redis to implement real-time subscription push

Then we need to determine the number of queues. Generally speaking, we define as many queues as we have for processing servers. Because too few queues may cause queue competition, too many may result in records not being processed in a timely manner. However, the best practice is that the number of queues should be dynamically configurable, because the number of online cluster machines will often change.

We will add more machines during the big promotion, right? And as the business volume increases, the number of machines will also increase, right? So I borrowed Taobao's diamond to dynamically configure the number of queues.

A brief discussion on three methods of redis to implement real-time subscription push

How many records we take from the queue each time can also be dynamically configured

A brief discussion on three methods of redis to implement real-time subscription push

This way, we can configure it at any time The actual production situation adjusts the throughput of the entire cluster~. So our scheduled task cluster still has a feature that supports dynamic adjustment~. The last key component is load balancing. This is very important!

Because if this is not done well, it may cause multiple machines to compete to process a queue at the same time, affecting the efficiency of the entire cluster! When time was very tight, I used a simple and practical algorithm that uses redis to auto-increment the key and then mod the number of queues. This will largely ensure that no two machines will compete for a queue at the same time~.

A brief discussion on three methods of redis to implement real-time subscription push

For more programming-related knowledge, please visit: programmingvideo! !

The above is the detailed content of A brief discussion on three methods of redis to implement real-time subscription push. For more information, please follow other related articles on the PHP Chinese website!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

How to build the redis cluster mode How to build the redis cluster mode Apr 10, 2025 pm 10:15 PM

Redis cluster mode deploys Redis instances to multiple servers through sharding, improving scalability and availability. The construction steps are as follows: Create odd Redis instances with different ports; Create 3 sentinel instances, monitor Redis instances and failover; configure sentinel configuration files, add monitoring Redis instance information and failover settings; configure Redis instance configuration files, enable cluster mode and specify the cluster information file path; create nodes.conf file, containing information of each Redis instance; start the cluster, execute the create command to create a cluster and specify the number of replicas; log in to the cluster to execute the CLUSTER INFO command to verify the cluster status; make

How to clear redis data How to clear redis data Apr 10, 2025 pm 10:06 PM

How to clear Redis data: Use the FLUSHALL command to clear all key values. Use the FLUSHDB command to clear the key value of the currently selected database. Use SELECT to switch databases, and then use FLUSHDB to clear multiple databases. Use the DEL command to delete a specific key. Use the redis-cli tool to clear the data.

How to use the redis command How to use the redis command Apr 10, 2025 pm 08:45 PM

Using the Redis directive requires the following steps: Open the Redis client. Enter the command (verb key value). Provides the required parameters (varies from instruction to instruction). Press Enter to execute the command. Redis returns a response indicating the result of the operation (usually OK or -ERR).

How to read redis queue How to read redis queue Apr 10, 2025 pm 10:12 PM

To read a queue from Redis, you need to get the queue name, read the elements using the LPOP command, and process the empty queue. The specific steps are as follows: Get the queue name: name it with the prefix of "queue:" such as "queue:my-queue". Use the LPOP command: Eject the element from the head of the queue and return its value, such as LPOP queue:my-queue. Processing empty queues: If the queue is empty, LPOP returns nil, and you can check whether the queue exists before reading the element.

How to use redis lock How to use redis lock Apr 10, 2025 pm 08:39 PM

Using Redis to lock operations requires obtaining the lock through the SETNX command, and then using the EXPIRE command to set the expiration time. The specific steps are: (1) Use the SETNX command to try to set a key-value pair; (2) Use the EXPIRE command to set the expiration time for the lock; (3) Use the DEL command to delete the lock when the lock is no longer needed.

How to read the source code of redis How to read the source code of redis Apr 10, 2025 pm 08:27 PM

The best way to understand Redis source code is to go step by step: get familiar with the basics of Redis. Select a specific module or function as the starting point. Start with the entry point of the module or function and view the code line by line. View the code through the function call chain. Be familiar with the underlying data structures used by Redis. Identify the algorithm used by Redis.

How to solve data loss with redis How to solve data loss with redis Apr 10, 2025 pm 08:24 PM

Redis data loss causes include memory failures, power outages, human errors, and hardware failures. The solutions are: 1. Store data to disk with RDB or AOF persistence; 2. Copy to multiple servers for high availability; 3. HA with Redis Sentinel or Redis Cluster; 4. Create snapshots to back up data; 5. Implement best practices such as persistence, replication, snapshots, monitoring, and security measures.

How to use the redis command line How to use the redis command line Apr 10, 2025 pm 10:18 PM

Use the Redis command line tool (redis-cli) to manage and operate Redis through the following steps: Connect to the server, specify the address and port. Send commands to the server using the command name and parameters. Use the HELP command to view help information for a specific command. Use the QUIT command to exit the command line tool.

See all articles