开发笔记 | redis学习笔记

(待完善)

redis是什么

(* @Cacheable一类的注解自动缓存,要么使用RedisTemplate手动缓存)

特点:支持网络,基于内存,可持续化,日志型,nosql,键值数据库,支持多种类型存储,线程安全

为什么要用:

学习记录用,后续对redis的学习将继续更新在本篇

使用

1.pom.xml文件中导入redis依赖

导入相关依赖后,就可以在配置文件中,配置连接redis的相关信息


    org.springframework.boot
    spring-boot-starter-data-redis

2.application.yml配置文件中配置redis相关信息(未使用连接池)

spring:

  redis:
    # 选择Redis数据库(默认为0),redis默认有16个数据库
    database: 0
    # Redis服务器地址 本地localhost/127.0.0.1
    host: 127.0.0.1
    # Redis服务器连接端口
    port: 6379
    # 连接超时时长(毫秒)
    timeout: 6000
    # Redis服务器连接密码(默认为空)
    password:

3.redis配置文件config(如果是简单使用字符串类型可跳过这一步)

默认情况下,Spring Boot自动配置使用的RedisTemplate RedisTemplate模板操作数据库,但只能存取字符串,很多时候我们需要存储不同的类型,所以如果需要就建立配置类,自定义操作模板,同时可设置序列化器(为什么要序列化?)


@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate redisTemplate(LettuceConnectionFactory                                      
                                                                   connectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
        redisTemplate.setConnectionFactory(connectionFactory);
        return redisTemplate;
    }

4.简单使用redis

通过注入RedisTemplate来完成对redis的存储读取等操作

@Resource
private RedisTemplate redisTemplate;

redisTemplate相关操作

简单的字符串(对象)存/读取

@Resource
private RedisTemplate redisTemplate;
....

//存字符串
redisTemplate.opsForValue().set(key,"str");
//读字符串
redisTemplate.opsForValue().get(key);


@Resource
private RedisTemplate redisTemplate;
...

//此对象需要进行序列化
Apple apple = new Apple();
//存对象
redisTemplate.opsForVlaue.set("apple_key",apple)
//读对象,一般会通过强制类型转换,转换为对应的值类型
Apple apple = (Apple)redisTemplate.opsForValue.get("apple_key");

5.设置序列化

上方提到对象需要序列化,如果不序列化则请求后报错如图

开发笔记 | redis学习笔记_第1张图片

在对应的实体类加上 implements Serializable

public class Apple implements Serializable 

,但当对象存储至redis中时候,会发现,存储内容出现乱码

开发笔记 | redis学习笔记_第2张图片

【为什么需要序列化】

在java中,一切都是以对象的形式存在,而将对象的信息进行传输就需要序列化,没序列化的对象是不能存进数据库,当使用@AutoWired注入时,IOC容器默认选择StringRedisTemplate类进行注入

而StringRedisTemplate默认选择StringRedisSerializer序列化器

如果将RedisTemplate改为RedisTemplate,又因为@AutoWired是根据类型来查找表bean,此时找不到,故需要改为@Resource,直接注入RedisTemplate

RedisTemplate默认选择JdkSerializationRedisSerializer序列化器,故出现如上情况,如果需要存储在redis中的数据以json形式存在,则需要配置序列化器,把默认序列化器顶替掉

=》需要配置config

【法1】

@Resource
private RedisTemplate redisTemplate;

......

redisTemplate.setKeySerializer(RedisSerializer.string());
//redisTemplate.setKeySerializer(new StringRedisSerializer());

redisTemplate.opsForValue().set("apple_key","apple");

法2配置文件

@Configuration
public class RedisConfig{
    @Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory 
                                                      redisConnectionFactory){
        RedisTemplate template = new RedisTemplate<>();
        //关联
        template.setConnectionFactory(redisConnectionFactory);
        //设置key的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        //设置value的序列化器 此处特定为Apple 后续可考虑如何做到通用
         template.setValueSerializer(new Jackson2JsonRedisSerializer(Apple.class));
        return template;
    }
}

则通过对key跟value的序列化,即可获得正常所需的存储形式了

开发笔记 | redis学习笔记_第3张图片

使用redis连接池

redis连接池springboot2.0 集成redis服务详解,以及 (Lettuce & Jedis)_zzhongcy的博客-CSDN博客_spring.redis.lettuce.pool

jedis/lettuce 区别

*连接池(jedis/lettuce选择)采用连接池的话,需要加上如下依赖

springboot2.X redis依赖默认引入lettuce,如果要采用jedis连接池,则需手动引入jedis相关依赖,排除自带lettuce依赖,以此引入需要用到的jedis包


    org.springframework.boot
    spring-boot-starter-data-redis
    
        
            io.lettuce
            lettuce-core
        
    


    redis.clients
    jedis

使用jedis还需要JedisConnectionFactory

spring:

  redis:
    # 选择Redis数据库(默认为0),redis默认有16个数据库
    database: 0
    # Redis服务器地址 本地localhost/127.0.0.1
    host: 127.0.0.1
    # Redis服务器连接端口
    port: 6379
    # 连接超时时长(毫秒)
    timeout: 6000
    # Redis服务器连接密码(默认为空)
    password:
    # Redis连接池 jedis同
    lettuce:
      pool:
        # 连接池最大连接数(使用负值表示没有限制)
        max-active: 1000
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1
        # 连接池中的最大空闲连接
        max-idle: 500
        # 连接池中的最小空闲连接
        min-idle: 5
        shutdown-timeout: 0

5.实际中应用

5.序列化问题

6.周期问题

注意点

redis击穿,穿透,雪崩以及解决

参考redis击穿,穿透,雪崩以及解决方案_坑里水库的博客-CSDN博客_redis击穿

SpringBoot(十一): Spring Boot集成Redis - 申来来 - 博客园

你可能感兴趣的:(开发学习笔记,redis,java,数据库)