springboot开发笔记(6.redis)

1.前言

springboot添加redis的String、hash、sorted set操作。发现有个小坑,整一整总结一下。
代码地址:https://github.com/bjjoy/joy_bms

2.准备

(1)下载redis(如果是windows需要下载windows版本)
(2)如果是windows下载RedisDesktopManager,看着方便点。
(3)具体配置参数请参考代码的properties文件
请参考https://blog.csdn.net/bjjoy2009/article/details/78725398

3.目录结构

这里写图片描述
说明:通过RedisConfig配置redistemplate,其它三个类封装了一下redis对应数据结构添加、读取等操作。
(1)RedisHashService:hash操作
(2)RedisPojoService:String类型key、实体类作为value(就是string,value序列化为json字符串)
(3)RedisSortedSetService:sorted set相关操作。

4.代码

(1)RedisConfig.java
通过springboot @Configuration注解创建RedisTemplate,主要是最下面的@Bean。将key、value、hashKey、hashValue设置了json序列化,保证传入Object转为json字符串存入redis。

@Configuration
@EnableCaching
public class RedisConfig {

    @Bean
    public KeyGenerator keyGenerator() {
        return (target, method, params) -> {
            StringBuilder sb = new StringBuilder();
            sb.append(target.getClass().getName());
            sb.append(method.getName());
            for (Object obj : params) {
                sb.append(obj.toString());
            }
            return sb.toString();
        };
    }

    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        //设置缓存过期时间
        //rcm.setDefaultExpiration(60);//秒
        return rcm;
    }

    @Bean
    public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory factory) {
        StringRedisTemplate template = new StringRedisTemplate(factory);
        template.afterPropertiesSet();
        return template;
    }

    /**
     * 修改key、value和HashKey、HashValue序列化
     * 可以直接将Object直接转为json写入redis
     * @param factory
     * @return
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate();
        template.setConnectionFactory(factory);
        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);
        template.setKeySerializer(jackson2JsonRedisSerializer);
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.setHashKeySerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

(2)hash部分操作RedisHashService.java

@Service
public class RedisHashService {

    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    public void put(String key, String mapKey, Object object){
        HashOperations<String, String, Object> operations = redisTemplate.opsForHash();
        operations.put(key, mapKey, object);
    }

    public long increment(String key, String mapKey, long i){
        HashOperations<String, String, Object> operations = redisTemplate.opsForHash();
        return operations.increment(key, mapKey, i);
    }
}

(3)测试代码test\JoyBmsApplicationTests.java

@RunWith(SpringRunner.class)
@SpringBootTest
public class JoyBmsApplicationTests {

    @Autowired
    RedisPojoService redisPojoService;

    @Autowired
    RedisHashService redisHashService;

    @Autowired
    RedisSortedSetService redisSortedSetService;

    @Test
    public void contextLoads() {
        CurrentUser a = new CurrentUser();
        a.setLoginName("123");
        a.setMobile("1234");
//      redisHashService.increment("test_key1", "map_key", 1);
//      redisHashService.put("test_key", "map_key", a);
//      redisPojoService.set("test_pojo",a);
//      redisPojoService.increment("test_222", 3);
//      redisSortedSetService.zAdd("ztest", a, 8);
//      redisSortedSetService.zAdd("ztest", "user2", 4);
        Set<Object> ztest = redisSortedSetService.range("ztest",0, -1);
        Set<ZSetOperations.TypedTuple<Object>> ztest2 = redisSortedSetService.reverseRangeWithScore("ztest",0, -1);
        for (ZSetOperations.TypedTuple<Object> tmp : ztest2){
            if (tmp.getValue() instanceof CurrentUser) {
                CurrentUser b = (CurrentUser) tmp.getValue();
                System.out.println(b);
            }
            System.out.println(tmp.getScore());
            System.out.println(tmp.getValue());
        }
        System.out.println(ztest.isEmpty());
    }
}

5.总结

(1)只添加部分redis读写功能,其它需要的时候再加吧
(2)小坑:hash操作的时候,template.setKeySerializer(…),key不能设置为StringRedisSerializer,会报错。可以不设置使用默认值或者使用jackson2JsonRedisSerializer。
(3)上面设置的jackson2JsonRedisSerializer,可视化工具看到的是正常字符串。如果不设置的话,编码格式可能会有点问题,可视化工具中看到的是类似XA\09…类似这种编码。主要还是可以直接将java pojo实体类作为参数,比较方便。
(3)单纯操作string,还是用stringRedisTemplate那个bean吧。

猜你喜欢

转载自blog.csdn.net/bjjoy2009/article/details/79681380