大家好呀,我是小羽最近在做我的项目的时候用到了 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 技术,这是一种 基于内存的数据库,并且提供肯定的长久化性能。我的项目从内存中取值的速度比从数据库中取出值的速度要快的多。
Redis和 MongoDB 是以后应用最宽泛的 NoSQL,而就 Redis 技术而言,它的性能非常优越,能够 反对每秒十几万此的读 / 写操作 ,其性能远超数据库,并且还 反对集群、分布式、主从同步等 配置,原则上能够有限扩大,让更多的数据存储在内存中。
Redis 利用场景
- 缓存
- 工作队列
- 音讯队列
- 分布式锁
其中最罕用的还是应用 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 存储形式,是存在内存中的)
- 在 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>
- 在.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 分钟没有拜访就革除缓存
- 创立 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;
}
}
- 在 SpringBoot 的启动类上增加注解反对
@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>> 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 多平台公布