Redis_API

1/18/2021 Redis

# Redis_API

https://redis.io/clients#java

# Jedis

https://github.com/redis/jedis

  • 特点

    • 线程不安全的

      同一个客户端多线程方式访问redis,只创建了一个Jedis对象,如果一个线程开启了事务,那么另外一个线程的操作请求也会被阻塞

      **解决方案:**Jedis连接池

  • 使用

    • 导入依赖
  • 异常

    • redis.clients.jedis.exceptions.JedisConnectionException: Failed to create socket.

      • redis配置中bind可能设置的127.0.0.1,也就是只能本地访问,将bind设置修改成0.0.0.0
      • 防火墙
    • redis.clients.jedis.exceptions.JedisDataException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients.

      • 原因是

        • bind配置被去掉了,没有配置
      • 解决方案(以下任一方法都可)

        • 命令关闭保护模式

          config set protected-mode no

          config rewrite //让配置永久生效

        • 修改配置文件关闭保护模式

          protected-mode no

        • 启动参数关闭保护模式

          --protected-mode no

        • 配置一个bind地址或者设置一个授权密码

# lettuce

  • 特点

    • Synchronous API

    • Asynchronous API

    • Reactive API

# Redisson

# SpringData

  • RedisTemplate

    使用RedisTemplate执行set之后,直连redis通过**keys ***查看数据会发现key前面有一些特殊字符

    原因是RedisTemplate默认使用JdkSerializationRedisSerializer作为序列化工具,按照某个规则在key前面加了什么字符但是通过redisTemplate取值时会得到预期的值,是对key做了相同的处理,如果要改变这种状况需要手动修改序列化方式

    @Autowired(required = false)
    public void setRedisTemplate(RedisTemplate redisTemplate) {
        RedisSerializer stringSerializer = new StringRedisSerializer();
        redisTemplate.setKeySerializer(stringSerializer);
        redisTemplate.setValueSerializer(stringSerializer);
        redisTemplate.setHashKeySerializer(stringSerializer);
        redisTemplate.setHashValueSerializer(stringSerializer);
        this.redisTemplate = redisTemplate;
    }
    
    1
    2
    3
    4
    5
    6
    7
    8
    9
  • StringRedisTemplate

  • 问题管理

    • **org.springframework.data.redis.RedisConnectionFailureException: Unable to connect to Redis; nested exception is io.lettuce.core.RedisConnectionException: Unable to connect to 192.168.137.101:6379**

      连接超时,偶尔能成功

      解决方案:spring.redis.timeout 不要设置为0

      如果是一直连接不上需要考虑是不是保护模式的问题或者防火墙