Redis入門教程(三)— Java中操作Redis

来源:http://www.cnblogs.com/liufei-kuaile/archive/2017/08/29/7447513.html
-Advertisement-
Play Games

在Redis的官網上,我們可以看到Redis的Java客戶端眾多 ![Redis客戶端][pic1] 其中,Jedis是Redis官方推薦,也是使用用戶最多的Java客戶端。 開始前的準備 使用jedis使用到的jedis 2.1.0.jar, "點擊下載" 如果使用Redis連接池的話,需要com ...


在Redis的官網上,我們可以看到Redis的Java客戶端眾多

Redis客戶端

其中,Jedis是Redis官方推薦,也是使用用戶最多的Java客戶端。

開始前的準備

創建項目

  1. 首先創建一個新的Java Project,命名為Jedis(你也可以給它你喜愛的名字)
  2. 在項目中新建一個Folder(文件夾),命名為“lib”
  3. 將jedis-2.1.0.jar、commons-pool-1.5.4.jar、junit-4.10.jar複製到lib文件夾下
  4. 選中文件夾或者三個jar文件,右擊找到Build Path,選擇菜單下的Add to Build Path加入到Build Path中

開始擼代碼

繼續之前,請務必閱讀過Redis入門教程(二)—基本數據類型,這將對你有很大的幫助。


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

import org.junit.Before;
import org.junit.Test;

import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.Jedis;

/**
 * @author dotleo
 *
 */
public class Jedis_Test {
    
    //Java中操作Redis的對象
    private Jedis jedis ;
    
    @Before
    public void connection() {
        
        //連接Redis伺服器,參數1為ip,參數2為埠號,請根據自己實際情況賦值
        jedis = new Jedis("192.168.1.233",6379);
    }
    
    /**
     * redis字元串操作
     */
    @Test
    public void stringTest() {
        
        //為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
        //特別註意:在開發中請勿如此操作
        jedis.flushDB();
        
        //添加字元串
        jedis.set("age", "101");
        System.out.println("age = " + jedis.get("age"));
        //批量添加字元串
        jedis.mset("age1","1","age2","2");
        System.out.println("age1 = " + jedis.get("age1"));
        System.out.println("age2 = " + jedis.get("age2"));
        //添加字元串(僅在不存在時)
        jedis.setnx("price", "101");
        System.out.println("price = " + jedis.get("price"));
        //加1操作
        jedis.incr("price");
        System.out.println("price = " + jedis.get("price"));
        //拼接字元串
        jedis.append("age", "years");
        System.out.println("age = " + jedis.get("age"));
        //截取字元串
        String str = jedis.getrange("age", 0L, 5L);
        System.out.println("age[0,5] = " + str);
        //獲取字元串長度
        Long len = jedis.strlen("age");
        System.out.println("age length = " + len);
        //刪除字元串
        jedis.del("age");
        System.out.print("age = " + jedis.get("age"));
    }
    
    /**
     * redis哈希操作
     */
    @Test
    public void hashTest() {
        
        //為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
        //特別註意:在開發中請勿如此操作
        jedis.flushDB();
        
        //添加值
        jedis.hset("student", "name", "zhangsan");
        //添加值(僅在不存在時)
        jedis.hsetnx("student", "age", "12");
        //批量添加值
        Map<String,String> map = new HashMap<String,String>();
        map.put("sex", "boy");
        map.put("address", "beijing");
        jedis.hmset("student", map);
        //獲取值
        String str = jedis.hget("student", "name");
        System.out.println("student:name = " + str);
        //批量獲取值
        List<String> list = jedis.hmget("student", "name","age");
        System.out.println("student:name = " + list.get(0));
        System.out.println("student:age = " + list.get(1));
        //獲取key
        Set<String> set = jedis.hkeys("student");
        System.out.println("student keys:");
        for (String string : set) {
            System.out.println(string);
        }
        //獲取值
        list = jedis.hvals("student");
        System.out.println("student vals:");
        for (String string : list) {
            System.out.println(string);
        }
        //獲取key和值
        map = jedis.hgetAll("student");
        System.out.println("student keys vals:");
        for (String key:map.keySet()) {
            System.out.println(key + " = " + map.get(key));
        }
        //刪除值
        jedis.hdel("student", "sex");
        System.out.println("student:sex = " + jedis.hget("student", "sex"));
        //獲取長度
        Long len = jedis.hlen("student");
        System.out.println("student length = " + len);
    }
    
