Это 5-й день моего участия в Gengwen Challenge.Подробности о событии смотрите:Обновить вызов
Эта статья участвует в "Java Theme Month - Java Development Practice", подробнее см.Ссылка на мероприятие
Статьи по Теме
Сводка боя Redis:Редис в действии
предисловие
- дела
①атомарностьАтомность. Транзакция - это неделимое рабочее устройство, и операции, включенные в транзакцию, либо делают, либо не делают этого.
②последовательность(последовательность). Транзакция должна перевести базу данных из одного согласованного состояния в другое. Непротиворечивость и атомарность тесно связаны.
③изоляция(изоляция). Выполнение транзакции не может быть нарушено другими транзакциями. То есть операции внутри транзакции и используемые данные изолированы от других параллельных транзакций, и одновременно выполняемые транзакции не могут мешать друг другу.
④Упорство(долговечность). Постоянство, также известное как постоянство, означает, что после фиксации транзакции ее изменения в данных в базе данных должны быть постоянными. Другие операции или сбои, которые следуют, не должны иметь никакого влияния на это.
Транзакции в Redis нет нет нетуровень изоляцииКонцепция чего-либо!
Единая императивная гарантия в RedisатомарностьДа, но транзакции не гарантируютсяатомарность!
- оптимистическая блокировка
① Когда в программе может быть параллелизм, необходимо обеспечить точность данных в случае параллелизма, чтобы гарантировать, что, когда текущий пользователь работает вместе с другими пользователями, полученные результаты будут такими же, как и полученные. когда он работает один.
② Отсутствие должного контроля параллелизма может привести к таким проблемам, как грязное чтение, фантомное чтение и неповторяющееся чтение.
Может быть достигнуто в Redisоптимистическая блокировкаиз!
1. Как Redis реализует транзакции?
① нормальное ведение дел
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379> set name dingyongjun #添加数据
QUEUED
127.0.0.1:6379> set age 26 #添加数据
QUEUED
127.0.0.1:6379> set high 172 #添加数据
QUEUED
127.0.0.1:6379> exec 执行事务
1) OK
2) OK
3) OK
127.0.0.1:6379> get name #获取数据成功,证明事务执行成功
"dingyongjun"
127.0.0.1:6379> get age
"26"
② Отказаться от бизнеса
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379> set name dingyongjun #添加数据
QUEUED
127.0.0.1:6379> set age 26 #添加数据
QUEUED
127.0.0.1:6379> discard #放弃事务
OK
127.0.0.1:6379> get name #不会执行事务里面的添加操作
(nil)
③Исключение во время компиляции, проблема с кодом или проблема с командой, все команды не будут выполнены
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379> set name dingyongjun #添加数据
QUEUED
127.0.0.1:6379> set age 23 #添加数据
QUEUED
127.0.0.1:6379> getset name #输入一个错误的命令,这时候已经报错了,但是这个还是进入了事务的队列当中
(error) ERR wrong number of arguments for 'getset' command
127.0.0.1:6379> set high 173 #添加数据
QUEUED
127.0.0.1:6379> exec #执行事务,报错,并且所有的命令都不会执行
(error) EXECABORT Transaction discarded because of previous errors.
127.0.0.1:6379> get name #获取数据为空,证明没有执行
(nil)
④ Исключение во время выполнения, за исключением того, что синтаксическая ошибка не будет выполнена и возникнет исключение, другие правильные команды могут выполняться нормально
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379> set name dingyongjun #添加字符串数据
QUEUED
127.0.0.1:6379> incr name #对字符串数据进行自增操作
QUEUED
127.0.0.1:6379> set age 23 #添加数据
QUEUED
127.0.0.1:6379> get age #获取数据
QUEUED
127.0.0.1:6379> exec #执行事务。虽然对字符串数据进行自增操作报错了,但是其他的命令还是可以正常执行的
1) OK
2) (error) ERR value is not an integer or out of range
3) OK
4) "23"
127.0.0.1:6379> get age #获取数据成功
"23"
⑤Вывод: из вышеизложенного можно сделать вывод, что Redis поддерживает транзакцию с одной командой, но транзакция не гарантирует атомарности!
2. Как Redis реализует оптимистическую блокировку?
① смотреть
127.0.0.1:6379> set money 100 #添加金钱100
OK
127.0.0.1:6379> set cost 0 #添加花费0
OK
127.0.0.1:6379> watch money #监控金钱
OK
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379> DECRBY money 30 #金钱-30
QUEUED
127.0.0.1:6379> incrby cost 30 #花费+30
QUEUED
127.0.0.1:6379> exec #执行事务,成功!这时候数据没有发生变动才可以成功
1) (integer) 70
2) (integer) 30
②Многопоточные тестовые часы #поток 1
#线程1
127.0.0.1:6379> set money 100 #添加金钱100
OK
127.0.0.1:6379> set cost 0 #添加花费0
OK
127.0.0.1:6379> watch money #开启监视(乐观锁)
OK
127.0.0.1:6379> multi #开启事务
OK
127.0.0.1:6379> DECRBY money 20 #金钱-20
QUEUED
127.0.0.1:6379> INCRBY cost 20 #花费+20
QUEUED
#这里先不要执行,先执行线程2来修改被监视的值
127.0.0.1:6379> exec #执行报错,因为我们监视了money这个值,如果事务要对这个值进行操作前
#监视器会判断这个值是否正常,如果发生改变,事务执行失败!
(nil)
#поток 2
#线程2,这个在事务执行前操作执行
127.0.0.1:6379> INCRBY money 20 #金钱+20
(integer) 120
③Резюме: разница между оптимистичной блокировкой и пессимистичной блокировкой.Пессимистический замок:В любое время может возникнуть проблема, поэтому я продолжаю следить за ней.Пока текущий шаг не будет завершен, ни одному потоку не разрешено выполняться, что является пустой тратой производительности! Вообще не используется!Оптимистичная блокировка:Только при обновлении данных судите, не модифицировал ли кто-то отслеживаемые данные в этот период, если нет, то транзакция будет выполнена нормально, иначе выполнение не будет выполнено!
Впереди долгий путь, и я обязательно буду его искать вдоль и поперёк~На этом объяснение транзакций Redis и оптимистичной блокировки подошло к концу, если вы думаете, что блогер хорошо написал! Писать нелегко, ставьте лайки, подписывайтесь и комментируйте, чтобы поощрить блоггеров~