服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - springboot使用redis对单个对象进行自动缓存更新删除的实现

springboot使用redis对单个对象进行自动缓存更新删除的实现

2021-11-05 10:14杉菜酱酱子~ Java教程

本文主要介绍了springboot使用redis对单个对象进行自动缓存更新删除的实现,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

springboot的项目搭建在此省略,pom文件依赖什么的就不说了

创建一个实体类

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
@data
@equalsandhashcode(callsuper = true)
@accessors(chain = true)
@apimodel(value="erepository对象", description="题库")
public class erepository extends basicmodel<erepository> implements serializable {
 
    private static final long serialversionuid = 1l;
 
    @tableid(value = "id", type = idtype.auto)
    private long id;
 
    @apimodelproperty(value = "安全分类id")
    private long safetypeid;
 
    @apimodelproperty(value = "题型")
    private integer questype;
 
    @apimodelproperty(value = "题干")
    private string quescontent;
 
    @apimodelproperty(value = "选项")
    private string options;
 
    @apimodelproperty(value = "答案")
    private string answer;
 
    @apimodelproperty(value = "是否审核(0:未审核,1:已审核)")
//    @tablefield("is_check")
    private boolean ischeck;
    @override
    protected serializable pkval() {
        return this.id;
    }
}

创建一个控制器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
@requiredargsconstructor
@restcontroller
@slf4j
@api(tags = "题库模块")
@requestmapping("/api/erepository")
public class erepositorycontroller {
    private final ierepositoryservice erepositoryservice;
 
    @apioperation("查询所有题目")
    @getmapping(value = "/all")
    @responsebody
    public result<list<erepository>> getrespository(erepositoryquerycriteria criteria){
        return result.success(erepositoryservice.getrepositoryall(criteria));
    }
 
    @apioperation(value = "多条件查询题目",notes = "根据各种条件查询,可分页 \n author:lifang 2021/7/25")
    @getmapping
    @responsebody
    public result<ipage<erepositorydto>> getrespository(pagevo pagevo,erepositoryquerycriteria criteria){
        return result.success(erepositoryservice.getrepository(pagevo.buildpage(),criteria));
    }
 
    @apioperation(value = "按安全分类id查询")
    @getmapping(value = "/getbysafetypeid")
    public result<list<erepository>> getrespositorybysafetypeid(long id){
        long start = system.currenttimemillis();
        list<erepository> list = erepositoryservice.getbysafetypeid(id);
        long end = system.currenttimemillis();
        system.out.println("耗时:"+(end-start));
        return result.success(list);
    }
 
    @apioperation("新增题目")
    @postmapping
    public result<void> add(@requestbody erepository erepository){
        erepository.setdeleted(false);
        erepositoryservice.addrepository(erepository);
        return result.success();
    }
 
    @apioperation("修改题目")
    @putmapping
    public result<object> update(@requestbody erepository erepository){
        erepository.setdeleted(false);
        log.info(strutil.format("【修改题目 /api/erepository】操作人id:{},被修改题目id:{}", securityutils.getcurrentuserid(),
                erepository.getid()));
        return result.success(erepositoryservice.updaterepository(erepository));
    }
 
    @apioperation("删除题目")
    @deletemapping
    public result<void> delete(@requestbody set<long> ids){
        erepositoryservice.deletebyid(ids);
        return result.success();
    }
}

建个service

?
1
2
3
4
5
6
7
8
9
10
11
12
13
public interface ierepositoryservice extends ibasicservice<erepository> {
    list<erepository> getrepositoryall(erepositoryquerycriteria criteria);
 
    ipage<erepositorydto> getrepository(ipage<erepository> page,erepositoryquerycriteria criteria);
 
    list<erepository> addrepository(erepository erepository);
 
    list<erepository> updaterepository(erepository erepository);
 
    void deletebyid(set<long> id);
 
    list<erepository> getbysafetypeid(long id);
}

新建service实现类

使用注解进行自动缓存、更新、删除主要是在service的实现类里写

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
@slf4j
@service
@enablecaching
@requiredargsconstructor
@cacheconfig(cachenames = "repository")
public class erepositoryserviceimpl extends basicserviceimpl<erepositorymapper, erepository> implements ierepositoryservice {
    private final erepositorymapper erepositorymapper;
    private final erepositorystruct erepositorystruct;
//    private final erepositoryserviceimpl erepositoryservice;
    private final redisutils redisutils;
 
