首页 > 其他分享 >项目引入缓存Cache

项目引入缓存Cache

时间:2022-11-18 15:33:33浏览次数:44  
标签:缓存 String TypeTbl Cache tbl 引入 public select

项目引入缓存Cache

随着项目代码的书写变多,回过来发现,代码只局限于完成功能,或者在完成功能的基础上进行优化,但是对于性能问题考虑的不是很深入,在平时中也接触不到高并发等一系列需要书写高质量、符合实际生产环境的代码,

现做尝试1:

把数据库表中的字典数据引入到缓存中,二次操作时不需要再操作数据库,直接从缓存中读取;

spingcache的简介

缓存就是将数据从数据库等数据来源获取数据,将数据缓存在内存或其它设备入redis中,为了二次查询能够快速高效的响应结果;

特点

提供cache通用入口,方便多种实现切换缓存源,入redis,guava cache等

支持事务,即事务回滚时,缓存同时自动回滚

准备一个springboot环境

添加依赖包

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

新建实体类

public class LowCarbonEquTypeTbl {

    public String equType;
    public String equValue;
    public String equTrans;

    public LowCarbonEquTypeTbl(String s, String s1, String s2) {
        this.equType=s;
        this.equValue=s1;
        this.equTrans=s2;
    }

    @Override
    public String toString() {
        return "LowCarbonEquTypeTbl{" +
                "equType='" + equType + '\'' +
                ", equValue='" + equValue + '\'' +
                ", equTrans='" + equTrans + '\'' +
                '}';
    }

    public String getEquType() {
        return equType;
    }

    public void setEquType(String equType) {
        this.equType = equType;
    }

    public String getEquValue() {
        return equValue;
    }

    public void setEquValue(String equValue) {
        this.equValue = equValue;
    }

    public String getEquTrans() {
        return equTrans;
    }

    public void setEquTrans(String equTrans) {
        this.equTrans = equTrans;
    }
}

增加数据表

用于测试

 

 

 

新建Service接口

public interface TypeService {
    public List<TypeTbl> select();

    public TypeTbl update(TypeTbl tbl);

    public TypeTbl save(TypeTbl tbl);
}

新建实现impl

@Service
public class TypeImpl implements TypeService{
    private Logger logger = Logger.getLogger("TypeImpl");

    @Resource
    private TypeMapper equTypeMapper;

    // 先从缓存中读取,如果没有再调用方法获取数据,然后把数据添加到缓存中

    @Override
    @Cacheable(value = "tbl")
    public List<TypeTbl> select() {
        logger.info("=====select查询数据库啦=====");
        List<TypeTbl> tbls = equTypeMapper.selectList(null);
        return tbls;
    }

    // 移除对应的缓存

    @Override
    @CacheEvict(value = "tbl", key = "#tbl",allEntries = true)
    public TypeTbl update(TypeTbl tbl) {
        logger.info("=====update查询数据库啦=====");
        QueryWrapper wrapper = new QueryWrapper();
        wrapper.eq("equ_type",tbl.getEquType());
        wrapper.eq("equ_value",tbl.getEquValue());
        wrapper.eq("equ_trans",tbl.getEquTrans());
        int rows = equTypeMapper.delete(wrapper);
        return tbl;
    }

    // 查询数据库,将查询结果放到缓存

    @Override
    @CachePut(value = "tbl", key = "#tbl", unless = "#tbl == null ")
    public TypeTbl save(TypeTbl tbl) {
        logger.info("=====save查询数据库啦=====");
        equTypeMapper.insert(tbl);
        return tbl;
    }

}

新建测试类

@RunWith(SpringRunner.class)
 //指定启动类
@SpringBootTest(classes = LogFrameworkApplication.class)
@Slf4j
public class DemoApplicationTests {
//    private Logger logger = Logger.getLogger("DemoApplicationTests");

    @Resource
    private TypeService service;


    @Test
    public void testCache() {

        //增加数据的值并且缓存当前数据库的值
        TypeTbl user = service.save(new TypeTbl("1", "1","1"));
        log.info("[ save方法  - {} ]",user);
        //查询数据库中的值
        List<TypeTbl> user1 = service.select();
        log.info("[ select 方法  - {} ]",user1);
        //删除数据库的值,但是没有删除缓存的值--数据不同步问题,需要解决
        service.update(user);
        List<TypeTbl> user2 = service.select();
        //获取到的是缓存的值不是数据库的值
        log.info("[ select 方法  - {} ]",user2);
        List<TypeTbl> user3 = service.select();
        //获取到的事缓存的值不是数据库的值
        log.info("[ select 方法  - {} ]",user3);
    }
}

