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

相关推荐