Linux
通过wget下载redis资源失败
- 命令:wget http://download.redis.io/releases/redis-2.8.3.tar.gz
- 描述:这一步是通过wget在redis官网中下载安装包,在这里失败了
- 原因:虚拟机中刚安装的centOS,没有wget软件,安装一下就好
- 解决:yum -y install wget
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(好用!单独介绍)