大家好呀,我是小羽最近在做我的项目的时候用到了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 */@Configurationpublic 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")@PostMappingpublic User save(User user){    userService.save (user);    return user;}

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

本文由mdnice多平台公布