使用Java操作Redis

2年前 (2023) 程序员胖胖胖虎阿
173 0 0

📢📢📢📣📣📣

哈喽!大家好,我是【一心同学】,一位上进心十足的【Java领域博主】!😜😜😜

✨【一心同学】的写作风格:喜欢用【通俗易懂】的文笔去讲解每一个知识点,而不喜欢用【高大上】的官方陈述。

✨【一心同学】博客的领域是【面向后端技术】的学习,未来会持续更新更多的【后端技术】以及【学习心得】。

✨如果有对【后端技术】感兴趣的【小可爱】,欢迎关注一心同学】💞💞💞

❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️ 


目录

前言

一、准备步骤

二、Jedis连接Redis

三、基本操作

3.1 操作String数据类型

3.2 操作List数据类型

3.3 事务操作

四、SpringBoot集成Redis

4.1 介绍

4.2 集成Redis

4.3  保存对象

小结


前言

我们之前对Redis的学习都是在命令行窗口,那么如何使用Java来对Redis进行操作呢?官方对于Java连接Redis的开发工具推荐了Jedis,通过Jedis同样可以实现对Redis的各种操作。本篇文章会介绍基于Linux上的Redis的Java连接操作。

一、准备步骤

修改配置文件redis.conf:

(1)注释以下属性,因为我们是需要进行远程连接的:

#bind:127.0.0.1

(2)将protected-mode 设置为no

protected-mode no

(3)设置为允许后台连接

daemonize yes

注意:

远程服务器进行连接需要确保将以下三个步骤都完成:

(1)设置服务器的安全组开放6379端口

(2)防火墙开放端口:

firewall-cmd --zone=public --add-port=6379/tcp --permanet

(3)重启防火墙:

systemctl restart firewalld.service

二、Jedis连接Redis

(1)创建一个Maven项目,并导入以下依赖:

<dependencies>

    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.2.0</version>
    </dependency>

    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>fastjson</artifactId>
        <version>1.2.62</version>
    </dependency>

</dependencies>

(2)测试连接:

package com.yixin;

import redis.clients.jedis.Jedis;

public class RedisTest {
    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("服务器地址", 6379);
        String response = jedis.ping();
        System.out.println(response); // PONG
}

}

输出结果:

使用Java操作Redis

看到PONG说明我们成功连接上了我们服务器上的Redis了!

三、基本操作

3.1 操作String数据类型

package com.yixin;

import redis.clients.jedis.Jedis;

import java.util.Set;

public class Redis_String {

    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("服务器地址", 6379);
        String response = jedis.ping();
        System.out.println(response); // PONG

        //删除当前选择数据库中的所有key
        System.out.println("删除当前选择数据库中的所有key:"+jedis.flushDB());

        //Spring实例

        //设置 redis 字符串数据
        //新增<'name','yixin'>的键值对
        jedis.set("name", "yixin");
        // 获取存储的数据并输出
        System.out.println("redis 存储的字符串为: "+ jedis.get("name"));

        //判断某个键是否存在
        System.out.println("判断某个键是否存在:"+jedis.exists("name"));

        //系统中所有的键
        Set<String> keys = jedis.keys("*");
        System.out.println(keys);

        //按索引查询
        System.out.println("按索引查询:"+jedis.select(0));

        //查看键name所存储的值的类型
        System.out.println("查看键name所存储的值的类型:"+jedis.type("name"));

       // 随机返回key空间的一个
        System.out.println("随机返回key空间的一个:"+jedis.randomKey());
        //重命名key
        System.out.println("重命名key:"+jedis.rename("name","username"));
        System.out.println("取出改后的name:"+jedis.get("username"));

        //删除键username
        System.out.println("删除键username:"+jedis.del("username"));

        //删除当前选择数据库中的所有key
        System.out.println("删除当前选择数据库中的所有key:"+jedis.flushDB());
        //查看当前数据库中key的数目
        System.out.println("返回当前数据库中key的数目:"+jedis.dbSize());

        //删除数据库中的所有key
        System.out.println("删除所有数据库中的所有key:"+jedis.flushAll());

    }
}

输出:

3.2 操作List数据类型

package com.yixin;

import redis.clients.jedis.Jedis;

import java.util.List;

public class Redis_List {

    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("服务器地址", 6379);
        String response = jedis.ping();
        System.out.println(response); // PONG

      System.out.println("删除当前选择数据库中的所有key:"+jedis.flushDB());

        //List实例
        //存储数据到列表中
        jedis.lpush("list", "num1");
        jedis.lpush("list", "num2");
        jedis.lpush("list", "num3");
        
        // 获取存储的数据并输出
        List<String> list = jedis.lrange("list", 0 ,-1);
        for(int i=0; i<list.size(); i++) {
            System.out.println("列表项为: "+list.get(i));
        }
    }
}

