大家好呀,我是小羽最近在做项目的时候用到了Redis这个NoSQL数据库,进行缓存优化,刚好总结一下Redis的知识点,和使用方法。
REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 写的 key-value 存储系统,是跨平台的非关系型数据库。
Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。
Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统就会达到性能瓶颈,导致系统卡顿。
为了克服上述的问题,Java Web项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。项目从内存中取值的速度比从数据库中取出值的速度要快的多。
Redis和MongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作,其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中。
其中最常用的还是使用Redis的缓存功能。
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
字符串string
哈希hash
列表list
集合set
有序集合sorted set
Redis下载的话可以在,Redis 官网:https://redis.io/中下载。
首先这里要使用一个技术叫 Spring Cache是一个框架,实现了基于注解的缓存功能,只需要简单地加一个注解,就能实现缓存功能。Spring Cache提供了一层抽象,底层可以切换不同的cache实现。具体就是通过CacheManager接口来统一不同的缓存技术。CacheManager是Spring提供的各种缓存技术抽象接口。针对不同的缓存技术需要实现不同的CacheManager。
CacheManager | 描述 |
---|---|
EhCacheCacheManager | 使用EhCache作为缓存技术 |
GuavaCacheManager | 使用Google的GuavaCache作为缓存技术 |
RedisCacheManager | 使用Redis作为缓存技术 |
这里我们主要使用的是Redis作为缓存技术。
注解 | 说明 |
---|---|
@EnableCaching | 开启缓存注解功能 |
@Cacheable | 在方法执行前spring先查看缓存中是否有数据,如果有数据,则直接返回缓存数据; 若没有数据,调用方法并将方法返回值放到缓存中 |
@CachePut | 将方法的返回值放到缓存中 |
@CacheEvict | 将一条或多条数据从缓存中删除 |
在spring bootI项目中,使用缓存技术只需在项目中导入相关缓存技术的依赖包,并在启动类上使用开启缓存支持即可。例如,使用Redis作为缓存技术,只需要导入Spring data Redis的maven坐标即可。
例子:(此时使用的是默认的HashMap存储方式,是存在内存中的)
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-cacheartifactId>
dependency>
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分钟没有访问就清除缓存
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{
RedisTemplate
@SpringBootApplication
@EnableTransactionManagement//开启事务支持
@EnableCaching//开启缓存支持
public class ReggieApplication {
public static void main(String[] args) {
SpringApplication.run(ReggieApplication.class, args);
}
}
@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 setmeal) {...}
@CacheEvict注解一般放在删除方法的上,第一个参数和上述的value值一样都为setMealCache,属于同一个key下的缓存。
/**
* 删除信息
*
* @param ids
* @return
*/
@DeleteMapping
//allEntries = true表示我要删除setMealCache分类下的所有缓存数据
@CacheEvict(value = "setMealCache",allEntries = true)
public R delete(@RequestParam List 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 多平台发布