使用Redis缓存优化

LogicAetherMaster
• 阅读 683

大家好呀,我是小羽最近在做项目的时候用到了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下载的话可以在,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小羽欢迎大家关注我的微信号。
使用Redis缓存优化

本文由mdnice多平台发布

点赞
收藏
评论区
推荐文章
3A网络 3A网络
3年前
Redis 做接口限流
Redis除了做缓存,还能干很多很多事情:分布式锁、限流、处理请求接口幂等性。。。太多太多了~今天想和小伙伴们聊聊用Redis处理接口限流,这也是最近的TienChin项目涉及到这个知识点了,我就拎出来和大家聊聊这个话题。1.准备工作首先我们创建一个SpringBoot工程,引入Web和Redis依赖,同时考虑到接口限流一般是通过
Wesley13 Wesley13
4年前
05 redis(进阶)
redis阶段一、认识redis1、什么是redisRedis是由意大利人SalvatoreSanfilippo(网名:antirez)开发的一款内存高速缓存数据库。Redis全称为:RemoteDictionaryServer,该软件使用C语言编写,Redis是一个keyvalue存储系统,
Stella981 Stella981
4年前
Redis的使用
一、Redis基本介绍Redis:remotedictionaryserver远程字典服务器。Redis性能非常高,单机能够达到15wqps,通常适合做缓存,也可以持久化。Redis安装好后,默认有16个数据库,初始默认使用0号库,编号是0...151.添加keyval\set\2.查看当前re
Stella981 Stella981
4年前
Linux实战教学笔记45:NoSQL数据库之redis持久化存储(一)
第1章redis存储系统1.1redis概述REmoteDIctionaryServer(Redis)是一个基于keyvalue键值对的持久化数据库存储系统。redis和大名鼎鼎的Memcached缓存服务软件很像,但是redis支持的数据存储类型比memcached更丰富,包括strings(字符串),lists(列
Wesley13 Wesley13
4年前
JAVA面试——Redis
1、Redis是什么?都有哪些使用场景?Redis是一个使用C语言开发的高速缓存数据库。Redis使用场景:1)记录帖子点赞数、点击数、评论数;2)缓存近期热帖;3)缓存文章详情信息;4)记录用户会话信息。2、Redis有哪些功能?1)数据缓存功能;2)
Stella981 Stella981
4年前
Redis 总结精讲
本文围绕以下几点进行阐述1、为什么使用redis2、使用redis有什么缺点3、单线程的redis为什么这么快4、redis的数据类型,以及每种数据类型的使用场景5、redis的过期策略以及内存淘汰机制6、redis和数据库双写一致性问题7、如何应对缓存穿透和缓存雪崩问题8、如何解决redis的并发竞争问题
Stella981 Stella981
4年前
Redis的简介
Redis简介Redis是一个高性能的keyvalue数据库。支持复杂的数据结构,支持持久化,支持主从集群,支持高可用,支持较大的value存储...Redis是一个nosql,非关系型数据库。Redis与其他keyvalue缓存产品有以下几个特点:Reids是基于内存
缓存之美——如何选择合适的本地缓存?
作者:郭盼1、简介小编最近在使用系统的时候,发现尽管应用已经使用了redis缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地缓存进行了一番调研,有早期的Guava缓存、在Guava上进一步传承的
Redis缓存的主要异常及解决方案
Redis是当前最流行的NoSQL数据库。Redis主要用来做缓存使用,在提高数据查询效率、保护数据库等方面起到了关键性的作用,很大程度上提高系统的性能。当然在使用过程中,也会出现一些异常情景,导致Redis失去缓存作用。
缓存之美——如何选择合适的本地缓存?
1、简介小编最近在使用系统的时候,发现尽管应用已经使用了redis缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地缓存进行了一番调研,有早期的Guava缓存、在Guava上进一步传承的Caffi
缓存之美——如何选择合适的本地缓存?
作者:京东保险郭盼1、简介小编最近在使用系统的时候,发现尽管应用已经使用了redis缓存提高查询效率,但是仍然有进一步优化的空间,于是想到了比分布式缓存性能更好的本地缓存,因此对领域内常用的本地缓存进行了一番调研,有早期的Guava缓存、在Guava上进一