Redis02-Springboot集成Redis

Redis02-Springboot集成Redis

1.RedisTemplateRedis事务操作

void redisTest01() {
    // redisTemplate不保证以相同的连接运行事务中的所有操作,即一个事务中的多个命令可能会被多个客户端运行。
    // 所以想要使用redisTemplate保证事务,就需要使用SessionCallback。
    // 或者使用 @EnableTransactionManagement 注解配置redisTemplate支持事务
    List<Object> txResults = redisTemplate.execute(new SessionCallback<List<Object>>() {
        public List<Object> execute(RedisOperations operations) throws DataAccessException {
            // multi 开启事务
            operations.multi();
            // 事务中的一些列操作
            operations.opsForValue().set("name", "tom");
            // 提交事务
            return operations.exec();
        }
    });

    //System.out.println(txResults);
    System.out.println(redisTemplate.opsForValue().get("name"));
}

2.RedisTemplate基本数据类型的操作

void redisTest02() {
    redisTemplate.opsForValue(); //  String
    redisTemplate.opsForHash(); // Hash
    redisTemplate.opsForList(); // List
    redisTemplate.opsForSet(); // Set
    redisTemplate.opsForZSet(); // ZSet

    redisTemplate.opsForGeo(); // Geospatial
    redisTemplate.opsForHyperLogLog(); //HyperLogLog

    // 操作数据库的连接
    redisTemplate.getConnectionFactory().getConnection().flushDb();
    redisTemplate.getConnectionFactory().getConnection().flushAll();

    // 切换数据库
    redisTemplate.getConnectionFactory().getConnection().select(0);
    
    // bitmap的操作
    byte[] key = new byte[10];
    redisTemplate.getConnectionFactory().getConnection().setBit(key, 1, true);
    // bitmap的操作
    redisTemplate.opsForValue().setBit("name", 1, true);
}

3.RedisTemplate保存对象

  1. 将对象转换为Json。
void redisTest03() {
    // Redis保存对象的方式一,将User转换为JSON字符串的形式保存,此时User不需要实现Serializable接口
    User user = new User();
    user.setId(1);
    user.setName("tom");

    String jsonString = JSON.toJSONString(user);
    redisTemplate.opsForValue().set("user:1", jsonString);

    // {"id":1,"name":"tom"}
    System.out.println(redisTemplate.opsForValue().get("user:1"));
}
  1. 直接保存对象
void redisTest04() {
    // Redis保存对象的方式二,直接保存User对象,此时User需要实现Serializable接口。
    // 如果没有实现Serializable接口。,会抛出异常。
    // DefaultSerializer requires a Serializable payload but received an object of type [com.my.springboot.pojo.User]
    User user = new User();
    user.setId(1);
    user.setName("tom");

    redisTemplate.opsForValue().set("user:2", user);

    // {"id":1,"name":"tom"}
    System.out.println(redisTemplate.opsForValue().get("user:2"));
}
  1. 序列化RedisTemplate
void redisTest05() {
    // Redis保存对象的方式三,在RedisConfig中定义Redis序列化方式。
    // 此时直接保存User对象,而User不需要实现Serializable接口,也不会报错,因为已经在
    // RedisConfig中定义了String类型的value的序列化方式。
    // 并且使用自定义序列化方式后,在Redis中保存的key和value也不会被转义。
    User user = new User();
    user.setId(1);
    user.setName("tom");

    redisTemplate.opsForValue().set("user:2", user);

    // {"id":1,"name":"tom"}
    System.out.println(redisTemplate.opsForValue().get("user:2"));
}

// 序列化RedisTemplate的配置
@Configuration
public class RedisConfig {

    /**
     * 自定义RedisTemplate,设置序列化的方式
     * @param redisConnectionFactory
     * @return
     */
    @Bean
    public RedisTemplate<Object, Object> template(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);

        // 使用Jackson2JsonRedisSerialize 替换默认序列化(默认采用的是JDK序列化)
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(mapper);

        StringRedisSerializer serializer = new StringRedisSerializer();
        // String的key使用StringRedisSerializer序列化方式
        redisTemplate.setKeySerializer(serializer);
        redisTemplate.setHashKeySerializer(serializer);

        // String的value使用Jackson2JsonRedisSerializer的序列化方式
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);

        // 将配置写入Properties文件
        //redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
}
posted @ 2021-11-21 19:55  行稳致远方  阅读(43)  评论(0)    收藏  举报