    @override
    public list<erepository> getrepositoryall(erepositoryquerycriteria criteria) {
        list<erepository> erepositories = erepositorymapper.selectlist(builderepositorycriteria(criteria));
        return erepositories;
    }
 
    @override
    public ipage<erepositorydto> getrepository(ipage<erepository> page,erepositoryquerycriteria criteria) {
        ipage<erepository> erepositorypage = erepositorymapper.selectpage(page,builderepositorycriteria(criteria));
        list<erepositorydto> erepositorydtolist = erepositorystruct.todto(erepositorypage.getrecords());
        return pageutil.tomapstructpage(erepositorypage,erepositorydtolist);
    }
 
    @cacheable(key = "'safetypeid:' + #p0")
    @override
    public list<erepository> getbysafetypeid(long id) {
        list<erepository> erepositorylist = erepositorymapper.getbysafetypeid(id);
        return erepositorylist;
    }
 
    private lambdaquerywrapper<erepository> builderepositorycriteria(erepositoryquerycriteria criteria){
        lambdaquerywrapper<erepository> wrapper = new lambdaquerywrapper<>();
//        wrapper.eq(erepository::getdeleted,false);
        if (objectutil.isnotnull(criteria.getid())) {
            wrapper.eq(erepository::getid,criteria.getid());
        }
        if(strutil.isnotblank(criteria.getquescontent())){
            //默认使用like匹配
            wrapper.like(erepository::getquescontent, criteria.getquescontent());
        }
        if (objectutil.isnotnull(criteria.getsafetypeid())) {
            wrapper.eq(erepository::getsafetypeid, criteria.getsafetypeid());
        }
        if(objectutil.isnotnull(criteria.getquestype())){
            wrapper.eq(erepository::getquestype,criteria.getquestype());
        }
        if (objectutil.isnotnull(criteria.getstarttime()) && objectutil.isnotnull(criteria.getendtime())) {
            wrapper.between(erepository::getcreatetime , criteria.getstarttime(), criteria.getendtime());
        }
        return wrapper;
    }
 
    @cacheput(key = "'safetypeid:' + #p0.safetypeid")
    @override
    public list<erepository> addrepository(erepository erepository) {
        erepositorymapper.insert(erepository);
        list<erepository> list = erepositorymapper.getbysafetypeid(erepository.getsafetypeid());
//        list.add(erepository);
        return list;
    }
 
    @cacheput(key = "'safetypeid:' + #p0.safetypeid")
    @override
    public list<erepository> updaterepository(erepository resources) {
        erepository erepository = getbyid(resources.getid());
        if(objectutil.isempty(erepository)){
            log.error(strutil.format("【修改题目失败】操作人id:{},修改目标erepository为空,目标id:{}", securityutils.getcurrentuserid(),
                    resources.getid()));
            throw new badrequestexception("修改失败,当前数据id不存在");
        }
        erepositorymapper.updatebyid(resources);
        log.info(strutil.format("【修改题目成功】操作人id:{},修改目标题目:{}", securityutils.getcurrentuserid(),
                resources));
        list<erepository> list = erepositorymapper.getbysafetypeid(resources.getsafetypeid());
//        list.removeif(item -> resources.gemid().equals(item.getid()));
//        list.add(resources);
        //清理缓存
        delcaches(resources.getid());
        return list;
    }
 
    @override
    public void deletebyid(set<long> ids) {
        for (long id : ids){
            erepositorymapper.deletebyid(id);
            //清理缓存
            delcaches(id);
        }
        log.info(strutil.format("【删除题目成功】操作人id:{},删除目标repositories:{}", securityutils.getcurrentuserid(),
                ids.tostring()));
    }
 
    /**
     * 清理缓存
     *
     * @param id /
     */
    private void delcaches(long id) {
        long safetypeid = erepositorymapper.getsafetypeidbyid(id);
        //删除属于该安全分类的题库缓存
        redisutils.del(cachekey.repository_safetypeid + safetypeid);
    }
}

新建mapper接口

