一、简介

1、场景

由于首页数据变化不是很频繁,而且首页访问量相对较大,所以我们有必要把首页数据缓存到redis中,减少数据库压力和提高访问速度。

2、RedisTemplate

Jedis是Redis官方推荐的面向Java的操作Redis的客户端,而RedisTemplate是Spring Data Redis中对Jedis api的高度封装。

Spring Data Redis是spring大家族的一部分,提供了在srping应用中通过简单的配置访问redis服务,对reids底层开发包(Jedis, JRedis, and RJC)进行了高度封装,RedisTemplate提供了redis各种操作、异常处理及序列化功能,支持发布订阅,并对spring cache进行了实现。

二、引入redis

1、项目中集成redis

common父模块中添加redis依赖,Spring Boot 2.0以上默认通过commons-pool2连接池连接redis。

<!-- spring boot redis缓存引入 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- lecttuce 缓存连接池-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>

2、添加redis连接配置

application.yml 中添加如下配置

spring:
redis:
host: 192.168.100.100
port: 6379
database: 0
password: 123456 #默认为空
lettuce:
pool:
max-active: 20 #最大连接数,负值表示没有限制,默认8
max-wait: -1 #最大阻塞等待时间,负值表示没限制,默认-1
max-idle: 8 #最大空闲连接,默认8
min-idle: 0 #最小空闲连接,默认0

3、配置Redis

添加RedisConfig

/**
* 我们自定义一个 RedisTemplate,设置序列化器,这样我们可以很方便的操作实例对象。
* 否则redis自动使用Java自带的jdk序列化(前提是实体类实现了Serializable),而Java自带的序列化有一定的安全性问题,因此这里封装一个序列化的配置类。
*/
@Configuration
public class RedisConfig { @Bean
public RedisTemplate<String, Serializable> redisTemplate(LettuceConnectionFactory connectionFactory) {
RedisTemplate<String, Serializable> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());//key序列化方式
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());//value序列化
redisTemplate.setConnectionFactory(connectionFactory); return redisTemplate;
}
}

三、测试redisTemplate

1、测试redis数据存储

ApiAdController中添加下面的方法进行测试。

@Autowired
private RedisTemplate redisTemplate; @PostMapping("save-test")
public R saveAd(@RequestBody Ad ad){
//redisTemplate.opsForValue().set("ad1", ad);
redisTemplate.opsForValue().set("index::ad", ad);
return R.ok();
} @GetMapping("get-test/{key}")
public R getAd(@PathVariable String key){
Ad ad = (Ad)redisTemplate.opsForValue().get(key);
return R.ok().data("ad", ad);
} @DeleteMapping("remove-test/{key}")
public R removeAd(@PathVariable String key){
Boolean delete = redisTemplate.delete(key);
System.out.println(delete);//是否删除成功
Boolean hasKey = redisTemplate.hasKey(key);
System.out.println(hasKey);//key是否存在
return R.ok();
}

2、常用方法

redisTemplate提供了以下几种存储数据的方法

redisTemplate.opsForValue(); //操作字符串
redisTemplate.opsForHash(); //操作hash
redisTemplate.opsForList(); //操作list
redisTemplate.opsForSet(); //操作set
redisTemplate.opsForZSet(); //操作有序set

四、使用缓存注解

1、修改Redis配置类

在配置类RedisConfig上添加注解

@EnableCaching

在配置类RedisConfig中添加bean配置

@Bean
public CacheManager cacheManager(LettuceConnectionFactory connectionFactory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
//过期时间600秒
.entryTtl(Duration.ofSeconds(600))
// 配置序列化
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(new StringRedisSerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()))
.disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(connectionFactory)
.cacheDefaults(config)
.build();
return cacheManager;
}

2、添加缓存注解

@Cacheable(value = "xxx", key = "'xxx'"):标注在方法上,对方法返回结果进行缓存。下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。

service_cms:AdServiceImpl

@Cacheable(value = "index", key = "'selectByAdTypeId'")
@Override
public List<Ad> selectByAdTypeId(String adTypeId) {

service_edu:CourseServiceImpl

@Cacheable(value = "index", key = "'selectHotCourse'")
@Override
public List<Course> selectHotCourse() {

service_edu:TeacherServiceImpl

@Cacheable(value = "index", key = "'selectHotTeacher'")
@Override
public List<Teacher> selectHotTeacher() {

最新文章

  1. 05 技术内幕 T-SQL 查询读书笔记(第四章)
  2. hihoCoder#1121
  3. 四则运算GUI设计2.0
  4. C#小知识特殊的DefaultValueAttribute
  5. Jquery的命名冲突
  6. C# 拷贝数组的几种方法
  7. 【USACO1.1】Broken Necklace
  8. tomcat的安装
  9. hdoj 3336 Count the string【kmp算法求前缀在原字符串中出现总次数】
  10. Jquery 限制文本框输入字数【转】
  11. java 计算源码的行数
  12. jQuery自定义插件--banner图滚动
  13. 日常实用css布局技巧汇总
  14. 学生选课系统 c语言
  15. shell实战之日志脱敏-2.0
  16. java数据结构面试问题—快慢指针问题
  17. 关于PHP批量图片格式转换的问题--本文转成webp, 其他过程格式一样
  18. Codeforces Round #540 (Div. 3)
  19. TensorFlow保存和载入模型
  20. 性能测试十六:liunx下jmete配置环境变量

热门文章

  1. Google Analytics 统计用户点击和每个页面浏览的用户id
  2. JMeter上传文件,并修改源码参数化Content-Disposition 的 filename
  3. 卡尔曼滤波学习笔记1-Matlab模拟温度例子--代码比较乱,还需优化
  4. swift笔记简录
  5. NET 5 Execl导入数据处理(EppLus、NPOI)
  6. Core3.0路由配置
  7. 使用CDN后如何配置Apache使其记录访客真实IP
  8. Python--批量修改文件名称
  9. 记git提交异常
  10. 解决CentOS 8 Docker容器无法上网的问题