缓存方案二:redis

简介

Redis作为当下最流行的缓存框架,适用于处理大数据量分布式场景的缓存。

特点

  • 持久化
    将内存的数据保存到磁盘中,重启的时候可以再次加载使用。
    支持RDB和AOF两种持久化方式。
    RDB:在redis.conf配置文件里配置持久化触发器。
    AOF:redis每增加一条记录都会保存到持久化文件中。
  • 丰富的数据类型
    支持key-value,list,set,zset,hash等多种数据结构的存储。
  • 数据备份
    提供主从复制方案,即master-slave模式的数据备份。

优势

  • 性能极高。毫秒级的读写数度。
  • 丰富的数据结构类型。
  • 原子性。所有操作都是原子性的。即要成功执行,要么全部不执行。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Spring boot+JPA+Redis

(1)安装redis服务

  • redis官方下载地址:https://github.com/microsoftarchive/redis/releases
  • 修改密码:打开redis.windows.conf文件,找到# requirepass foobared这一行去掉注释,foobared替换成自己的密码,保存。
  • 运行服务:redis-server.exe redis.windows.conf
  • 运行客户端:redis-cli.exe -h 127.0.0.1 -a 密码

(2)添加依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
    <version>2.2.7.RELEASE</version>
</dependency><dependency>
      <groupId>org.springframework.data</groupId>
      <artifactId>spring-data-redis</artifactId>
      <version>1.5.0.RELEASE</version>
    </dependency>
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.1.0</version>
</dependency>

(3)application.properties配置

spring.redis.host=localhost
spring.redis.password=test666
spring.redis.port=6379
#设置使用哪一个redis数据库【redis默认有16个数据库0-15】 不配置默认使用0号
spring.redis.database= 0
#连接超时时间(毫秒)
spring.redis.timeout=6000ms
#连接池最大连接数
spring.redis.jedis.pool.max-active=20
#最大阻塞等待时间,负值表示没有限制
spring.redis.jedis.pool.max-wait=60000ms
#最小空闲连接
spring.redis.jedis.pool.min-idle=1
#最大空闲连接
spring.redis.jedis.pool.max-idle=20

(4)redis配置:缓存策略

import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;

import java.lang.reflect.Method;
import java.text.SimpleDateFormat;

/**
 * Redis缓存配置类
 * @author
 *
 */
@Configuration
@EnableCaching//开启注解
public class RedisConfig extends CachingConfigurerSupport {

    /**
     * 自定义key
     * @return
     */
    @Override
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object o, Method method, Object... objects) {
                //格式化
                StringBuilder sb = new StringBuilder();
                sb.append(o.getClass().getName());
                sb.append(method.getName());
                for (Object obj : objects) {
                    sb.append(obj.toString());
                }
                System.out.println("调用redis缓存key:" + sb.toString());
                return sb.toString();
            }
        };
    }

    @Bean
    public CacheManager cacheManager(RedisTemplate<?, ?> redisTemplate) {
        CacheManager cacheManager = new RedisCacheManager(redisTemplate);
        return cacheManager;
    }
    /*
     * 要启用spring缓存支持,需创建一个 CacheManager的 bean,CacheManager 接口有很多实现,这里Redis 的集成,用
     * RedisCacheManager这个实现类 Redis 不是应用的共享内存,它只是一个内存服务器,就像 MySql 似的,
     * 我们需要将应用连接到它并使用某种“语言”进行交互,因此我们还需要一个连接工厂以及一个 Spring 和 Redis 对话要用的
     * RedisTemplate, 这些都是 Redis 缓存所必需的配置,把它们都放在自定义的 CachingConfigurerSupport 中.
     * 并且定义一个过期删除策略

     */
	/**
	@Bean
	public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisConnectionFactory redisConnectionFactory) {
		RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
		return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory))
				.cacheDefaults(redisCacheConfiguration).build();
	}
	**/

    @Bean
    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();
        redisTemplate.setConnectionFactory(factory);
        //解决日期序列化问题
        ObjectMapper om = new ObjectMapper();
        om.setDateFormat(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(om);
        redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer);
        return redisTemplate;
    }
}

参考:Go Go Go

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值