?
1
2
3
4
5
6
7
8
@component
public interface erepositorymapper extends basicmapper<erepository> {
    @select("select * from e_repository where safe_type_id = #{safetypeid} and is_deleted=0")
    list<erepository> getbysafetypeid(long safetypeid);
 
     @select("select safe_type_id from e_repository where id= #{id} and is_deleted=0")
     long getsafetypeidbyid(long id);
}

 6.启动项目

使用swagger测试根据安全分类id查询题目接口,该分类题目的查询结果成功响应,这时打开redis管理工具,可以看到题目按分类已经被缓存到redis中了。

springboot使用redis对单个对象进行自动缓存更新删除的实现

再次用swagger测试查询该分类id的所有题目,可以看到idea控制台并没有sql语句打印,仍然有查询结果成功响应。

@cacheconfig(cachenames = “repository”)
放在service实现类上,用来配置缓存名称。
@cacheable(key = “‘safetypeid:' + #p0”)
放在查询方法上,‘safetypeid:' + #p0作为键,p0是该方法的第一个参数。
作用:使用这两个注解,会使查询方法首先会根据key从缓存中查询,如果缓存中没有该键,则从使用sql语句到数据库中差查询,查询后,响应结果,并自动将方法的返回结果放入redis缓存中,下一次,如果再查询就直接从redis缓存中查询。

好处:极大提升查询效率,并减轻服务器压力。

@cacheput(key = “‘safetypeid:' + #p0.safetypeid”)

通常加到添加和更新方法上

  • 当访问新增题目接口时,数据库新增题目成功,方法返回结果会存入redis中,这次再访问查询属于该分类的题目接口,会发现该分类的题目已经添加成功。
  • 当访问更新题目接口时,数据库更新题目成功,方法返回结果会根据key存入redis中,当再根据该key查询题目时,会发现控制台并没有打印sql语句,直接从redis中查询出结果。

@cacheevict(key = “#p0”)

用在删除方法上,走该删除方法,会删除数据库中的该条记录,而且会删除key为方法的第一个参数(通常为id)的redis记录。再次查询该条记录,发现查询不到了。
注意:上面的方法不能用来存储集合。

到此这篇关于springboot使用redis对单个对象进行自动缓存更新删除的实现的文章就介绍到这了,更多相关springboot redis自动缓存更新删除内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_45479404/article/details/119303769

延伸 · 阅读

精彩推荐
  • Java教程升级IDEA后Lombok不能使用的解决方法

    升级IDEA后Lombok不能使用的解决方法

    最近看到提示IDEA提示升级,寻思已经有好久没有升过级了。升级完毕重启之后,突然发现好多错误,本文就来介绍一下如何解决,感兴趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代码

    小米推送Java代码

    今天小编就为大家分享一篇关于小米推送Java代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧...

    富贵稳中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    这篇文章主要介绍了Java使用SAX解析xml的示例,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml与Java对象的转换详解

    xml与Java对象的转换详解

    这篇文章主要介绍了xml与Java对象的转换详解的相关资料,需要的朋友可以参考下...

    Java教程网2942020-09-17
  • Java教程Java BufferWriter写文件写不进去或缺失数据的解决

    Java BufferWriter写文件写不进去或缺失数据的解决

    这篇文章主要介绍了Java BufferWriter写文件写不进去或缺失数据的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望...

    spcoder14552021-10-18
  • Java教程20个非常实用的Java程序代码片段

    20个非常实用的Java程序代码片段

    这篇文章主要为大家分享了20个非常实用的Java程序片段,对java开发项目有所帮助,感兴趣的小伙伴们可以参考一下 ...

    lijiao5352020-04-06
  • Java教程Java8中Stream使用的一个注意事项

    Java8中Stream使用的一个注意事项

    最近在工作中发现了对于集合操作转换的神器,java8新特性 stream,但在使用中遇到了一个非常重要的注意点,所以这篇文章主要给大家介绍了关于Java8中S...

    阿杜7482021-02-04
  • Java教程Java实现抢红包功能

    Java实现抢红包功能

    这篇文章主要为大家详细介绍了Java实现抢红包功能,采用多线程模拟多人同时抢红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙...

    littleschemer13532021-05-16