Java 使用 Jedis 操作 Redis


Jedis 的 API 方法跟 Redis 的命令基本上完全一致,熟悉 Redis 的操作命令,自然就很容易使用 Jedis,因此官方也推薦 Java 使用 Jedis 來連接和操作 Redis 。由於我的電腦重裝了系統,暫時沒有安裝虛擬機來運行 Linux 環境,因此臨時采用 Windows 版本的 Redis 快速搭建環境。

本篇博客主要展示如何快速的使用 Jedis 連接和操作 Redis,在博客的最后面提供 demo 的源代碼。

Jedis 的官網地址:https://github.com/redis/jedis


一、快速搭建 Redis 環境

Windows 版本的 Redis 的官網:https://github.com/microsoftarchive/redis

其實就是微軟提供的 Redis 版本,目前最新版是 3.2.100,下載這個版本即可,下載地址為:

https://github.com/microsoftarchive/redis/releases/tag/win-3.2.100

下載 Redis-x64-3.2.100.zip 這個文件,解壓縮即可,運行 redis-server.exe 即可。

默認情況下 Redis 沒有設置密碼,可以通過 redis.windows.conf 這個配置文件進行配置,有關 Redis 配置文件的細節,這里不做介紹,網上資料一大堆。

這里就以本機無密碼的 Redis 快速搭建一個環境來介紹 Jedis 的使用。如果你想感覺每次手動啟動 Redis 比較麻煩的話,可以將 Redis 安裝成 Windows 服務,打開 cmd 命令行窗口,進入 Redis 的目錄,運行以下命令安裝 Redis 服務:

redis-server.exe  --service-install  redis.windows-service.conf

image

然后進入服務管理器,啟動 Redis 服務即可,如下圖所示:

image

進入 Redis 的目錄后可以運行下面的命令,也許對你有用:

# 卸載服務:
redis-server --service-uninstall

# 啟動服務:
redis-server --service-start

# 停止服務:
redis-server --service-stop

# 重命名服務名稱:
redis-server --service-name name

二、搭建工程

新建一個 maven 工程,並導入 Jedis 的 jar 包。

Jedis 的 jar 包地址為:https://mvnrepository.com/artifact/redis.clients/jedis

我導入的是最新的 Jedis 的 jar 包,另外為了方便測試,也導入了最新的 juint 的 jar 包,具體內容如下:

<!--導入 jedis 的 jar 包-->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>4.1.1</version>
</dependency>

<!--導入 junit 的 jar 包-->
<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
</dependency>

配置好引用的 jar 包后,打開右側的 Maven 窗口,刷新一下,這樣 Maven 會自動下載所需的 jar 包文件。

搭建好的項目工程整體目錄比較簡單,具體如下圖所示:

image

項目工程結構簡單介紹:

com.jobs.utils.jedisUtils 自己編寫的使用 Jedis 訪問 Redis 的工具類
resources 下的 redis.properties 是用來自定義 Jedis 連接池參數的配置文件

test 目錄下的文件介紹:
com.jobs.JedisTest 類是專門用來編寫 junit 單元測試方法,用來測試操作 Redis 的方法


三、細節展示

resources 下的 redis.properties 配置文件內容如下:

# 最大連接數
maxTotal=50
# 最大空閑連接數
maxIdel=10
# redis 服務器地址
host=localhost
# redis 服務器端口
port=6379

com.jobs.utils.jedisUtils 使用 Jedis 連接池編寫的工具類內容如下:

package com.jobs.utils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.ResourceBundle;

public class jedisUtils {

    //定義 Jedis 連接池
    private static JedisPool jp;

    static {
        /*
            //第一種獲取 properties 配置文件內容的方式
            InputStream is = jedisUtils.class
                .getClassLoader().getResourceAsStream("redis.properties");
            Properties prop = new Properties();
            try {
                prop.load(is);
            } catch (IOException e) {
                e.printStackTrace();
            }

            int maxTotal = Integer.parseInt(prop.getProperty("maxTotal"));
            int maxIdel = Integer.parseInt(prop.getProperty("maxIdel"));
            String host = prop.getProperty("host");
            int port = Integer.parseInt(prop.getProperty("port"));
         */

        //第二種獲取 properties 配置文件內容的方式
        ResourceBundle bundle = ResourceBundle.getBundle("redis");
        int maxTotal = Integer.parseInt(bundle.getString("maxTotal"));
        int maxIdel = Integer.parseInt(bundle.getString("maxIdel"));
        String host = bundle.getString("host");
        int port = Integer.parseInt(bundle.getString("port"));

        //配置 Jedis 連接池
        JedisPoolConfig jpc = new JedisPoolConfig();
        jpc.setMaxTotal(maxTotal);
        jpc.setMaxIdle(maxIdel);
        jp = new JedisPool(jpc, host, port);

        // 如果 redis 有密碼的話,使用這個初始化連接池(連接超時時間為 2000 毫秒)
        //jp = new JedisPool(jpc, host, port, 2000, "password");
        
        // 如果 redis 有密碼的話,並且想直接連接到 redis 的某個庫的話,使用該方法
        //jp = new JedisPool(jpc, host, port, 2000, "password",0);
    }