输出结果:

使用Java操作Redis

3.3 事务操作

package com.yixin;

import com.alibaba.fastjson.JSONObject;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class Redis_Transaction {

    public static void main(String[] args) {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("服务器地址", 6379);
        String response = jedis.ping();
        System.out.println(response); // PONG

        //事务测试
        jedis.flushDB();
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("hello","world");
        jsonObject.put("name","yixin");

        //开启事务
        Transaction multi = jedis.multi();
        String result = jsonObject.toJSONString();
        // jedis.watch(result)
        try {
            multi.set("user1", result);
            multi.set("user2", result);
            int i = 1 / 0; // 代码抛出异常事务,执行失败!
            multi.exec(); // 执行事务!

        }catch (Exception e){
            multi.discard();// 放弃事务
            e.printStackTrace();
        }finally {
            System.out.println(jedis.get("user1"));
            System.out.println(jedis.get("user2"));
            jedis.close();
        }
    }
}

输出结果:

使用Java操作Redis

对于其他命令也基本类似,就不一一演示出来了,之前学过的Redis命令,在Java中同样可以进行使用。 

四、SpringBoot集成Redis

4.1 介绍

这次我们并不使用jedis来进行连接,而是使用lettuce来进行连接,jedis和lettuce的对比如下:

jedis:采用的直连,多个线程操作的话,是不安全的;想要避免不安全,使用jedis pool连接池。更像BIO模式

lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况;可以减少线程数量。更像NIO模式

4.2 集成Redis

(1)创建Spring Boot项目

(2)导入依赖

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

(3)编写配置文件

application.properties:

#配置redis
# Redis服务器地址
spring.redis.host=服务器地址
# Redis服务器连接端口
spring.redis.port=6379  
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0

(4)编写测试类

package com.yixin;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
class SpringbootRedisApplicationTests {

    @Autowired
    private RedisTemplate<String,String> redisTemplate;

    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("name","yixin");
        System.out.println(redisTemplate.opsForValue().get("name"));
    }


}

输出:

使用Java操作Redis

这样就已经成功连接了!

在这种连接方式中,redisTemplate操作着不同的数据类型,api和我们的指令是一样的

opsForValue:操作字符串 类似String

opsForList:操作List 类似List

opsForSet:操作Set,类似Set

opsForHash:操作Hash

opsForZSet:操作ZSet

opsForGeo:操作Geospatial

opsForHyperLogLog:操作HyperLogLog

除了基本的操作,我们常用的方法都可以直接通过redisTemplate操作,比如事务,和基本的CRUD

4.3  保存对象

(1)编写实体类

注意:要实现序列号Serializable

package com.yixin.pojo;

import java.io.Serializable;

public class User implements Serializable {
    private String name;
    private int age;

    public  User(){

    }
    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

(2)编写RedsTemplate配置

Tip:在开发当中,我们可以直接把这个模板拿去使用。

package com.yixin.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {

  @Bean
  @SuppressWarnings("all")
  public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {

      //为了自己开发方便,一般直接使用 <String, Object>
      RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
      template.setConnectionFactory(factory);

    // Json序列化配置
      Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
      ObjectMapper om = new ObjectMapper();
      om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
      om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
      jackson2JsonRedisSerializer.setObjectMapper(om);

      // String 的序列化
      StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();

      // key采用String的序列化方式
      template.setKeySerializer(stringRedisSerializer);
      // hash的key也采用String的序列化方式
      template.setHashKeySerializer(stringRedisSerializer);
      // value序列化方式采用jackson
      template.setValueSerializer(jackson2JsonRedisSerializer);
      // hash的value序列化方式采用jackson
      template.setHashValueSerializer(jackson2JsonRedisSerializer);
      template.afterPropertiesSet();

      return template;
  }


}

(3)存储对象

package com.yixin;

import com.yixin.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
class SpringbootRedisApplicationTests {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;



    @Test
    void contextLoads() {
        User user=new User("yixin",18);
        redisTemplate.opsForValue().set("user",user);
        System.out.println(redisTemplate.opsForValue().get("user"));

    }


}

输出结果: 

使用Java操作Redis


小结

以上就是【一心同学】讲解的使用【Java】对【Redis】操作的两种方式,如果担心【线程安全】的话,可以使用【lettuce】进行连接。

如果这篇【文章】有帮助到你,希望可以给【一心同学】点个👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点,如果有对【后端技术】感兴趣的小可爱,也欢迎关注❤️❤️❤️ 【一心同学】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!

版权声明:程序员胖胖胖虎阿 发表于 2023年3月20日 下午8:08。
转载请注明:使用Java操作Redis | 胖虎的工具箱-编程导航

相关文章

暂无评论

暂无评论...