关于后端:使用Redis缓存优化

3次阅读

共计 3984 个字符,预计需要花费 10 分钟才能阅读完成。

大家好呀,我是小羽最近在做我的项目的时候用到了 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.class, args);
    }

}
  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 小羽欢送大家关注我的微信号。

本文由 mdnice 多平台公布

正文完
 0