实践 缓存redis,谷歌guava, 分布式锁(线程锁,进程锁)
一。注解实现redis的缓存2.谷歌guava的缓存
分布式锁的实现思路3种
1.数据库表加锁
2.redis的分布式锁
3.zk的分布式锁
基于数据库实现分布式锁---原理是利用数据库的唯一索引特性----比如说我们可以创建一个锁表,--当一个线程要获取锁时,就向表中插入一条记录,--如果插入成功代表获取锁, 如果插入失败,那么说明锁已经被其他线程占用了
锁表通常包含以下字段:锁名称(唯一)、持有者标识、过期时间等
CREATE TABLE distributed_lock (
lock_name VARCHAR(128) PRIMARY KEY,
owner_id VARCHAR(64),
expire_time TIMESTAMP
);
锁释放与续期机制
锁必须设置过期时间避免死锁。客户端完成任务后需主动删除锁记录。可通过定时任务续期锁的过期时间
优点和缺点:
优点是:实现相对简单,容易理解,不需要引入其他中间件
缺点:数据库高并发情况下耗时,如果数据库故障也会导致分布式锁失效
要知道分布式锁--首先要知道什么是锁--一个线程拿到锁,另一个线程拿不到锁,就不能往下走,这就是锁,这就是锁的互斥性----------那怎么实现互斥, redis的setnx,加锁之后要解锁,解锁是不是要判断一下是不是当前进程的锁,避免释放错锁,先判断再释放, 这是2步操作,要保证原子性吧,上LUA脚本保证原子性-------那么为什么setnx这个命令能保证原自行, 为什么setnx这个命令不需要放到LUA脚本中呢:setnx是单个命令,redis执行命令都是单线程的,能天然保证原子性---那一个线程拿到锁了,这个线程挂了怎么办, 挂了之后他就无法释放锁了:所以要给锁加一个过期时间,那么即便线程挂了也能自动释放锁,
缓存分为本地缓存和分布式缓存。以 Java 为例,使用自带的 map 或者 guava 实现的是本地缓存,最主要的特点是轻量以及快速,生命周期随着 jvm 的销毁而结束,并且在多实例的情况下,每个实例都需要各自保存一份缓存,缓存不具有一致性。
使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached服务的高可用,整个程序架构上较为复杂。
一.redis缓存(分布式缓存)
039_springboot炖cache_redis_哔哩哔哩_bilibili
参考链接的 注解实现redis的缓存特别有用....
SpringBoot整合Redis缓存_悠然予夏的博客-CSDN博客_springboot整合redis缓存
二. springboot+谷歌的cache_guava(本地缓存)
Guava Cache是Google公司开发⼀种本地缓存机制,之所以叫本地缓存,是因为它不会把缓存数据放到外部⽂件或者其他服务器上,⽽是存放到了应⽤内存中。
Guava Cache的优点是:简单、强⼤、轻量级。
GuavaCache之后,被它的简单、强大、及轻量级所吸引。它不需要配置文件,使用起来和ConcurrentHashMap一样简单,而且能覆盖绝大多数使用cache的场景需求!一般而言,对于那些频繁需要查询比对的热点数据,我们采用使用缓存。
Springboot-本地缓存(Google Guava Cache)_于问问的博客-CSDN博客_springboot本地缓存
springBoot集成guava cache实现本地缓存_兢兢业业的子牙的博客-CSDN博客_guava cache springboot
还有Spring基于注解实现的缓存
Spring缓存注解_xyzko1的博客-CSDN博客_spring缓存注解
三.锁---分布式锁(线程锁,进程锁), springboot实现分布式锁
线程锁: 主要用来给方法和代码块来加锁,多个线程同时访问被加锁的方法或者代码块时,同一时间只有一个线程在执行,其他线程只能访问该对象中的非加锁代码块
进程锁: 为了控制操作系统中多个进程访问一个共享资源,可以使用本地系统的信号量控制
分布式锁: 当多个进程不在同一个系统中时,使用分布式锁控制多个进程对资源的访问
更多推荐
所有评论(0)