前话
为啥要自定义RedisTemplate ?
因为默认的RedisTemplate使用JdkSerializationRedisSerializer序列化。
用JdkSerializationRedisSerializer序列化的话,被序列化的对象必须实现Serializable接口。在存储内容时,除了属性的内容外还存了其它内容在里面(比如转义字符等),总长度长,且不容易阅读。所有我们可以使用自定义RedisTemplate来避免这一问题。
为啥封装java中Redis操作
因为java原生的Redis操作代码过长,而且这些操作使用频率又高,所有完全可以自己封装一下,提高代码阅读性。
自定义RedisTemplate
官方依据:
@Bean
@ConditionalOnMissingBean(name = {"redisTemplate"})//如果存在名称为redisTemplat的bean就不会调用该方法生成新的bean
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
RedisTemplate中的四种序列化器
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer keySerializer = null;
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer valueSerializer = null;
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashKeySerializer = null;
@SuppressWarnings("rawtypes") private @Nullable RedisSerializer hashValueSerializer = null;
RedisSerializer的几个实现类
自定义RedisTemplate
/**
* @ClassName RedisConfig
* @Description: 自定义RedisTemplate
* @Author ldg
* @Date 2020/5/27 16:37
* @Version V1.0
**/
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
//常用<String,Object>
RedisTemplate<String, Object> redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置默认序列化方式 可以是:Jackson2JsonRedisSerializer GenericJackson2JsonRedisSerializer
redisTemplate.setDefaultSerializer(new GenericJackson2JsonRedisSerializer());
//声明字符串序列化方式
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
//设置key以字符串序列化
redisTemplate.setKeySerializer(stringRedisSerializer);
redisTemplate.setHashKeySerializer(stringRedisSerializer);
return redisTemplate;
}
}
Redis操作简易封装
/**
* @ClassName RedisTool
* @Description: 对java中Redis的一些操作的封装
* @Author ldg
* @Date 2020/5/27 17:50
* @Version V1.0
**/
@Component
public class RedisTool {
@Autowired
RedisTemplate redisTemplate;
/**
* String值的写入
* @param key 键
* @param value 值
*/
public void set(String key, String value) {
redisTemplate.opsForValue().set(key, value);
}
/**
* String值获取
* @param key
* @return
*/
public Object get(String key) {
return redisTemplate.opsForValue().get(key);
}
/**
*Hash值的全部写入
* @param key
* @param map
*/
public void hSetAll(String key,Map map)
{
redisTemplate.opsForHash().putAll(key,map);
}
/**
* Hash值一个一个写入
* @param key 键
* @param filed hash中的键
* @param value hash中的值
*/
public void hSet(String key,String filed,String value)
{
redisTemplate.opsForHash().put(key,filed,value);
}
/**
* 获取Hash中的一个值
* @param key 键
* @param hashKey Hash中的键
* @return
*/
public Object hGet(String key,String hashKey)
{
return redisTemplate.opsForHash().get(key,hashKey);
}
/**
* 获取Hash中多个值
* @param key 键
* @param collection Hash中多给键
* @return
*/
public List<Object> hGetAll(String key, Collection<String> collection)
{
return redisTemplate.opsForHash().multiGet(key,collection);
}
}
注意一下:Redis服务端如果部署再云服务器上,那么redis.config文件中的bind ip是指绑定服务器的网卡ip (一般有两个:一个是127.0.0.1,还有一个是服务器所给的内网ip)
测试截图