问题背景:项目中使用的是RedisTemplate,使用set接口向Redis插入数据后,使用Redis客户端可视化工具或者命令行,根据get接口获取key字符串对应的value值,居然为空。
思路:项目插入Redis的db、和客户端或命令行的db,不是同一个db。
Redis默认db有16个,是从0到15,可以修改Redis的redis.conf配置文件中的database值进行变更,Redis不会限制最大的数据库数量,但是会限制最小数据库数量为1个
项目里面配置的db是1,于是在命令行输入 select 1 切换到db为1的数据库,然后再使用命令 get key字符串,居然还是为空。由于是开发环境,Redis没有禁用keys等相关危险的命令。
生产环境的Redis,一定要将KEYS、FLUSHALL、FLUSHDB、CONFIG危险的命令给禁用。在redis中修改配置文件redis.conf找到
SECURITY
区域,并找到rename-command命令禁用属性,禁用命令
rename-command KEYS ""
rename-command FLUSHALL ""
rename-command FLUSHDB ""
rename-command CONFIG ""重命名命令
rename-command KEYS "XXXXX"
rename-command FLUSHALL "XXXXX"
rename-command FLUSHDB "XXXXX"
rename-command CONFIG "XXXXX"这样可以定义新命令,然后在客户端就不会执行危险命令了
参考文档:https://blog.csdn.net/wfy2695766757/article/details/95751044
禁用后如果需要使用【keys *】命令,可以使用【scan/sscan/zscan/hscan】命令
使用 keys *key字符串* 查询所有key,发现key前面居然加了一串类似这种 \xAC\xED\x00\x05t\x00\x97 不认识的东西, 原来是Redis序列化原因导致的。在项目中配置redis的序列化和反序列化,解决问题。
/**
* redis模板,存储key是字符串,值jackson2JsonRedisSerializer是序列化后的值
* @param
* @return org.springframework.data.redis.core.RedisTemplate
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(connectionFactory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
//Jackson版本原因,2.9使用下面这个
// objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
//使用StringRedisSerializer来序列化和反序列化redis的key值
RedisSerializer redisSerializer = new StringRedisSerializer();
//key
redisTemplate.setKeySerializer(redisSerializer);
redisTemplate.setHashKeySerializer(redisSerializer);
//value
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
redisTemplate.afterPropertiesSet();
return redisTemplate;
}