shenyi

V1

2022/07/12阅读:19主题:默认主题

使用Redis缓存优化

大家好呀,我是小羽最近在做项目的时候用到了Redis这个NoSQL数据库,进行缓存优化,刚好总结一下Redis的知识点,和使用方法。

什么是Redis?

REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

为什么用Redis?

由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统就会达到性能瓶颈,导致系统卡顿。

为了克服上述的问题,Java Web项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。项目从内存中取值的速度比从数据库中取出值的速度要快的多。

RedisMongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中。

Redis应用场景

  1. 缓存
  2. 任务队列
  3. 消息队列
  4. 分布式锁

其中最常用的还是使用Redis的缓存功能。

Redis的基本知识

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
字符串string
哈希hash
列表list
集合set
有序集合sorted set

如何使用Redis优化项目?

Redis下载的话可以在,Redis 官网:https://redis.io/中下载。

Spring Cache

首先这里要使用一个技术叫 Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。针对不同的缓存技术需要实现不同的CacheManager。

CacheManager 描述
EhCacheCacheManager 使用EhCache作为缓存技术
GuavaCacheManager 使用Google的GuavaCache作为缓存技术
RedisCacheManager 使用Redis作为缓存技术

这里我们主要使用的是Redis作为缓存技术。

Spring Cache常用注解

注解 说明
@EnableCaching 开启缓存注解功能
@Cacheable 在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据;
若没有数据,调用方法并将方法返回值放到缓存中
@CachePut 将方法的返回值放到缓存中
@CacheEvict 将一条或多条数据从缓存中删除

在spring bootI项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用开启缓存支持即可。例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。

例子:(此时使用的是默认的HashMap存储方式,是存在内存中的)

  1. 在Spring Boot项目中,可以使用Spring Data Redis来简化Redisi操作,maven坐标:
        <!--添加redis缓存-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        <!--添加cache缓存框架-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
  1. 在.yml配置文件中,配置Redis
spring:
  application:
    name: aaa
  #配置redis
  redis:
    database: 0
    password: 123456
    host: 1.15.184.111
    port: 6379
  cache:
    redis:
      time-to-live: 1800000 # 30分钟,即30分钟没有访问就清除缓存
  1. 创建RedisConfig配置类
package com.ljh.reggie.config;

import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * Redis配置类
 * @author shenyi
 */


@Configuration
public class RedisConfig extends CachingConfigurerSupport {

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {

        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();

        //默认的Key序列化器为:JdkSerializationRedisSerializer
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());

        redisTemplate.setConnectionFactory(connectionFactory);

        return redisTemplate;
    }

}

  1. 在SpringBoot的启动类上添加注解支持
@SpringBootApplication
@EnableTransactionManagement//开启事务支持
@EnableCaching//开启缓存支持
public class ReggieApplication {

    public static void main(String[] args) {
        SpringApplication.run(ReggieApplication.classargs);
    }

}

  1. 注解具体的使用方式

@Cacheable注解一般放在查询的方法上,第一个参数value值相当于叫 setMealCache 的key;第二个参数key相当于field,其中#setmeal.categoryId获取的是这个方法传来的参数的值。

/**
* 根据套餐id查询菜品
@param setmeal
@return
*/

@GetMapping("/list")
@Cacheable(value = "setMealCache", key = "#setmeal.categoryId+'_'+#setmeal.status")
public R<List<Setmeal>> list(Setmeal setmeal) {...}

@CacheEvict注解一般放在删除方法的上,第一个参数和上述的value值一样都为setMealCache,属于同一个key下的缓存。

/**
     * 删除信息
     *
     * @param ids
     * @return
     */

    @DeleteMapping
    //allEntries = true表示我要删除setMealCache分类下的所有缓存数据
    @CacheEvict(value = "setMealCache",allEntries = true)
    public R<String> delete(@RequestParam List<Long> ids) {...}

@CachePut注解,其中第二个参数#result.id,获取返回值的id(使用的是SPEL表达式)

/**
* CachePut:将方法返回值放入缓存
* value:缓存的名称,每个缓存名称下面可以有多个key
* key:缓存的key
*/

@CachePut(value="setMealCache",key="#result.id")
@PostMapping
public User save(User user){
    userService.save (user);
    return user;
}

到这里项目就配置完成了,我叫Java小羽欢迎大家关注我的微信号。
Java小羽

分类:

后端

标签:

后端

作者介绍

shenyi
V1