    /**
     * redis列表操作
     */
    @Test
    public void listTest() {
        
        //為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
        //特別註意:在開發中請勿如此操作
        jedis.flushDB();
        
        //表頭添加
        jedis.lpush("student", "xiaoli","xiaowang","xiaoliu","xiaozhang");
        //表尾添加
        jedis.rpush("student", "zhangsan","lisi","wangwu");
        //通過索引獲取元素
        String str = jedis.lindex("student", 1L);
        System.out.println("student 1st = " + str);
        //在元素前或者後插入元素
        jedis.linsert("student", LIST_POSITION.BEFORE, "xiaozhang", "zhangsan");
        //從表頭彈出
        str = jedis.lpop("student");
        System.out.println("student first = " + str);
        //從表尾彈出
        str = jedis.rpop("student");
        System.out.println("student end = " + str);
        //刪除
        jedis.lrem("student", 2, "zhangsan");
        //獲取所有值
        List<String> list = jedis.lrange("student", 0L, -1L);
        System.out.println("student vals:");
        for (String string : list) {
            System.out.println(string);
        }
    }
    
    /**
     * redis集合操作
     */
    @Test
    public void setTest() {

        //為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
        //特別註意:在開發中請勿如此操作
        jedis.flushDB();
        
        //添加成員
        jedis.sadd("student", "zhangsan","lisi");
        jedis.sadd("monitor","wangwu","zhangsan");
        //獲取成員數
        Long count = jedis.scard("student");
        System.out.println("student count = " + count);
        //獲取成員
        Set<String> set = jedis.smembers("student");
        System.out.println("student members:");
        for (String string : set) {
            System.out.println(string);
        }
        //是否為該集合的成員
        boolean bool = jedis.sismember("student", "zhangsan");
        System.out.println("member zhangsan exist?\n" + bool);
        //交集
        set = jedis.sinter("student","monitor");
        System.out.println("student inter monitor members:");
        for (String string : set) {
            System.out.println(string);
        }
        //並集
        set = jedis.sunion("student","monitor");
        System.out.println("student union monitor members:");
        for (String string : set) {
            System.out.println(string);
        }
        //補集
        set = jedis.sdiff("student","monitor");
        System.out.println("student diff monitor members:");
        for (String string : set) {
            System.out.println(string);
        }
        //隨機返回成員
        String str = jedis.srandmember("student");
        System.out.println("random member:\n" + str);
        //移動成員
        jedis.smove("student", "monitor", "lisi");
        //刪除成員
        jedis.srem("monitor", "zhangsan");
        //顯示
        set = jedis.smembers("student");
        System.out.println("student members:");
        for (String string : set) {
            System.out.println(string);
        }
        set = jedis.smembers("monitor");
        System.out.println("monitor members:");
        for (String string : set) {
            System.out.println(string);
        }
    }
    
    /**
     * redis有序集合操作
     */
    @Test
    public void sortSetTest() {

        //為避免多次運行Redis中存在鍵,導致結果不符合預期,每次執行時清理當前庫
        //特別註意:在開發中請勿如此操作
        jedis.flushDB();
        
        //添加成員
        Map<Double,String> map = new HashMap<Double,String>();
        map.put(50d, "zhangsan");
        map.put(60d, "lisi");
        map.put(70d, "wangwu");
        map.put(80d, "zhaoliu");
        map.put(90d, "yangqi");
        map.put(120d, "xiaoming");
        map.put(130d, "xiaozhang");
        map.put(140d, "xiaoli");
        map.put(150d, "xiaoliu");
        jedis.zadd("score", map);
        //更新分數
        jedis.zadd("score", 100d, "zhangsan");
        //獲取成員的分數值
        Double dou = jedis.zscore("score", "zhangsan");
        System.out.println("zhangsan score :\n" + dou);
        //按照成員分數小到大返回索引區間的成員
        Set<String> set = jedis.zrange("score", 0, -1);
        System.out.println("score member order:");
        for (String string : set) {
            System.out.println(string);
        }
        //按照成員分數大到小返回索引區間的成員
        set = jedis.zrevrange("score", 0, -1);
        System.out.println("score member reverse:");
        for (String string : set) {
            System.out.println(string);
        }
        //按照成員分數小到大返回分數值區間的成員
        set = jedis.zrangeByScore("score", 50d, 80d);
        System.out.println("score member order:");
        for (String string : set) {
            System.out.println(string);
        }
        //返回有序集合中指定成員的索引
        Long index = jedis.zrank("score", "xiaoliu");
        System.out.println("xiaoliu index is:\n" + index);
    }
}

如果你讀過我的Redis入門教程(二)—基本數據類型,你會發現上面這些命令在其中都有提及,只是諸如參數傳遞的形式、返回值的類型等有少許不同,但方法名和文中的指令完全相同,其他方面也大同小異。因此在上面的代碼中並沒有像文章中一樣儘可能多的列出所有的函數,還需你自己勤於練習、摸索。

