大家好呀,我是小羽最近在做我的项目的时候用到了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 */@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; }}
- 在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")@PostMappingpublic User save(User user){ userService.save (user); return user;}
到这里我的项目就配置实现了,我叫Java小羽欢送大家关注我的微信号。
本文由mdnice多平台公布