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
Langeldep 2020-11-16
chenhualong0 2020-11-16
聚合室 2020-11-16
koushr 2020-11-12
MRFENGG 2020-11-11
guoyanga 2020-11-10
fackyou00 2020-11-10
Orangesss 2020-11-03
dongCSDN 2020-10-31
rainandtear 2020-10-30
Quietboy 2020-10-30
liuyulong 2020-10-29
fansili 2020-10-29
温攀峰 2020-10-23
jackbon 2020-10-19
kaixinfelix 2020-10-04