Redis連接池


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

/**
 * @author dotleo
 *
 */
public class RedisUtil {

    //Redis伺服器ip地址
    private static final String IP_ADDRESS = "192.168.1.233";
    
    //Redis埠號
    private static final int PORT = 6379;
    
    //可用連接實例的最大數目,預設值為8;
    //如果賦值為-1,則表示不限制;如果pool已經分配了maxActive個jedis實例,則此時pool的狀態為exhausted(耗盡)。
    private static final int MAX_ACTIVE = 1024;
    
    //控制一個pool最多有多少個狀態為idle(空閑的)的jedis實例,預設值也是8。
    private static final int MAX_IDLE = 200;
    
    //等待可用連接的最大時間,單位毫秒,預設值為-1,表示永不超時。如果超過等待時間,則直接拋出JedisConnectionException;
    private static final int MAX_WAIT = 10000;
    
    //在borrow一個jedis實例時,是否提前進行validate操作;如果為true,則得到的jedis實例均是可用的;  
    private static boolean TEST_ON_BORROW = true;
    
    //Jedis連接池對象
    private static JedisPool jedisPool = null;
    
    
    /**
     * 初始化連接池
     */
    static {
        try {
            JedisPoolConfig conf = new JedisPoolConfig();
            conf.setMaxActive(MAX_ACTIVE);
            conf.setMaxIdle(MAX_IDLE);
            conf.setMaxWait(MAX_WAIT);
            conf.setTestOnBorrow(TEST_ON_BORROW);
            jedisPool = new JedisPool(conf, IP_ADDRESS, PORT);
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }
    
     /**
     * 獲取Jedis實例
     * @return Jedis實例
     */
    public synchronized static Jedis getJedis() {  
         try {  
             if (jedisPool != null) {  
                 Jedis resource = jedisPool.getResource();  
                 return resource;  
             } else {  
                 return null;  
             }  
         } catch (Exception e) {  
             e.printStackTrace();  
             return null;  
         }  
     }
    
    /** 
     * 釋放jedis資源 
     * @param jedis Jedis對象 
     */  
     public static void returnResource(final Jedis jedis) {  
         if (jedis != null) {  
              jedisPool.returnResourceObject(jedis);  
         }  
     }  
}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1.創建存儲過程 CREATE PROCEDURE updateGatwxLiveStatus() BEGIN UPDATE gatwxlive SET STATUS = '3'WHERE 1=1and `status`='1'and liveurl='404'; END;2.查看job是否已開 s ...
  • 原文地址: https://zhuanlan.zhihu.com/p/23309693 https://zhuanlan.zhihu.com/p/23293860 CTC:前向計算例子 這裡我們直接使用warp-ctc中的變數進行分析。我們定義T為RNN輸出的結果的維數,這個問題的最終輸出維度為al ...
  • 之前項目中需要寫一個sql,就是查出某個調研詳情中,選A答案,B答案,C答案...F答案的人各有多少人,這個sql也是費了很大的力氣才寫出來,故記下來,方便以後使用。 其中tbl_research_item為調研詳情表,tbl_user_research_item為用戶答題詳情表 由於每道調研的題目 ...
  • Myeclipse 新建數據源 一、打開myeclipse(打開了當我沒說) 二、在window選項中找到show view ,點擊other,輸入db,選擇DB Browser 三、在DB Browser 視窗 右鍵點擊 選擇new 四、出現下麵界面,填寫所需的信息 jia包下載地址:https: ...
  • 在最近的項目中,有用到動態執行sql語句,SQL為我們提供了兩種動態執行SQL語句的命令,分別是EXEC和sp_executesql;通常,sp_executesql則更具有優勢,它提供了輸入輸出介面,而EXEC沒有。還有一個最大的好處就是利用sp_executesql,能夠重用執行計劃,這就大大提 ...
  • 問題 通過「SHOW FULL PROCESSLIST」語句很容易就能查到問題SQL,如下: 說明:因為post和tag是多對多的關係,所以存在一個關聯表post_tag。 試著用EXPLAIN查詢一下SQL執行計劃(篇幅所限,結果有刪減): 下麵給出優化後的SQL,唯一的變化就是把連接方式改成了「 ...
  • oracle中通配符有 '_'和'%'當like '_ww%'時,會把'_'和'%'當作通配符使用導致查不出含有'_'和'%'的數據。這時用到轉譯字元 like '\_ww\%' escape '\' 這裡將'\'定義為轉譯字元,也可以定義為其他字元如果條件中本身含有轉譯字元則需要雙寫轉義字元'\\ ...
  • 函數coalesce(c1,c2,c3......cn);返回第一個不為null的值 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...