1:Redis数据缓存的学习感受:
官方测Redis读的速度是110000次/s,写的速度是81000次每秒,在非关系型数据库当中使用是较为频繁的,Redis可以存储多种数据类型数据【String,Map,List,Set,Zset等】,今天总结的是在Java在SpringCahe中常用的String数据类型的使用,以及常用的注解使用经验和场景分享。
2:SpringCahe是干什么的:
我们的SpringCache时使用的Aop实现拦截判断是否存在缓存,如果不存在查询数据库数据,并且返回数据到前端和把接口方法返回值以你自定义key-value的方式,存入redis缓存;如果存在对应的key,直接返回当前序列化后的数据给用户,大大减轻了关系型数据库的压力。
3:安装redis缓存数据库:
3.1:Linux下安装Redis并且远程访问,请转载到我写的下面的文章:
3.2:Windows下载Redis,并且开启数据缓存服务
链接:https://pan.baidu.com/s/1zYhwvAxphCG0SAp9Ix6chw?pwd=2323
提取码:2323
3.2.1:Windows下如何开启Redis缓存服务:【双击解压好文件夹里面的redis-server服务】
3.2.2:Windows下测试是否开启Redis缓存服务成功【双击解压好文件夹里面的redis-cli服务】【显示127.0.0.1:6379>:表示连接成功,开启成功相关的Redis缓存服务】
3.2.3:注意本地Redis服务器可以不设置密码访问,但是云远程Redis缓存服务需要加上密码,不然会报警告:挖矿问题
4:初始化一个springCache的springboot的小Demo【主要使用的是Redis的String数据存储类型】【Demo克隆地址:git clone https://gitee.com/wan-jiang-fun/spring-cache-demo.git] 没有下载git代码托管工具的可以看我的另一个博客:
Git安装到本地以及常用的Git命令使用-CSDN博客https://blog.csdn.net/qq_64183539/article/details/137372180
4.1:创建一个Springboot基础工程:【SDK选择自己的即可】
4.2:导入springCahe需要的的相关依赖: 【因为使用的Redis做缓存服务需要导入redis数据源】
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-cache</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
4.3:因为是缓存是为了减轻数据库访问信息,需要加入Mysql的相关依赖测试:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> <version>8.0.27</version> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.2.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.1</version> </dependency>
4.4:其他相关依赖配置如下:
//自动生成set.get方法 <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.20</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.76</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency>
4.5:简单配置相关的application.yml文件
server: port: 8888 spring: datasource: druid: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/springcachedemo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true username: root #数据库用户名 password: 123456 #数据库密码 redis: host: localhost #本地测试,如果是远程服务器写远程服务器ip port: 6379 #端口默认 password: #密码没有设置不写,有写你设置的密码 database: 1 #一个redis有15个数据库,默认数据库存储信息是0号数据库
4.6:在springboot的启动类上面加上:@EnableCaching【启动缓存服务】
4.7:四大常用注解讲解:【注意:插入数据库时设置的key和获取数据数据时的key一定要保持一致,key的一致是获取数据的根本】
注解 | 使用方法 | 使用场景【个人想法不对勿喷】 |
@CachePut | 方法返回值存到redis当中 | 插入数据时候使用 |
@Cacheable | 缓存有对应key的值返回,没有则利用sql查询出来的返回值存入缓存 | 一般查询数据的时候使用 |
@CacheEvict | 删除对应在缓存key的值 | 更新和删除一个数据时候使用 |
@CacheConfig | controller配置整个类的存入redis数据开头信息 | 配置整个Controller类的cacheNames |
4.8:在进行redis的对象存储的时候,一定要对对象进行序列化【对象二进制化存储】,不然Redis难以存储一些复杂编码数据
4.8.1:序列化就是在对象类上面实现Serializable接口就好
4.9:@CacheConfig(cacheNames="myCache"):设置存入缓存数据库统一前缀
4.9.1:@CachePut(key ="#result.id+'abc'")存入Redis缓存数据库的key=myCache::result.id+'abc';【根据返回值对象user里面的id设置key】
#注意下面cacheNames = "myCache"的统一前缀配置到类注解4.9里面去了,还有key拼接字符串需要使用【单引号 ‘ ’】哦!
4.9.2:@CachePut(cacheNames = "myCache",key = "#user.id")存入Redis缓存数据库的key=userCache::user.id;【根据传入函数参数user对象的属性id设置key】
4.9.3:@CachePut(cacheNames = "myCache",key = "#p0.id")存入Redis缓存数据库的key=userCache::user.id;【根据传入函数第一个参数对象的属性id设置key】
4.9.4:@CachePut(cacheNames = "myCache",key = "#a0.id")存入Redis缓存数据库的key=userCache::user.id;【根据传入函数第一个参数对象的属性id设置key】
4.9.5:@CachePut(cacheNames = "myCache",key = "#root.args[0].id")存入Redis缓存数据库的key=userCache::user.id;【根据传入函数第一个参数对象的属性id设置key】
4.9.6:存入到Redis使用可视化工具Another Redis Desktop Manager显示出来的数据结构为这样:
【没有可视化工具观看下面的博客:】
4.10:@CacheEvict(key = "#id")根据传入的id清理单个缓存在myCache的缓存数据【方法执行前】
4.11:@CacheEvict(allEntries = true)//清理所有缓存在myCache的缓存数据【方法执行前】
4.12: @Cacheable( key = "#id+'abc'")//如果Redis有对应key的数据直接返回数据,如果没有,调用方法的返回值返回给用户,并且该数据会放到缓存中