redis-06 springBoot整合

Jedis

是redis官方推荐的java连接开发工具,使用java操作redis中间件。

springBoot整合

新版使用lettuce的库操作redis 连接池
RedisTemplate 所有的操作都需要序列化
1、导入依赖

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2、配置连接

spring.redis.host=12.70.0.1
spring.redis.port=6379

3、测试

@Autowired
private RedisTemplate redisTemplate;
// opsForValue() 操作字符串
// opsForList() 操作list
// opsForSet() 操作set
// opsForHash() 操作hash
@Test
void contextLoads() {
  redisTemplate.opsForValue().set("key", "value");
  redisTemplate.opsForValue().get("key")
  redisTemplate.opsForList().leftPush("listKey", “v1”,“v2”);
}

// 获取连接对象
RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
connection .flushDb();
connection.flushAll();

自定义redisTemplate

在源码中 RedisAutoConfiguration类中 返回的RedisTemplate 的Bean 如下

@Bean
@Conditiona10nMissingBean(name = 'redisTemplate')
pubic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory ) throws UnknownHostException {
    RedisTemplate<Object, Object> template = new RedisTemplate<>();
    template.setConnectionFactory( redisConnectionFactory );
    return template;
}

@Conditiona10nMissingBean(name = 'redisTemplate')的意思是只有当 Spring 容器中不存在名为 redisTemplate 的 Bean 时,当前被注解的配置才会生效(即创建这个 Bean)。看源码可知RedisTemplate的key也是Object 我们日常使用的时候会很不方便经常会需要强制转换,所以为了效率和开发便捷我们要自定义一个RedisTemplate类来替换掉它

@Configuration
public class RedisConfig {
    @Bean
    @SuppressWarnings("all")
    pubic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory ) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory( redisConnectionFactory );

        // 序列化配置
        // jackson的序列化
        Jackson2HsonRedisSerializer jackson2HsonRedisSerializer = new Jackson2HsonRedisSerializer (Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        // 使用ObjectMapper 进行转译
        jackson2HsonRedisSerializer.setObjectMapper(om);
        // string的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用string的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2HsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2HsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }
}

自定义一个redis工具类 RedisUtil

@Component
public final class RedisUtil {
    @Autowired
    private RedisTemplate<String, object> redisTemplate;
    // =================== common =====================
    /**
      * 指定缓存失效时间
      * @param key 键
      * @param time 时间(秒)
      */
    public boolean expire(String key, long time) {
        try {
            if (time > 0) {
                redisTemplate.expire(key, time, TimeUnit.SECONDS);
            }
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    // 根据key获取过期时间
    public long getExpire(String key) {
        return redisTemplate.getExpire(key, TimeUnit.SECONDS)
    }

    // 判断key是否存在
    public boolean hasKey(String key) {
        try {
            return redisTemplate.hasKey(key);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    // 删除缓存
    public void del(String... key) {
        if (key != null && key.length > 0) {
            if (key.length ==1) {
                redisTemplate.delete(key[0])
            } else {
                redisTemplate.delete(CollectionUtils.arrayToList(key));
            }
        }
    }

    // ==================== string ======================
    // 普通缓存获取
    public Object get(String key) {
      return key == null ? null : redisTemplate.opsForValue().get(key)
    }  
    
    //普通缓存写入
    public boolean set (String key, Object value) {
        try {
            redisTemplate.opsForValue().set(key, value);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    // 递增
    public long incr (String key, long delta) {
        if (delta < 0) {
            throw new RuntimeException("递增因子必须大于0");
        }
        return redisTemplate.opsForValue().increment(key, delta)
    }

    // 递减
    public long decr (String key, long delta) {
        if (delta < 0) {
            throw new RuntimeException("递减因子必须大于0");
        }
        return redisTemplate.opsForValue().increment(key, -delta)
    }
    
    // ===================== map =======================
    // HashGet
    public Object hget (String key, String item) {
        return redisTemplate.opsForHash().get(key, item);
    }

    // 获取hashKey对应的所有键值对
    public Map<Object, Object> hmget (String key) {
        return redisTemplate.opsForHash().entries(key);
    }

    // HashSet
    public boolean hmset (String key, Map<String, Object> map) {
        try {
            redisTemplate.opsForHash().pullAll (key, map);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
  ....
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容