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吧。