Redis的Java客户端

Redis的Java客户端

Jedis线程不安全,lettuce线程安全

Jedis

测试

引入依赖

<dependencies>
 <dependency>
 <groupId>redis.clients</groupId>
 <artifactId>jedis</artifactId>
 <version>3.7.0</version>
 </dependency>
 <dependency>
 <groupId>org.junit.jupiter</groupId>
 <artifactId>junit-jupiter</artifactId>
 <version>5.7.0</version>
 </dependency>
</dependencies>

Test.java

public class JedisTest {
 private Jedis jedis;
 @BeforeEach
 void setUp() {
 //1.建立连接
 jedis=new Jedis("192.168.164.128",6379);
 //2.设置密码
 jedis.auth("123456");
 //3.选择库
 jedis.select(0);
 }
 @Test
 void testString() {
 //存入
 String result=jedis.set("name","熊哥");
 System.out.println("result="+result);
 //获取
 String name=jedis.get("name");
 System.out.println("name="+name);
 //存入
 jedis.hset("user:1","name","Jack");
 jedis.hset("user:1","age","21");
 //获取
 Map<String, String> map = jedis.hgetAll("user:1");
 System.out.println(map);
 }
 @AfterEach
 void tearDown() {
 //关闭连接
 if(jedis!=null){
 jedis.close();
 }
 }
}

Jedis连接池

Jedis本身是线程不安全的,且频繁的创建和销毁连接有性能损耗,因此推荐使用Jedis连接池代替Jedis直接连接

JedisConnectionFactory.java

public class JedisConnectionFactory {
 //连接池对象
 private static final JedisPool jedisPool;
 //初始化
 static {
 //配置连接池
 JedisPoolConfig poolConfig = new JedisPoolConfig();
 poolConfig.setMaxTotal(8); //最大8个连接
 poolConfig.setMaxIdle(8); //最大空闲数量
 poolConfig.setMinIdle(0); //最小空闲数量
 poolConfig.setMaxWaitMillis(1000); //当池内没有返回对象时最大等待时间
 //创建连接池对象(JedisPoolConfig,ip,port,timeout,password)
 jedisPool=new JedisPool(poolConfig,"192.168.164.128",6379,1000,"123456");
 }
 public static Jedis getJedis(){
 return jedisPool.getResource();
 }
}

Test.java(改变建立连接的语句)

public class JedisTest {
 private Jedis jedis;
 @BeforeEach
 void setUp() {
 //1.建立连接
// jedis=new Jedis("192.168.164.128",6379);
 jedis= JedisConnectionFactory.getJedis();
 //2.设置密码
 jedis.auth("123456");
 //3.选择库
 jedis.select(0);
 }
 @Test
 void testString() {
 //存入
 String result=jedis.set("name","熊哥");
 System.out.println("result="+result);
 //获取
 String name=jedis.get("name");
 System.out.println("name="+name);
 //存入
 jedis.hset("user:1","name","Jack");
 jedis.hset("user:1","age","21");
 //获取
 Map<String, String> map = jedis.hgetAll("user:1");
 System.out.println(map);
 }
 @AfterEach
 void tearDown() {
 //关闭连接
 if(jedis!=null){
 jedis.close();
 }
 }
}

SpringDataRedis

SpringDataRedis中提供RedisTemplate工具类,封装了各种对Redis的操作。springboot2.x以前默认支持Jedis,以后默认支持lettuce

依赖

<!--redis-->
<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--common-pool-->
<dependency>
 <groupId>org.apache.commons</groupId>
 <artifactId>commons-pool2</artifactId>
</dependency>

application.yaml

spring:
 redis:
 host: 192.168.164.128
 port: 6379
 password: 123456
 database: 0
 lettuce:
 pool:
 max-active: 8
 max-idle: 8
 min-idle: 0
 max-wait: 100ms

Test.java

@SpringBootTest
class RedisDemoApplicationTests {
 @Resource
 private RedisTemplate redisTemplate;
 @Test
 void contextLoads() {
 //写入一条String数据
 redisTemplate.opsForValue().set("name","王五");
 //获取
 Object name=redisTemplate.opsForValue().get("name");
 System.out.println(name);
 }
}

序列化以实现跨平台存储(在上面的基础上修改)

添加配置类RedisConfig.java

@Configuration
public class RedisConfig {
 @Bean
 public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
 //创建RedisTemplate对象
 RedisTemplate<String, Object> template = new RedisTemplate<>();
 //设置连接工厂
 template.setConnectionFactory(connectionFactory);
 //创建JSON序列化工具
 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
 //设置Key的序列化
 template.setKeySerializer(RedisSerializer.string());
 template.setHashKeySerializer(RedisSerializer.string());
 //设置Value的序列化
 template.setValueSerializer(jsonRedisSerializer);
 template.setHashValueSerializer(jsonRedisSerializer);
 //返回
 return template;
 }
}

Test.java中修改下面这行

private RedisTemplate<String,Object> redisTemplate;

若linux下还是显示乱码,在启动客户端时最后加上 --raw

StringRedisTemplate(上面的经典白学)

Spring默认提供了一个StringRedisTemplate类,它的key和value的序列化方式默认是String方式。省去了自定义RedisTemplate的过程

Test.java

@SpringBootTest
public class RedisStringTest {
 @Autowired
 private StringRedisTemplate stringRedisTemplate;
 @Test
 void contextLoads() {
 //写入一条String数据
 stringRedisTemplate.opsForValue().set("name","王五");
 //获取
 Object name=stringRedisTemplate.opsForValue().get("name");
 System.out.println(name);
 }
}
作者:我没有bug原文地址:https://www.cnblogs.com/LoginX/p/Login_X60.html

%s 个评论

要回复文章请先登录注册