SpringBoot 集成Redis 知识归总

关于Redis缓存

关于Redis缓存

为什么使用缓存?
提升重复访问数据的访问效率。

Redis的三个用途
数据库,缓存,消息中间件

Redis的应用场景(针对被重复访问的数据)

页面缓存(图片,CSS,html等静态数据)——热点数据
最新列表
排行榜
计数器
session存储

使用建议

Redis 速度快是建立在内存数据库基础上的,但是一台服务器的内存要比磁盘金贵许多,所以在项目初期不要想什么都往 Redis 里放,这样当数据量上来后很快内存就会不够用,反而得不偿失。合理的利用有限的内存,将读(写)频繁的热数据放在 Redis 中才能更好感受到它带来的性能提升。
Redis 虽然提供了 RDB 和 AOF 两种持久化方式,但是普遍还是认为 Redis 的持久化并不是很靠谱。非常重要的数据不要依赖 Redis 来开发,或者最起码不要只在 Redis 中持久化
MySQL 经过不断优化性能已经非常好,所以 MySQL 提供的数据结构和访问效率能满足的需求的情况下不要引入 Redis,多引入一个组件就多一个可能的故障节点,尤其在保持数据一致性的场景中数据(比如用户余额)应该只放在数据库中,除非你知道怎么解决考系统的分布式事务。

项目结构

在这里插入图片描述

项目开发

1.1、准备pom文件
此项目使用SpringBoot版本为2.1.3.RELEASE,下面引入依赖:

     <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
         <version>5.1.34</version>
     </dependency>
   <dependency>
         <groupId>org.mybatis.spring.boot</groupId>
         <artifactId>mybatis-spring-boot-starter</artifactId>
         <version>1.1.1</version>
   </dependency>
   <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
   </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>

使用JDK1.8

<properties>
    <java.version>1.8</java.version>
</properties>

至此,pom文件已经准备好。

2.2、项目相关配置
application.properties文件如下:

1 server.port=8088
2 mybatis.type-aliases-package=com.neo.entity
3 spring.datasource.driverClassName = com.mysql.jdbc.Driver
4 spring.datasource.url= jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8&useSSL=false
5 spring.datasource.username = root
6 spring.datasource.password = yingziairen
7 logging.level.root=info

application.yml文件如下,其中配置了Mybatis:

1 mybatis:
2 typeAliasesPackage: com.cone.redis.entity
3 mapperLocations: classpath:mapper/*.xml

3.3、配置Redis
当添加Redis依赖后,SpringBoot会自动帮我们在容器中生成一个RedisTemplate和一个StringRedisTemplate,但是,这个RedisTemplate的泛型是<Object,Object>,在代码中会不可避免的需要类型转换,这样不够安全,也过于麻烦,而且RedisTemplate没有设置序列化方式,所以,我们需要配置Redis:

1 @Bean
2 @SuppressWarnings(“all”)
3 public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
4
5 RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
6 template.setConnectionFactory(factory);
7 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
8 ObjectMapper om = new ObjectMapper();
9 om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
10 om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
11 jackson2JsonRedisSerializer.setObjectMapper(om);
12 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
13 //key采用String的序列化方式
14 template.setKeySerializer(stringRedisSerializer);
15 //hash的key也采用String的序列化方式
16 template.setHashKeySerializer(stringRedisSerializer);
17 //value序列化方式采用jackson
18 template.setValueSerializer(jackson2JsonRedisSerializer);
19 //hash的value序列化方式采用jackson
20 template.setHashValueSerializer(jackson2JsonRedisSerializer);
21 template.afterPropertiesSet();
22 return template;
23 }

4、编写Entity
这张表是我其它项目的,这里用来举例:(项目中有sql语句文件,可自己在本地测试)

1 package com.cone.redis.entity;
2
3 /**
4 * 图书信息实体
5 * @author Cone
6 */
7 public class Product {
8
9 private Integer productId;
10 private String productCategories;
11
12 public Integer getProductId() {
13 return productId;
14 }
15 public void setProductId(Integer productId) {
16 this.productId = productId;
17 }
18 public String getProductCategories() {
19 return productCategories;
20 }
21 public void setProductCategories(String productCategories) {
22 this.productCategories = productCategories;
23 }
24
25 }

5、编写Dao
项目使用Mybatis操作数据库:

1 package com.cone.redis.dao;
2
3 import java.util.List;
4 import org.apache.ibatis.annotations.Mapper;
5 import com.cone.redis.entity.Product;
6
7 @Mapper
8 public interface ProductDao {
9 /**
10 * 查询图书列表
11 * @return
12 */
13 public List searchProduct();
14 }

xml文件如下:

1 <?xml version="1.0" encoding="UTF-8"?>
2
3
4
5
6
7 select * from product
8
9
10
11
12

6、编写Service

1 package com.cone.redis.service;
2
3 import java.util.List;
4 import com.cone.redis.entity.Product;
5
6
7 public interface RedisService {
8
9 public List searchProduct();
10
11 }

实现类如下:
①首先注入相关Bean

1 @Autowired
2 private RedisUtil.redisList redisList;
3
4 @Autowired
5 private RedisUtil redisUtil;
6
7 @Autowired
8 private ProductDao productDao;

RedisUtil是我的工具类,这里大家只需要知道这个即可。
②实现

1 @Override
2 public List searchProduct() {
3
4 List list = new ArrayList<>();
5 if (redisUtil.hasKey(“productList”)) {
6 log.info(“从redis中获取数据.”);
7 list = redisList.get(“productList”, 0, -1);
8
9 }
10 else {
11 list = productDao.searchProduct();
12 log.info(“从数据库中获取数据.”);
13 log.info(“将数据存入redis…”);
14 redisList.set(“productList”, list);
15 log.info(“成功存入redis.”);
16 }
17 return list;
18 }

首先判断redis中有没有相关数据,若有,则从redis中查询并返回数据,若没有则从数据库中查询,并将查询到的数据存入redis中。

7、编写Controller

1 @Controller
2 @RequestMapping(value="/redis")
3
4 public class RedisController {
5
6 @Autowired
7 private RedisServiceImpl redisServiceImpl;
8
9 @SuppressWarnings(“unchecked”)
10 @PostMapping(value = “/test”)
11 @ResponseBody
12 public List testRedis() {
13
14 return redisServiceImpl.searchProduct();
15
16 }
17
18 }

至此,项目编写完毕。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值