滴水恩情 发表于 2022-12-1 12:51:48

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
依赖
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<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: 100msTest.java
@SpringBootTest
class RedisDemoApplicationTests {
    @Resource
    private RedisTemplate<String,Object> 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);
    }
}
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
页: [1]
查看完整版本: Redis的Java客户端