总结总结小总结

  • Post author:
  • Post category:其他











缓存开始









SpringCache

  • 使用spring-cache注解, 存储数据注意事项

  • 当使用@Cacheable缓存了数据后, 有别的方法进行修改时,

    #缓存该方法的值
    @Cacheable(value = "category",key = "#root.methodName")
    

    1, 可以使用@CacheEvict删除对应的值, 让@Cacheable的方法重新载入redis

    #字符串需要加 单引号, 不然他以为是表达式
    @CacheEvict(value = {"category"},key = "'getCatalogJson'")
    

    2, 使用@Caching删除多个缓存

    @Caching(
            evict = {
                    @CacheEvict(value = {"category"},key = "'getCatalogJson1'")
                    ,@CacheEvict(value = {"category"},key = "'getCatalogJson2'")
            }
    )
    

    3, 根据分区删除数据, 删除某个分区下的所有数据

    @CacheEvict(value = "category",allEntries = true)
    



双写模式

  • 使用@CachePut, 将更新的数据在redis中再存储一份, 即删除之前的又写入当前的, 双写模式

    @CachePut
    @CacheEvict(value = {
         "category"},key = "'getCatalogJson'")
    @Transactional
    @Override
    public ... updateCascade(CategoryEntity category) {
         
        this.updateById(category);
        		  categoryBrandRelationService.updateCategory(category.getCatId(),category.getName());
        return ...;
    }
    



读模式


  • 缓存穿透:

    就是大量请求查询一个null数据;

    spring-cache解决方式:

    #redis是否缓存空值, 解决缓存穿透
    spring.cache.redis.cache-null-values=true
    


    缓存击穿:

    大量请求同时查询一个正好过期的数据;

    解决方式: 加锁, 默认spring-cache是不加锁的, 可以通过sync指定, 注意如果数据可能存在数据击穿, 再加sync

    spring-cache解决方式:

    @Cacheable(value = "category",key = "#root.methodName",sync = true)
    


    缓存雪崩:

    大量的key同时过期;

    spring-cache解决方式: 让key有随机不同的过期时间

    #redis中key的存活时间, 单位是ms
    spring.cache.redis.time-to-live=3600000
    



写模式

1, 读写加锁

2, 引入cannal, 动态更新mysql

3, 读多写多, 直接去查询mysql



redis存数据总结

常规数据(读多写少, 即时性, 一致性要求不高的数据), 可以使用spring-cache存储, 写的数据加过期时间, 按点更新

特殊数据: 要即时性, 一致性要求高的数据, 使用cannal同步, 加读写锁



Redis分布式锁

  • (可以参考谷粒商城gulimall的CategoryServiceImpl的阶段1, 2, 3, 4笔记)

    引入redission, 解决分布式锁, 主要是使用Redisson的LockWatchdogTime看门狗

    简单引入:



版权声明:本文为SirHongGe原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。