redis的java客户端
一、jedis
(1)写一个test的步骤
①首先引入依赖
查找与jdk版本适配的依赖
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>6.0.0</version> </dependency>
②建立连接
private Jedis jedis; @BeforeEach public void setUp() { jedis=new Jedis("192.168.88.140",6379); jedis.auth("123456"); jedis.select(0); }
③编写Test代码
@Test public void testString() { String result = jedis.set("name", "zhangsan"); System.out.println("result="+result); String name = jedis.get("name"); System.out.println("name="+name); }
④释放连接
@AfterEach public void tearDown() { if(jedis!=null) { jedis.close(); } }
(2)由于Jedis本身是线程不安全的,并且频繁的创建和销毁连接会有性能损耗,因此推荐大家使用Jedis连接池代替Jedis的直连方式(jedis连接池连接)
在后面需要使用Jedis时,可以通过JedisConnectionFactory.getJedis()来初始化Jedis对象
例如:private Jedis jedis;
jedis=JedisConnectionFactory.getJedis()
(3)使用SpringDataRedis
小缺陷:
在使用下面的代码操作redis数据库,给name赋值时,无法实现更改redis数据库中name的值,而是会多一个\xAC\xED\x00\x05t\x00\x04name的key,并且它的值也是乱码
//注入RedisTemplate操作redis数据库 @Autowired private RedisTemplate redisTemplate; @Test void testString() { redisTemplate.opsForValue().set("name","Rose"); Object name = redisTemplate.opsForValue().get("name"); System.out.println(name); }
效果如下图:
原因是:
这个问题是因为 RedisTemplate 默认使用了 JdkSerializationRedisSerializer 进行序列化导致的。当你使用 RedisTemplate 直接操作时,它会将键和值都进行序列化,所以你会看到类似 \xAC\xED\x00\x05t\x00\x04name
这样的二进制数据而不是原始的 "name" 键。
解决方法:
使用StringRedisTemplate 进行操作,同时自己手动进行序列化和反序列化
@Test void testJson() throws JsonProcessingException { User user =new User(); user.setName("连赛轩"); user.setAge(18); //手动对json数据进行转换,转换为String (序列化) String json = mapper.writeValueAsString(user); System.out.println("json="+json); System.out.println("-------------------"); //添加数据 stringRedisTemplate.opsForValue().set("user:100",json); //获取数据 String jsonUser = stringRedisTemplate.opsForValue().get("user:100"); //将获得到的String类型数据转换为User类型 User resultUser = mapper.readValue(jsonUser, User.class); System.out.println(resultUser); }