运行结果

 =====save查询数据库啦=====
 HikariPool-1 - Start completed.
 [ save方法  - TypeTbl{equType='1', equValue='1', equTrans='1'} ]
 =====select查询数据库啦=====
 [ select 方法  - [TypeTbl{equType='dt', equValue='01', equTrans='demo'}, TypeTbl{equType='1', equValue='1', equTrans='1'}] ]
 =====update查询数据库啦=====
 =====select查询数据库啦=====
 [ select 方法  - [TypeTbl{equType='dt', equValue='01', equTrans='demo'}] ]
 [ select 方法  - [TypeTbl{equType='dt', equValue='01', equTrans='demo'}] ]
 HikariPool-1 - Shutdown initiated...
 HikariPool-1 - Shutdown completed.

测试缓存遇到的问题

注解中key的取值、allEntries = true清除缓存的值

出发点是利用缓存 减轻数据库的压力

但是有一个数据一致性的问题,人为操作数据库,造成数据变动 ,此时缓存中的值会和本身数据库中的值不一致,怎么办?

当前情况下,缓存中数据用来存储定值不易改变的,密集的操作完成后即删去缓存中的值 等待下次操作重新填充数据库的值,

改变了存储的定值,需要重启项目系统,自动释放再次同步获取数据

这是不引用外部组件的情况下,减小了项目重量。在一个接口中完成新建缓存,消除缓存的操作。

 

标签:缓存,String,TypeTbl,Cache,tbl,引入,public,select
From: https://www.cnblogs.com/subtlman/p/16903417.html

相关文章

  • Redis缓存雪崩,击穿和穿透
    这三个问题的发生,会导致大量的请求直接积压到数据库,如果并发量很大,则可能会导致数据库宕机或故障。缓存雪崩 描述:大量的请求无法在redis缓存中进行处理而被发送到数据......
  • redis 缓存高可用集群
    redis集群方案比较哨兵模式在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点状态,如果master节点异常,则会做主从切换,将某一台salve作......
  • nginx高并发优化之缓存配置
    一、配置http{proxy_cache_path/app/cache/levels=1:2keys_zone=proxy_cache:10mmax_size=10ginactive=60muse_temp_path=off;upstreambackend{server127......
  • [SpringBoot-Dubbo] 报错:NoClassDefFoundError: org/apache/curator/framework/recipe
    NoClassDefFoundError:org/apache/curator/framework/recipes/cache/NodeCacheListener缺少curator依赖<dependency><groupId>org.apache.curator</groupId><ar......
  • vscode怎么引入bootstrap
    1、创建好项目,初始化项目 2、检查npm,vue,node 3、cd到当前目录,执行如下命令:Bashnpminstallbootstrap--save--save-exact//--save是做为依赖库存到package.......
  • Redis缓存中的数据和数据库不一致
    首先关于两者数据的一致性包含有两种情况:(1)缓存中有数据时,那数据库中的数据要和缓存中的数据相同;(2)缓存中没有数据时,数据库中的数据必须是最新的。如果不符合以上两种......
  • 12 张图看懂 CPU 缓存一致性与 MESI 协议,真的一致吗?
    本文已收录到 GitHub·AndroidFamily,有Android进阶知识体系,欢迎Star。技术和职场问题,请关注公众号[彭旭锐]进Android面试交流群。前言大家好,我是小彭。在......
  • Redis 和 memache 缓存的区别
    1.数据类型 Redis数据类型丰富,支持setlisthash等类型 memcache支持简单数据类型,需要客户端自己处理复杂对象 2.持久性 redis支持数据落地持久化存储,并不是所有的数据......
  • 我把 CPU 三级缓存的秘密,藏在这 8 张图里
    本文已收录到 GitHub·AndroidFamily,有Android进阶知识体系,欢迎Star。技术和职场问题,请关注公众号[彭旭锐]进Android面试交流群。前言大家好,我是小彭。在......
  • 第六章 数据库和缓存
    1.常见的关系型数据库和非关系型数据库关系型数据库:mysql非关系型数据库:redis mongodb2.mysql常见的数据库引擎和区别引擎INNODB: 支持事务 支持行锁和表锁 速......