【redis】使用redis出现的问题汇总

Linux

通过wget下载redis资源失败

make安装解压完的redis安装包失败

  • 命令:make
  • 描述:make: cc: Command not found make: * [adlist.o] Error 127
  • 原因:没有安装gcc软件
  • 解决:yum install gcc

make执行失败

  • 命令:make
  • 描述:
Selecting a non-default memory allocator when building Redis is done by setting    
the `MALLOC` environment variable. Redis is compiled and linked against libc    
malloc by default, with the exception of jemalloc being the default on Linux    
systems. This default was picked because jemalloc has proven to have fewer    
fragmentation problems than libc malloc.    

To force compiling against libc malloc, use:    

    % make MALLOC=libc    

To compile against jemalloc on Mac OS X systems, use:    

    % make MALLOC=jemalloc
  • 原因:分配器相关,具体未知
  • 解决:make MALLOC=libc

redis-cli输入后敲命令没有反应

  • 命令:./redis-cli
  • 描述:进入redis后敲命令回车没有任何反应
  • 原因:估计和server的启动方式有关
  • 解决:将配置文件 redis.conf 中的 “daemonize no” 这行配置改成 “daemonize yes”,然后redis启动服务的时候要带有配置文件的方式启动,不要用默认配置。如:”./redis-server ../redis.conf”。这个修改的配置是redis以守护进程的方式启动,改和不改有个明显的区别就是,不是守护进程启动(默认)启动,启动时可以看到redis的图形界面,而已守护进程的方式启动,则输入完以后没有反应直接到新的命令行。用 “ps a” 命令可以看到 “redis-server” 的进程已经启动

Java

Redis (error) NOAUTH Authentication required.

  • 描述:new Jedis() 成功,但是调用 ping() 方法的时候失败,抛出这个异常
  • 原因:redis开启了保护模式,需要密码才能操作
  • 解决:找到 redis.conf ,在里面加一下密码。
requirepass password#你自己的密码

然后在使用 jedis 中,

Jedis jedis = new Jedis("localhost");
jedis.auth("password");//这里输入你配置的密码
System.out.println(jedis.ping());//输出 PONG 表示成功

jedis 连接超时

Exception in thread "main" redis.clients.jedis.exceptions.JedisConnectionException: java.net.ConnectException: Connection refused: connect
    at redis.clients.jedis.Connection.connect(Connection.java:207)
    at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:93)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:126)
    at redis.clients.jedis.Connection.sendCommand(Connection.java:117)
    at redis.clients.jedis.BinaryClient.auth(BinaryClient.java:564)
    at redis.clients.jedis.BinaryJedis.auth(BinaryJedis.java:2138)
    at Main.main(Main.java:10)
Caused by: java.net.ConnectException: Connection refused: connect
    at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
    at java.net.Socket.connect(Socket.java:589)
    at redis.clients.jedis.Connection.connect(Connection.java:184)
    ... 6 more
  • 描述:new Jedis() 成功,但是调用 ping() 方法的时候失败,抛出这个异常
  • 原因:端口填错了,应该是6379,写了6371。。。
  • 解决:检查出端口错误,修改后可以成功
  • PS:查看网上相关的解决方法,基本上都是关闭linux防火墙,注释掉绑定ip

ERR Operation against a key holding the wrong kind of value

  • 描述:用 get() 方法获取 value 值时抛出这个异常
  • 原因:要获取的 key 值时一个 hash 结构,不能用 get 获取
  • 解决:用 hgetAll 可以获取里面的所有 k-v 对
  • PS:为了防止出现这个问题,可以设计一个工具类,通过统一的方式获取,关键点是在获取之前进行判断是什么类型的
//这是获取类型,如果是 hash 就会返回 "hash" 字符串
String type = jedis.type("man");
if ("hash".equals(type)) {
    //TODO 取值逻辑
} else if ("string".equals(type)) {
    //TODO 取值逻辑
} else {
    ...
}

使用 RedisTemplate 保存数据时 key 多出来 \xac\xed\x00\x05t\x00\x011 之类的编码

  • 描述:在使用 RedisTemplate 的 string 类型数据保存的时候
ValueOperations<String, String> vo = redisTemplate.opsForValue();
vo.set("test", "value1");

保存成功,用 redis-cli 查看 key 的时候出现的是带有奇怪编码的key

127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x01test"
  • 原因:查资料说是序列化有问题,不指定的情况下用 JdkSerializationRedisSerializer ,是这个 RedisSerializer 导致了这些奇怪代码的产生
  • 解决:在 RedisTemplate 使用前进行 RedisSerializer 的指定
@Autowired private RedisTemplate redisTemplate;

@Autowired(required = false)
public void setRedisTemplate(RedisTemplate redisTemplate) {
    RedisSerializer stringSerializer = new StringRedisSerializer();
    redisTemplate.setKeySerializer(stringSerializer);
    redisTemplate.setValueSerializer(stringSerializer);
    redisTemplate.setHashKeySerializer(stringSerializer);
    redisTemplate.setHashValueSerializer(stringSerializer);
    this.redisTemplate = redisTemplate;
}

ps:
RedisSerializer 有好几种,了解一下?

1)StringRedisSerializer

2)Jackson2JsonRedisSerializer

3)JdkSerializationRedisSerializer

4)GenericToStringSerializer

5)OxmSerializer

6)FastJsonRedisSerializer(好用!单独介绍)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值