当前位置:网站首页>Data consistency between redis and database
Data consistency between redis and database
2022-07-02 13:58:00 【Cicada bathes in the wind】
「 This is my participation 2022 For the first time, the third challenge is 26 God , Check out the activity details :2022 For the first time, it's a challenge 」.
It is used as a cache when data is read more and written less , Probably Redis Use the most common scenario . When using Redis As a cache , This is the general process .
- If the cache is in Redis in , Cache hit , Then directly return the data
- If Redis There is no corresponding cache in , You need to query the database directly , Then deposit Redis, Finally, return the data to
Usually , We will set a for a cache key value , And aim at key Value to set an expiration time , If the queried data corresponds to key Out of date , Then query the database directly , And store the queried data in Redis, Then reset the expiration time , Finally, return the data to , The pseudocode is as follows :
/** * Get user details according to user name * @author official account 【 Cicadas bathe in the wind 】 */
public User getUserInfo(String userName) {
User user = redisCache.getName("user:" + userName);
if (user != null) {
return user;
}
// Search directly from the database
user = selectUserByUserName(userName);
// Write data to Redis, And set expiration time
redisCache.set("user:" + userName, user, 30000);
// Return the data
return user;
}
Copy code Consistency issues
however , stay Redis Of key If the value does not expire , The user has modified his personal information , At this time, we need to operate the database data , Also operate Redis data . Now we have two choices :
- Do it first Redis The data of , Then operate the data of the database
- First operate the data of the database , Then operate Redis The data of
As for which method to choose , Ideally , Either the two operations succeed at the same time , Or fail at the same time , Otherwise, it will appear Redis Inconsistent with the database data .
Unfortunately , At present, there is no framework to guarantee Redis Complete consistency between the data of and the data of the database . We can only take certain measures to reduce the probability of data inconsistency according to the scenario and the code we need to pay , Achieve a compromise between consistency and performance .
Now let's discuss about Redis Some schemes for consistency with database quality inspection data .
Options
Delete cache or update cache ?
When the database data changes ,Redis The data also needs to be operated accordingly , So this 「 operation 」 What is to use 「 to update 」 Or use it 「 Delete 」 Well ?
「 to update 」 Call Redis Of set Method , Replace old value with new value ;「 Delete 」 Directly delete the original cache , Re read the database the next time you query , Then update Redis.
Conclusion : Direct use is recommended 「 Delete 」 operation .
Because use 「 to update 」 operation , You will face two choices
Update cache first , Update the database- Update the database first , Update the cache again
The first 1 Don't think about it , Let's talk about it 「 Update the database first , Update the cache again 」 This program .
If the thread 1 And thread 2 Update at the same time , But the execution order of each thread is shown in the figure above , This will lead to inconsistent data , Therefore, from this point of view, we recommend deleting the cache directly .
Besides , Recommended 「 Delete cache 」 There are two other reasons .
- If there are more scenarios of writing database than reading data , Using this scheme will cause the cache to be written frequently , Waste performance ;
- If the cache needs a series of complex calculations to get , So every time you write to the database , It is also a waste of performance to calculate the written cache again .
After clarifying this problem , There are only two choices in front of us :
- Update the database first , Delete the cache
- So let's delete the cache , Update the database
Update the database first , Delete the cache
There may be two exceptions in this way
- Database update failed , At this time, you can catch exceptions through the program , Direct return , No longer delete cache , So there will be no data inconsistency
- Update database successful , Delete cache failed . Cause the database to be the latest data , What's in the cache is old data , Data inconsistency
The first 2 What should we do in this case ? We have two ways : Failure to retry and Asynchronous update .
Failure to retry
If delete cache fails , We can catch this exception , Delete the key Send to message queue . Create a consumer consumption , Try to delete this... Again key, Until the deletion is successful .
There is a drawback to this approach , First, it will invade the business code , Secondly, message queue is introduced , It increases the uncertainty of the system .
Update cache asynchronously
Because when you update the database, you go to binlog Write log in , So we can start a monitor binlog Changing services ( For example, use Ali's canal Open source components ), Then delete it on the client side key The operation of . If the deletion fails , And send it to the message queue .
summary
All in all , In case of cache deletion failure , Our approach is to constantly retry the deletion operation , Until success . Whether it's retry or asynchronous deletion , It's all about ultimate consistency .
So let's delete the cache , Update the database
There may be two exceptions in this way
- Delete cache failed , At this time, you can catch exceptions through the program , Direct return , Do not continue to update the database , So there will be no data inconsistency
- Delete cache succeeded , Database update failed . Data inconsistency may occur in multithreading
At this time ,Redis Old data stored in , The value of the database is new data , Leading to data inconsistency . Now we can use Delay double delete The strategy of , That is, after updating the database data , Delete the cache again .
In pseudocode, that's :
/** * Delay double delete * @author official account 【 Cicadas bathe in the wind 】 */
public void update(String key, Object data) {
// First delete the cache
redisCache.delKey(key);
// Update the database
db.updateData(data);
// Sleep for a while , The time depends on the time taken to read the data
Thread.sleep(500);
// Delete cache again
redisCache.delKey(key);
}
Copy code Finally, leave two questions for readers :
- Why?
Update cache first , Update the databaseIt won't work ? - Why should the method of delayed double deletion sleep for a period of time ?
Welcome to comment area .
Recommended reading
official account 「 Cicadas bathe in the wind 」, You are welcome to pay attention to exchanges
边栏推荐
- Skillfully use SSH to get through the Internet restrictions
- Selenium installing selenium in pycharm
- P1042 [NOIP2003 普及组] 乒乓球
- Stone merging Board [interval DP] (ordinary stone Merging & Ring Stone merging)
- How to use SAP's metadata framework (MDF) to build custom business rules?
- Fundamentals of machine learning (II) -- division of training set and test set
- SystemServer进程
- Common options of tcpdump command: Three
- mysql ---- Oracle中的rownum转换成MySQL
- Android kotlin fragment technology point
猜你喜欢

Bridge of undirected graph

当贝投影4K激光投影X3 Pro获得一致好评:万元投影仪首选

Selenium, element operation and browser operation methods

基于ssm+jsp框架实现的学生选课信息管理系统【源码+数据库】

Why is the default of switch followed by break?

你的 Sleep 服务会梦到服务网格外的 bookinfo 吗

题解:《你的飞碟在这儿》、《哥德巴赫猜想》

OpenFOAM:lduMatrix&lduAddressing

Unity skframework framework (XII), score scoring module

Memory management 01 - link script
随机推荐
你知道Oracle的数据文件大小有上限么?
[document tree, setting] font becomes smaller
Android kotlin fragment technology point
selenium 在pycharm中安装selenium
[youcans' image processing learning course] general contents
Will your sleep service dream of the extra bookinfo on the service network
In 2021, the global revenue of structural bolts was about $796.4 million, and it is expected to reach $1097.6 million in 2028
mysql ---- Oracle中的rownum转换成MySQL
Qt-制作一个简单的计算器-实现四则运算-将结果以对话框的形式弹出来
[Blue Bridge Cup] children's worship circle
Partner cloud form strong upgrade! Pro version, more extraordinary!
路由(二)
Selenium installing selenium in pycharm
科技的成就(二十七)
【模板】最长公共子序列 (【DP or 贪心】板子)
Development skills of rxjs observable custom operator
(POJ - 1984) navigation nightare (weighted and search set)
默认插槽,具名插槽,作用域插槽
Design of non main lamp: how to make intelligent lighting more "intelligent"?
Pointer from entry to advanced (1)