1 悲观锁
执行操作前假设当前的操作肯定(或有很大几率)会被打断(悲观)。基于这个假设,我们在做操作前就会把相关资源锁定,不允许自己执行期间有其他操作干扰。
Redis不支持悲观锁。Redis作为缓存服务器使用时,以读操作为主,很少写操作,相应的操作被打断的几率较少。不采用悲观锁是为了防止降低性能。
2 乐观锁
执行操作前假设当前操作不会被打断(乐观)。基于这个假设,我们在做操作前不会锁定资源,万一发生了其他操作的干扰,那么本次操作将被放弃。
3. Redis中的锁策略
Redis采用了乐观锁策略(通过watch操作)。乐观锁支持读操作,适用于多读少写的情况!
在事务中,可以通过watch命令来加锁;使用 UNWATCH可以取消加锁;
如果在事务之前,执行了WATCH(加锁),那么执行EXEC 命令或 DISCARD 命令后,锁对自动释放,即不需要再执行 UNWATCH 了
例子
redis锁工具类
package com.fly.lock;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
public class RedisLock {
//初始化redis池
private static JedisPoolConfig config;
private static JedisPool pool;
static {
config = new JedisPoolConfig();
config.setMaxTotal(30);
config.setMaxIdle(10);
pool = new JedisPool(config, "192.168.233.200", 6379);
}
public static void lock(Object target) {
//获取jedis
Jedis jedis = pool.getResource();
//result接收setnx的返回值,初始值为0
Long result= 0L;
while (result < 1) {
//如果target在redis中已经存在,则返回0;否则,在redis中设置target键值对,并返回1
result = jedis.setnx(target.getClass().getName() + target.hashCode(), Thread.currentThread().getName());
}
jedis.close();
}
public static void unLock(Object target) {
Jedis jedis = pool.getResource();
//删除redis中target对象的键值对
Long del = jedis.del(target.getClass().getName() + target.hashCode());
jedis.close();
}
public static boolean tryLock(Object target) {
Jedis jedis = pool.getResource();
Long row = jedis.setnx(target.getClass().getName() + target.hashCode(), "true");
jedis.close();
if (row > 0) {
return true;
}
return false;
}
}
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1142
183.71 KB下载数642
644.84 KB下载数2755
相关文章
发现更多好内容猜你喜欢
AI推送时光机redis锁机制介绍与实例
数据库2024-04-02
ORACLE锁的机制介绍
数据库2024-04-02
Redis的LRU机制介绍
数据库2022-06-04
MySQL的InnoDB锁机制介绍
数据库2024-04-02
Redis分布式锁介绍与使用
数据库2024-04-02
MySQL的锁机制原理介绍
数据库2024-04-02
Android Thread 介绍与实例
数据库2022-06-06
介绍一下Redis的持久化机制
数据库2024-04-02
Redis分布式锁的实现原理介绍
数据库2023-06-02
MySQL锁机制在INSERT中的锁优化工具介绍
数据库2024-08-14
JavaScript基础介绍与实例
数据库2024-04-02
SpringBoot详细介绍SPI机制示例
数据库2024-04-02
巧用Redis实现分布式锁详细介绍
数据库2024-04-02
C#多线程死锁介绍与案例代码
数据库2024-04-02
Android AsyncTask实现机制详细介绍及实例代码
数据库2022-06-06
CSS3动画制作的实例介绍
数据库2024-04-02
MySQL数据库锁机制的相关原理介绍
数据库2024-04-02
SpringCloudOpenFeign基本介绍与实现示例
数据库2023-02-21
C++ 组合 (Composition)的介绍与实例
数据库2024-04-02
【巨杉数据库Sequoiadb】数据库锁机制介绍文档
数据库2024-04-02
咦!没有更多了?去看看其它编程学习网 内容吧