• SpringBoot整合redis


    SpringBoot整合

    SpringBoot 操作数据:spring-data jpa jdbc mongodb redis! SpringData 也是和 SpringBoot 齐名的项目!

    说明: 在 SpringBoot2.x 之后,原来使用的jedis被替换为了lettuce

    jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接 池! 更像 BIO 模式

    lettuce : 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据 了,更像 NIO 模式

    源码分析:

    @Bean
    @ConditionalOnMissingBean(name = "redisTemplate") // 我们可以自己定义一个
    redisTemplate来替换这个默认的!
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory
    redisConnectionFactory)
    throws UnknownHostException {
    // 默认的 RedisTemplate 没有过多的设置,redis 对象都是需要序列化!
    // 两个泛型都是 Object, Object 的类型,我们后使用需要强制转换 <String, Object>
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
    }
    @Bean
    @ConditionalOnMissingBean // 由于 String 是redis中最常使用的类型,所以说单独提出来了一
    个bean!
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory
    redisConnectionFactory)
    throws UnknownHostException {
    StringRedisTemplate template = new StringRedisTemplate();
    template.setConnectionFactory(redisConnectionFactory);
    return template;
    }
    

    整合测试一下

    1. 导入依赖

      <!-- 操作redis -->
      <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
      </dependency>
      
      
    2. 配置连接

      # 配置redis
      spring.redis.host=127.0.0.1
      spring.redis.port=6379
      
      
    3. 测试

      package com.maple.redis.springBootRedis;
      
      import org.springframework.beans.factory.annotation.Autowired;
      import org.springframework.boot.test.context.SpringBootTest;
      import org.springframework.data.redis.connection.RedisConnection;
      import org.springframework.data.redis.core.RedisTemplate;
      import org.springframework.data.redis.serializer.StringRedisSerializer;
      
      import java.util.Set;
      
      /**
       * @author 枫叶
       * @date 2020/8/1 18:56
       * @Email 203051919@qq.com
       */
      @SpringBootTest
      public class Test {
          @Autowired
          private RedisTemplate redisTemplate;
      
          @org.junit.jupiter.api.Test
          public void test() {
              // redisTemplate 操作不同的数据类型,api和我们的指令是一样的
              // opsForValue 操作字符串 类似String
              // opsForList 操作List 类似List
              // opsForSet
              // opsForHash
           // opsForZSet
              // opsForGeo
              // opsForHyperLogLog
              // 除了进本的操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务,和基本的CRUD
              // 获取redis的连接对象
              RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
              connection.flushDb();
              //设置key序列化器,默认是JdkSerializationRedisSerializer
              redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8);
              redisTemplate.opsForValue().set("myKey","枫叶正在测试redis");
              redisTemplate.opsForValue().set("key2","枫叶正在测试redis2");
              redisTemplate.opsForValue().set("key3","枫叶正在测试redis3");
      
              System.out.println(redisTemplate.opsForValue().get("myKey"));
              Set keys = redisTemplate.keys("*");
              System.out.println(keys.size()+"---"+keys.toString());
              connection.close();
          }
      }
      
      
      

      运行结果

      枫叶正在测试redis
      3---[myKey, key3, key2]

    我们来编写一个自己的 RedisTemplete

    package com.kuang.config;
    import com.fasterxml.jackson.annotation.JsonAutoDetect;
    import com.fasterxml.jackson.annotation.PropertyAccessor;
    import com.fasterxml.jackson.databind.ObjectMapper;
    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.Jackson2JsonRedisSerializer;
    import org.springframework.data.redis.serializer.StringRedisSerializer;
    @Configuration
    public class RedisConfig {
    // 这是我给大家写好的一个固定模板,大家在企业中,拿去就可以直接使用!
    // 自己定义了一个 RedisTemplate
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory
    factory) {
    // 我们为了自己开发方便,一般直接使用 <String, Object>
    RedisTemplate<String, Object> template = new RedisTemplate<String,
    Object>();
    template.setConnectionFactory(factory);
    // Json序列化配置
    Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
    Jackson2JsonRedisSerializer(Object.class);
    ObjectMapper om = new ObjectMapper();
    om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
    om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
    jackson2JsonRedisSerializer.setObjectMapper(om);
    // String 的序列化
    StringRedisSerializer stringRedisSerializer = new
    StringRedisSerializer();
    // key采用String的序列化方式
    template.setKeySerializer(stringRedisSerializer);
    // hash的key也采用String的序列化方式
    template.setHashKeySerializer(stringRedisSerializer);
    // value序列化方式采用jackson
    template.setValueSerializer(jackson2JsonRedisSerializer);
    // hash的value序列化方式采用jackson
    template.setHashValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();
    return template;
    }
    }
    

    所有的redis操作,其实对于java开发人员来说,十分的简单,更重要是要去理解redis的思想和每一种数 据结构的用处和作用场景!

    Redis.conf详解

    启动的时候,就通过配置文件来启动!

    单位

    image-20200801213017827

    配置文件 unit单位 对大小写不敏感!

    包含
    image-20200801214538955

    网络

    bind 127.0.0.1 # 绑定的ip
    protected-mode yes # 保护模式
    port 6379 # 端口设置
    

    通用 GENERAL

    daemonize yes # 以守护进程的方式运行,默认是 no,我们需要自己开启为yes!
    pidfile /var/run/redis_6379.pid # 如果以后台的方式运行,我们就需要指定一个 pid 文件!
    # 日志
    # Specify the server verbosity level.
    # This can be one of:
    # debug (a lot of information, useful for development/testing)
    # verbose (many rarely useful info, but not a mess like the debug level)
    # notice (moderately verbose, what you want in production probably) 生产环境
    # warning (only very important / critical messages are logged)
    loglevel notice
    logfile "" # 日志的文件位置名
    databases 16 # 数据库的数量,默认是 16 个数据库
    always-show-logo yes # 是否总是显示LOGO
    

    快照

    持久化, 在规定的时间内,执行了多少次操作,则会持久化到文件 .rdb. aof

    redis 是内存数据库,如果没有持久化,那么数据断电及失!

    # 如果900s内,如果至少有一个1 key进行了修改,我们就进行持久化操作
    save 900 1
    # 如果300s内,如果至少10 key进行了修改,我们就进行持久化操作
    save 300 10
    # 如果60s内,如果至少10000 key进行了修改,我们就进行持久化操作
    save 60 10000
    
    stop-writes-on-bgsave-error yes # 持久化如果出错,是否还需要继续工作!
    rdbcompression yes # 是否压缩 rdb 文件,需要消耗一些cpu资源!
    rdbchecksum yes # 保存rdb文件的时候,进行错误的检查校验!
    dir ./ # rdb 文件保存的目录!
    

    REPLICATION 复制

    SECURITY 安全

    可以在这里设置redis的密码,默认是没有密码!

    127.0.0.1:6379> ping
    PONG
    127.0.0.1:6379> config get requirepass # 获取redis的密码
    1) "requirepass"
    2) ""
    127.0.0.1:6379> config set requirepass "123456" # 设置redis的密码
    OK
    127.0.0.1:6379> config get requirepass # 发现所有的命令都没有权限了
    (error) NOAUTH Authentication required.
    127.0.0.1:6379> ping
    (error) NOAUTH Authentication required.
    127.0.0.1:6379> auth 123456 # 使用密码进行登录!
    OK
    127.0.0.1:6379> config get requirepass
    1) "requirepass"
    2) "123456"
    
    

    限制 CLIENTS

    maxclients 10000 # 设置能连接上redis的最大客户端的数量
    maxmemory <bytes> # redis 配置最大的内存容量
    maxmemory-policy noeviction # 内存到达上限之后的处理策略
    1、volatile-lru:只对设置了过期时间的key进行LRU(默认值)
    2、allkeys-lru : 删除lru算法的key
    3、volatile-random:随机删除即将过期key
    4、allkeys-random:随机删除
    5、volatile-ttl : 删除即将过期的
    6、noeviction : 永不过期,返回错误
    

    APPEND ONLY 模式 aof配置

    appendonly no # 默认是不开启aof模式的,默认是使用rdb方式持久化的,在大部分所有的情况下,rdb完全够用!
    appendfilename "appendonly.aof" # 持久化的文件的名字
    # appendfsync always # 每次修改都会 sync。消耗性能
    appendfsync everysec # 每秒执行一次 sync,可能会丢失这1s的数据!
    # appendfsync no # 不执行 sync,这个时候操作系统自己同步数据,速度最快!
    

    具体的配置,见持久化

  • 相关阅读:
    CentOS 6.x 系统安装选项说明
    MySQL表的操作
    6月13号
    6月11号
    6月10号
    6月9号
    6月6
    day27
    day 28
    day 29
  • 原文地址:https://www.cnblogs.com/junlinsky/p/13528485.html
Copyright © 2020-2023  润新知