Redis(缓存一套,–>分布式锁)
多级缓存方案
Why
1、数据高并发读写
2、海量数据读写
3、不经常改变,但是对MySQL查询压力大的
4、想要使用分布式锁的解决方案,还有缓存;
What
nosql 非关系型数据库
Redis是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server (远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型,
如:
String
string
int
float
字符串最大空间不超过512m
规范项目名:业务名:类型:id
List
与java linkedlist类似,双向链表,支持正向反向检索
有序
可重复
插入,删除快
查询一般
应用场景:朋友圈点赞列表、评论列表
Set
与hashset类似
无序
元素不可重复
查找快
支持交集、并集、差集(相对来说SQL实现比较复杂,所以用redis更简洁)
Zset
也叫sortedset
可排序set 与treeset类似
元素不重复
查询速度快
应用:排行榜
Hash
value是无序字典
类似java hashmap
CRUD单个字段更容易
Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启,数据也不会丢失。
与MySQL数据库不同的是,Redis的数据是存在内存中的。它的读写速度非常快,每秒可以处理超过10万次读写操作。因此redis被广泛应用于缓存。
Redis缓存提高查询效率
How
可以自己封装redis工具类,SpringDataRedis企业用的多,Spring提供的Redis Client,StringRedisTemplate是用于操作Reids的API工具。
Jedis 通常一般的设置缓存、过期时间、修改、删除。比较全面的Redis命令的支持
Ressdion
依赖lock4j-redisson-spring-boot-starter 或 redisson、redisson-spring-boot-starter
@Slf4j
@RunWith(SpringRunner.class)
@SpringBootTest(classes = TaskApplication.class)
public class ExceptionTest {
//way of first
//redisson-spring-boot-starter-3.13.6.jar
@Autowired
private RedissonClient redissonClient;
// //way of second
// //lock4j-redisson-spring-boot-starter-2.2.2.jar
// @Resource
// private LockTemplate lockTemplate;
//way of first
@Test
public void redisTest() {
RLock lock = redissonClient.getLock(“this_is_key”);
try {
lock.lock();
//模拟业务
Thread.sleep(5000);
} catch (Exception e) {
log.warn(“e:{}”, e);
} finally {
lock.unlock();
}
}
// //way of second
// @Test
// public void secondTest(){
// LockInfo lockInfo = null;
// try {
// lockInfo = lockTemplate.lock(“this_is_second_key”, 5000L, 0);
//
// Thread.sleep(5000);
// } catch (Exception e) {
// log.warn(“e:{}”, e);
// }
//
// lockTemplate.releaseLock(lockInfo);
// }
}
//请求超时时间小于等于0L,框架会用默认的请求超时时间,第四个参数决定lock方法用框架里面的自旋锁。设置超时时间。请求时间和过期时间是不一样的概念。
lockInfo = lockTemplate.lock(key, 50000,
0L, RedissonLockExecutor.class);
有些小伙伴认为,稍微把锁过期时间设置长一些就可以啦。其实我们设想一下,是否可以给获得锁的线程,开启一个定时守护线程,每隔一段时间检查锁是否还存在,存在则对锁的过期时间延长,防止锁过期提前释放。
当前开源框架Redisson解决了这个问题。我们一起来看下Redisson底层原理图吧:只要线程一加锁成功,就会启动一个watch dog看门狗,它是一个后台线程,会每隔10秒检查一下,如果线程1还持有锁,那么就会不断的延长锁key的生存时间。因此,Redisson就是使用Redisson解决了「锁过期释放,业务没执行完」问题。
Redis高级
缓存雪崩:由于原有缓存失效,新缓存未到期间(比如;我们设置缓存时采用相同的过期时间,在同一时刻出现大面积的缓存过期),所有原本应该访问缓存的请求都去查询数据库了,而对数据库cpu和内存造成巨大压力,严重的造成数据库宕机。从而形成一系列连锁反应,造成整个系统崩溃。
Redis为什么可以加锁
因为redis是一个单独的中间件,不同客户端可以往同一个redis或者集群中加锁,这样就能保证加锁的地方或者是资源相同的。并且由于redis也是单线程的,同时也支持lua脚本,可以保证并发安全的问题,所以可以很简单的实现分布式锁的功能。
上一篇:如何实现网页的自动登录