网上非常常见的乱码,百度一搜大部分都是这种情况。如果不是此种情况请看下一节。
redis-cli
redis 127.0.0.1:6379> set 'name' '中文'
OK
redis 127.0.0.1:6379> get 'name'
"\xd6\xd0\xce\xc4"
redis 127.0.0.1:6379>
客户端查看乱码,这个情况我们只要将修改客户端命令行就可以。redis-cli --raw
redis-cli --raw
redis 127.0.0.1:6379> get 'name'
中文
redis 127.0.0.1:6379>
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RedisTest {
@Autowired
RedisTemplate<String, String> redisTemplate;
// @Autowired
// StringRedisTemplate redisTemplate;
@Test
public void testRedisTemplate(){
ValueOperations<String, String> valueOperation =
redisTemplate.opsForValue();
valueOperation.set("testname, "NO爷");
String testName = valueOperation.get("testname");
System.out.println(testName);//输出 NO爷
}
@Test
public void testJedis(){
Jedis jedis = new Jedis("192.168.130.247");
jedis.set("nickname", "NO爷");
String nickName = jedis.get("nickname");
System.out.println(nickName);//输出 NO爷
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RedisTest2 {
@Autowired
RedisTemplate<String, String> redisTemplate;
// @Autowired
// StringRedisTemplate redisTemplate;
@Test
public void testRedisTemplate(){
ValueOperations<String, String> valueOperation =
redisTemplate.opsForValue();
String testName = valueOperation.get("name");
System.out.println(testName);//输出 ����,不同地环境可能对其他乱码。
}
@Test
public void testJedis(){
Jedis jedis = new Jedis("192.168.130.247");
String nickName = jedis.get("name");
System.out.println(nickName);//输出 ����,不同地环境可能对其他乱码。
}
}
@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class,
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class RedisTest3 {
@Autowired
RedisTemplate<String, String> redisTemplate;
// @Autowired
// StringRedisTemplate redisTemplate;
@Test
public void testRedisTemplate() throws UnsupportedEncodingException {
RedisConnection connection =
redisTemplate.getConnectionFactory().getConnection();
byte[] name = connection.get("name".getBytes());
System.out.println(new String(name, "GBK"));// 输出 中文
}
@Test
public void testJedis() throws UnsupportedEncodingException {
Jedis jedis = new Jedis("192.168.130.247");
byte[] name = jedis.get("name".getBytes());
System.out.println(new String(name, "GBK"));// 输出 中文
}
}
/**
* RedisTemplate 代码片段
* 可以看到默认序列化类是使用JdkSerializationRedisSerializer,
* 这个也会导致程序读取乱码。
*/
public void afterPropertiesSet() {
super.afterPropertiesSet();
boolean defaultUsed = false;
if (this.defaultSerializer == null) {
this.defaultSerializer = new JdkSerializationRedisSerializer(this.classLoader != null ? this.classLoader : this.getClass().getClassLoader());
}
if (this.enableDefaultSerializer) {
if (this.keySerializer == null) {
this.keySerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.valueSerializer == null) {
this.valueSerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.hashKeySerializer == null) {
this.hashKeySerializer = this.defaultSerializer;
defaultUsed = true;
}
if (this.hashValueSerializer == null) {
this.hashValueSerializer = this.defaultSerializer;
defaultUsed = true;
}
}
if (this.enableDefaultSerializer && defaultUsed) {
Assert.notNull(this.defaultSerializer, "default serializer null and not all serializers initialized");
}
if (this.scriptExecutor == null) {
this.scriptExecutor = new DefaultScriptExecutor(this);
}
this.initialized = true;
}
/**
* StringRedisTemplate 源码
* 在初始构造时使用了StringRedisSerializer类来实现序列化,
* 一般Redis如果存储的数据没有特殊的话都是使用这个。
*/
public class StringRedisTemplate extends RedisTemplate<String, String> {
public StringRedisTemplate() {
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
this.setKeySerializer(stringSerializer);
this.setValueSerializer(stringSerializer);
this.setHashKeySerializer(stringSerializer);
this.setHashValueSerializer(stringSerializer);
}
public StringRedisTemplate(RedisConnectionFactory connectionFactory) {
this();
this.setConnectionFactory(connectionFactory);
this.afterPropertiesSet();
}
protected RedisConnection preProcessConnection(RedisConnection connection, boolean existingConnection) {
return new DefaultStringRedisConnection(connection);
}
}
/**
* StringRedisSerializer 源码
*/
public class StringRedisSerializer implements RedisSerializer<String> {
private final Charset charset;
public StringRedisSerializer() {
this(Charset.forName("UTF8"));
}
public StringRedisSerializer(Charset charset) {
Assert.notNull(charset, "Charset must not be null!");
this.charset = charset;
}
public String deserialize(byte[] bytes) {
return bytes == null ? null : new String(bytes, this.charset);
}
public byte[] serialize(String string) {
return string == null ? null : string.getBytes(this.charset);
}
}
/**
* 使用带有GBK编码的构造实例化StringRedisSerializer,
* 正如所料,正确读取到中文数据。
*/
@Test
public void testRedisTemplate(){
RedisSerializer<String> stringSerializer = new StringRedisSerializer(Charset.forName("GBK"));
redisTemplate.setKeySerializer(stringSerializer);
redisTemplate.setValueSerializer(stringSerializer);
redisTemplate.setHashKeySerializer(stringSerializer);
redisTemplate.setHashValueSerializer(stringSerializer);
ValueOperations<String, String> valueOperation = redisTemplate.opsForValue();
String name = valueOperation.get("name");
System.out.println(name);//输出 中文
}