SpringBoot2-Redis数据缓存(一)

Redis是什么?
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

可以看出redis是key-value数据库,通过key就可以获取value,使用命令 get keyname,时间复杂度:O(1),读取速度快。与Mysql数据库相比,在Mysql里查个数据需要遍历所有的数据,时间复杂度:O(n)。 redis适用于缓存重要的数据,保留下来,需要用的时候直接redis去拿数据,不需要用到mysql。

实现redis缓存步骤:

1.添加redis依赖,配置pom.xml
2.在application.yml配置redis
3.在plugins下载GenerateSerialVersionUID插件
4.在启动类中加上Redis缓存注解@EnableCaching
5.对象实现序列化接口
6.序列化对象生成唯一UID
7.使用@Cacheable@CachePut注解实现数据缓存,和mysql数据更改并且把mysql更改的数据保存的redis中

pom.xml添加依赖配置

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

application.yml

spring:
	redis:
    	host: 127.0.0.1
    	port: 6379
    //我的redis没有密码,就不需要配置

安装GenerateSerialVersionUID插件,设置UID生成的快捷键
在这里插入图片描述
在这里插入图片描述

在启动类添加@EnableCaching注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;

@SpringBootApplication
@EnableCaching  //在启动类加上redis缓存注解
public class SellApplication {
    public static void main(String[] args) {
        SpringApplication.run(SellApplication.class, args);
    }
}

接下来就是对数据进行缓存,最近做了一个订餐系统,有卖家订单列表,商品列表等等,每次获取列表的信息都要从mysql数据库获取数据 效果图如下:

在这里插入图片描述
没有使用redis缓存技术,订单页面展示,商品页面展示,每点击一次就要去数据库get数据,而且每次数据都是一样的,一但数据过多,也是非常耗时,消耗性能。使用redis可以进行数据备份,一样的操作直接去redis获取数据。

获取商品信息表的代码return这一行设置断点并且用debug调试,我的redis是空数据,代码运行return这里会进入debug,然后我放行。再看看图下redis数据库

 @Override
    @Cacheable(cacheNames = "bbc",key = "123")
    public Page<ProductInfo> findAll(Pageable pageable) {
        return repository.findAll(pageable);
    }

redis数据库已经把商品列表的数据已序列化的保存到redis中,我再次运行到获取商品信息列表的时候,不会进入debug,而是直接去redis获取数据。这行注解@Cacheable(cacheNames = “bbc”,key = “123”),拿着key=bbc::123去redis数据库找到相同key,获取到value的值。直接返回的是Page 的序列化数据,不会再去执行findAll方法了。
在这里插入图片描述

注意: ProductInfo类一定要实现序列化接口,否则缓存不进redis中。上面的操作是已经对ProductInfo类序列化接口实现了。接下来在ProductInfo实现Serializable接口,并且生成UID(可以用快捷键生成,上面介绍了如何设置快捷键)。

public class ProductInfo implements Serializable {

    private static final long serialVersionUID = 6162686580194525680L;

    @Id
    private String productId;

	...........
}

在实际开发过程中,我们需要对商品进行单条数据查询,通过商品的Id查询获取到一条商品的信息,@Cacheable注解把数据信息缓存到redis中,并且这商品数据信息在redis有key的,key就是abc::商品Id,比如第一次查询1商品的信息,去mysql获取数据,然后会保存到redis,第二次又查1商品的信息,直接去redis获取商品数据,就不会去mysql中查询。

	//查询一条商品数据
	@Override
    @Cacheable(cacheNames = "abc",key = "#productId")
    public ProductInfo findOne(String productId) {
        ProductInfo productInfo = repository.findProductInfoByProductId(productId);
        if( productInfo == null ){
            throw new SellException(ResultEnum.PRODUCT_NOT_EXIST);
        }
        return productInfo;
    }	

在开发的过程中,我在mysql对1号商品进行了修改,这个时候1号商品的信息已经存在了redis数据库中,我去查的1号商品的数据发现redis的数据,已经跟mysql数据对不上了。这些修改保存到的是mysql数据库,却不会更新到redis,接下来使用@CachePut注解完成mysql数据库更改,然后更新到redis。

	//修改保存一条数据,并且更新redis数据
 	@Override
    @CachePut(cacheNames = "abc",key = "#productInfo.getProductId()")
    public ProductInfo save(ProductInfo productInfo) {
        return repository.save(productInfo);
    }

Redis缓存技术掌握了用法,一定要慎用。操作不好会造成不好的后果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值