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缓存技术掌握了用法,一定要慎用。操作不好会造成不好的后果