    //從連接池中獲取 Jedis 連接對象
    public static Jedis getJedis() {
        return jp.getResource();
    }
}

com.jobs.JedisTest 類是專門用來測試操作 Redis 的方法類,具體內容如下:

package com.jobs;

import com.jobs.utils.jedisUtils;
import org.junit.Test;
import redis.clients.jedis.Jedis;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class JedisTest {

    //測試字符串 String 數據類型
    @Test
    public void testString() {
        Jedis jedis = jedisUtils.getJedis();

        //設置
        jedis.set("name", "候胖胖");
        jedis.set("age", "40");

        //獲取
        String name = jedis.get("name");
        String age = jedis.get("age");

        System.out.println("name:" + name + ",age:" + age);
        jedis.close();
    }

    //測試列表 List 數據類型
    @Test
    public void testList() {

        Jedis jedis = jedisUtils.getJedis();
        //redis 的 list 可以作為隊列使用
        //從列表右邊添加數據
        jedis.rpush("fat", "任肥肥");
        jedis.rpush("fat", "侯胖胖");
        jedis.rpush("fat", "李墩墩");

        //獲取列表的容量大小
        long fatCount = jedis.llen("fat");
        System.out.println("列表數量:" + fatCount);

        //從左側逐個取數據
        for (int i = 0; i < fatCount; i++) {
            String fatMan = jedis.lpop("fat");
            System.out.println(fatMan);
        }

        jedis.close();
    }

    //測試散列 Hash 數據類型
    @Test
    public void testHash() {

        Jedis jedis = jedisUtils.getJedis();

        //redis 的 hash 比較適合存儲對象數據
        Map<String, String> user1 = new HashMap<>();
        user1.put("name", "侯胖胖");
        user1.put("age", "40");
        user1.put("kg", "80");

        Map<String, String> user2 = new HashMap<>();
        user2.put("name", "任肥肥");
        user2.put("age", "38");
        user2.put("kg", "90");

        jedis.hmset("user1", user1);
        jedis.hmset("user2", user2);

        //修改第一個用戶的年齡
        jedis.hset("user1", "age", "45");
        //修改第二個用戶的體重
        jedis.hset("user2", "kg", "100");

        //獲取兩個對象的屬性值
        Map<String, String> user111 = jedis.hgetAll("user1");
        Map<String, String> user222 = jedis.hgetAll("user2");
        System.out.println(user111);
        System.out.println(user222);

        jedis.close();
    }

    //測試集合 Set 數據類型
    @Test
    public void testSet() {
        Jedis jedis = jedisUtils.getJedis();

        //redis 的 set 跟 java 的 set 使用方式一樣,重復的元素只保留一個
        jedis.sadd("aaa", "a", "b", "c", "x", "y", "z", "a", "x");
        jedis.sadd("bbb", "b", "c", "d", "e", "f", "y", "b", "e");

        //獲取交集
        Set<String> sinter = jedis.sinter("aaa", "bbb");
        System.out.println("交集:" + sinter);

        //獲取並集
        Set<String> sunion = jedis.sunion("aaa", "bbb");
        System.out.println("並集:" + sunion);

        //獲取 aaa 相對於 bbb 的差集(存在於 aaa 但不存在與 bbb 的元素)
        Set<String> sdiff = jedis.sdiff("aaa", "bbb");
        System.out.println("aaa 相對於 bbb 的差集:" + sdiff);

        jedis.close();
    }

    //測試有序集合 Sorted Set (ZSet) 數據類型
    @Test
    public void testZset() {
        Jedis jedis = jedisUtils.getJedis();

        //redis 的 zSet 比較適合做排行榜

        //粉絲投票
        Map<String, Double> fans = new HashMap<>();
        fans.put("侯胖胖", 10d);
        fans.put("李墩墩", 7d);
        fans.put("任肥肥", 6d);
        fans.put("喬豆豆", 12d);
        fans.put("楊重重", 8d);
        jedis.zadd("vote", fans);

        //修改任肥肥的投票數
        jedis.zadd("vote", 9d, "任肥肥");

        //zSet 默認是按照分值的升序排列
        List<String> vote1 = jedis.zrange("vote", 0, -1);
        System.out.println("投票數量升序排列:" + vote1);

        //獲取粉絲投票數量最多的前三個人
        List<String> vote2 = jedis.zrevrange("vote", 0, 2);
        System.out.println("投票數量倒序前 3 個人:" + vote2);

        jedis.close();
    }
}

到此為止,已經快速的演示了 Java 使用 Jedis 連接操作 Redis 常用的 5 種數據類型的示例。Jedis 提供的方法 API 基本上跟 Redis 的命令完全一致,有關 Redis 的命令使用細節,可以參考 Redis 的官網(https://redis.io)。

本篇博客的 demo 源代碼地址:https://files.cnblogs.com/files/blogs/699532/RedisDemo.zip




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM