常见的redis问题
redis操作命令
启动redis,后面的是配置文件地址,不加就是默认的配置文件
./redis-server /home/redis/conf/redis.conf
关闭redis,查pid等于2234,kill掉
ps -ef | grep redis
kill 2234
远程登录
./redis-cli -h 127.0.0.1 -p 6379
>auth password
1. 启动redis,Fatal error, can’t open config file
【问题原因】
- config文件名称错误,不存在这个配置文件
- 没有这个config文件的权限
【解决办法】
确定Redis启动时指定是哪个配置文件,存在吗?并确认存在还有读写权限
2. ERR Client sent AUTH, but no password is set
【问题原因】
- 配置文件没有设置密码,你却用密码登录
- 选错了配置文件,或者没选中指定的配置文件,以默认的配置文件启动了
【解决办法】
确认用的配置文件存在不?有没有配置密码?
【拓展】
- 将protected-mode 修改为 no,默认为yes
开启保护模式,开启保护模式又没有配置bind,将只能本地访问,其他的ip访问不了这个redis。 - 将默认的bind 127.0.0.1注释掉,或改为0.0.0.0 允许外部访问。
- 将daemonize 改为no 关闭守护进程方式启动,其实就是关闭后台启动,退出redis就关了,一般服务器都是yes,后台启动。
- 配置redis密码,配置文件中加上requirepass 密码
3. 有很多aof的临时文件,占用磁盘太多
【问题原因】
内存不够导致aof重写失败,临时文件1失败创建临时文件2,一直反复失败导致生成大量重写失败的临时文件。
正常重写文件会在重写完成后改名覆盖掉之前的文件,这样就不会有临时文件长存。
【解决办法】
提升内存配置或者删掉无用的key,清理redis内存,让服务又充足的运行内存
4. redis数据有很多乱码\x0E\x005(奇怪的字符,其实是ASCII)
【问题原因】
这是因为RedisTemplate序列化方式不对,默认的是jdk,建议直接用StringRedisTemplate
【解决办法】
private void setSerializer(RedisTemplate template) {
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
template.setKeySerializer(stringRedisSerializer);
template.setValueSerializer(stringRedisSerializer);
template.setHashValueSerializer(stringRedisSerializer);
template.setHashKeySerializer(stringRedisSerializer);
}
其实StringRedisTemplate就默认了的
public class StringRedisTemplate extends RedisTemplate<String, String> {
public StringRedisTemplate() {
this.setKeySerializer(RedisSerializer.string());
this.setValueSerializer(RedisSerializer.string());
this.setHashKeySerializer(RedisSerializer.string());
this.setHashValueSerializer(RedisSerializer.string());
}
public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
this();
this.setConnectionFactory(connectionFactory);
this.afterPropertiesSet();
}
protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
return new DefaultStringRedisConnection(connection);
}
}
使用后记得debug看是否生效!!!
使用后记得debug看是否生效!!!
使用后记得debug看是否生效!!!
我就是不生效,在使用前手动set
5. Redis错误(MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist )
【问题原因】
Redis配置为保存RDB数据库快照,不能持久化到硬盘。可能是磁盘满了或者读写权限的问题。简而言之就是Redis认为持久化出了问题。直接关了就可以。
【解决办法】
127.0.0.1:6379> LPOP key
(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist on disk.
127.0.0.1:6379> config set stop-writes-on-bgsave-error no
OK
127.0.0.1:6379> LPOP key
99