redis 在业务代码应用
1.查库存
public class IndexDatasourceRedis {
public static void mainSelect(String[] args) {
// 从主缓存获取
// 判断是否主缓存存在
if(true) {
// lock锁
// 从数据库获取
// 更新主缓存
// 更新备份缓存
} else {
// 备份缓存获取
}
}
public static void mainEdit(String[] args) {
// 清空主缓存
}
}2.秒杀减库存处理:
解决方案:令牌机制
秒杀100件商品,可设置令牌池120个。
redis放120令牌,用户获取令牌,获取到的取处理数据库库存(100个正常如理,20个处理失败,其他并发直接返回false),如果异常恢复令牌。
// 库存放到缓存
for(i=0;i<120;i++){
redisTemplate.opsForList.rightPush("token_lists",i+"_");
}
// 库件库存(获取令牌)
String token = redisTemplect.opsForList.leftPop("token_lists");
if(token == null || "".equals(token)) {
System.out.println("没有抢到令牌token,不能秒杀");
}缺点:可以解决数据量少的秒杀,但是1万件商品如何处理?
疑问为什么时候用list,不使用incr/decr:
如果单纯计数效果一样,列表可以存储详细的信息,对业务灵活性高。
https://blog.csdn.net/zhiguozhu/article/details/50517527
3springbootredis
类加注解
@EnableCaching
方法加注解:
//增
@CachePut(key="#id", value="value")
//查
@Cacheable(key="#id", value="value")
//删除
@CacheEvict(key="#id", value="value")
spring配置
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
spring cache原理:注解
AOP注解的原理,看cachePut后通知,看Cacheable前通知
其实最后底层是JCache.jcp(java com)
思考:为什么后通知,先更新DB,后更新缓存
1.先更新DB,后删缓存:
正常思考:并发查询时,查出的是redis的旧值,产生了1次脏读,但减少对DB的冲击。
深度思考:此脏读是一时的旧数据,因随后会删redis,代价小,1次脏读。
2.先删缓存,后更新DB:
正常思考:并发查询时,因没有缓存,去数据库查询,对其冲击大。好处是可以查到最新的数据,但!
深度思考:但查到实际不是最新的数据,因为还没有更新DB,会把不是最新的数据会放到redis里,导致长时间脏读,概率大,代价大。4.springredis
RedisTemplate
相关推荐
王道革 2020-11-25
wangdonghello 2020-11-03
chenhualong0 2020-11-16
聚合室 2020-11-16
koushr 2020-11-12
guoyanga 2020-11-10
fackyou00 2020-11-10
Orangesss 2020-11-03
dongCSDN 2020-10-31
Quietboy 2020-10-30
liuyulong 2020-10-29
fansili 2020-10-29
温攀峰 2020-10-23
jackbon 2020-10-19
kaixinfelix 2020-10-04