Redis 筆記之 Java 操作 Redis(Jedis)

環境準備

引入依賴

<!--引入jedis連接依賴-->
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>2.9.0</version>
</dependency>

創建 jedis 對象

Centos 7 關閉防火牆:

systemctl stop firewalld.service

開啓遠程連接:詳見 Redis入門之Redis安裝、配置及常用指令

/**
 * 測試 Redis 連接
 */
public class TestRedis {
    public static void main(String[] args) {
        // 1.創建 jedis 對象
            // redis服務必須關閉防火牆
            // redis服務必須開始遠程連接
        Jedis jedis = new Jedis("192.168.3.65", "6379");
        // 2.執行相關操作
        jedis.select(0); // 選擇操作的數據庫, 默認0號
        // ......
        // 3.釋放資源
        jedis.close();
    }
}

操作 Key 相關 API

DEL 指令

  • 語法 : DEL key [key ...]
  • 作用 : 刪除給定的一個或多個 key,不存在的 key 會被忽略。
  • 可用版本: >= 1.0.0
  • 返回值: 被刪除 key 的數量。

EXISTS 指令

  • 語法: EXISTS key
  • 作用: 檢查給定 key 是否存在。
  • 可用版本: >= 1.0.0
  • 返回值: 若 key 存在,返回1 ,否則返回0。

EXPIRE 指令

  • 語法: EXPIRE key seconds
  • 作用: 爲給定 key 設置生存時間(秒),當 key 過期時(生存時間爲 0),它會被自動刪除。
  • 可用版本: >= 1.0.0
  • 時間複雜度: O(1)
  • 返回值:設置成功返回 1 。

KEYS 指令

  • 語法 : KEYS pattern
  • 作用 : 查找所有符合給定模式 pattern 的 key 。
  • 語法:
    KEYS *:匹配數據庫中所有 key 。
    KEYS h?llo:匹配 hello ,hallo 和 hxllo 等。
    KEYS h*llo:匹配 hllo 和 heeeeello 等。
    KEYS h[ae]llo: 匹配 hello 和 hallo ,但不匹配 hillo 。特殊符號用 \ 隔開
  • 可用版本: >= 1.0.0
  • 返回值: 符合給定模式的 key 列表。

MOVE 指令

  • 語法 : MOVE key db
  • 作用 : 將當前數據庫的 key 移動到給定的數據庫 db 當中。
  • 可用版本: >= 1.0.0
  • 返回值: 移動成功返回 1 ,失敗則返回 0 。

PEXPIRE 指令

  • 語法 : PEXPIRE key milliseconds
  • 作用 : 這個命令和 EXPIRE 命令的作用類似,但是它以 毫秒 爲單位設置 key 的生存時間
    EXPIRE 以秒爲單位)
  • 可用版本: >= 2.6.0
  • 時間複雜度: O(1)
  • 返回值:設置成功,返回1。key 不存在或設置失敗,返回0

PEXPIREAT 指令

  • 語法 : PEXPIREAT key milliseconds-timestamp
  • 作用 : 這個命令和 EXPIREAT 命令類似,但它以 毫秒 爲單位設置 key 的過期 unix 時間戳(EXPIREAT 以秒爲單位)
  • 可用版本: >= 2.6.0
  • 返回值:如果生存時間設置成功,返回 1 。當 key 不存在或沒辦法設置生存時間時,返回 0 。
    (查看EXPIRE 命令獲取更多信息)

TTL 指令

  • 語法 : TTL key
  • 作用 : 以秒爲單位,返回給定 key 的剩餘生存時間(TTL, time to live)。
  • 可用版本: >= 1.0.0
  • 返回值:
    當 key 不存在時,返回 -2 。
    當 key 存在但沒有設置剩餘生存時間時,返回 -1 。
    否則,以秒爲單位,返回 key 的剩餘生存時間。
  • Note : Redis 2.8 以前,當 key 不存在,或者 key 沒有設置剩餘生存時間時,命令都返回 -1 。

PTTL 指令

  • 語法 : PTTL key
  • 作用 : 這個命令類似於 TTL 命令,但它以毫秒爲單位返回 key 的剩餘生存時間
    (TTL 以秒爲單位)
  • 可用版本: >= 2.6.0
  • 返回值: 當 key 不存在時,返回 -2 。當 key 存在但沒有設置剩餘生存時間時,返回 -1 。
  • 否則,以毫秒爲單位,返回 key 的剩餘生存時間。
  • 注意 : Redis 2.8 以前,當 key 不存在,或者 key 沒有設置剩餘生存時間時,命令都返回 -1 。

RANDOMKEY 指令

  • 語法 : RANDOMKEY
  • 作用 : 從當前數據庫中隨機返回(不刪除) 一個 key 。
  • 可用版本: >= 1.0.0
  • 返回值:當數據庫不爲空時,返回一個 key 。當數據庫爲空時,返回 nil

RENAME 指令

  • 語法 : RENAME key newkey
  • 作用 : 將 key 改名爲 newkey 。
    當 key 和 newkey 相同,或者 key 不存在時,返回一個錯誤。
    當 newkey 已經存在時,RENAME 命令將覆蓋舊值。
  • 可用版本: >= 1.0.0
  • 返回值: 改名成功時提示OK ,失敗時候返回一個錯誤。

TYPE 指令

  • 語法 : TYPE key
  • 作用 : 返回 key 所儲存的值的類型。
  • 可用版本: >= 1.0.0
  • 返回值:
    none:key 不存在
    string:字符串
    list:列表
    set:集合
    zset:有序集
    hash:哈希表
public class TestKeys {
    private Jedis jedis;
    @Before
    public void before() {
    	// 連接開啓了redis服務的虛擬機
        jedis = new Jedis("192.168.3.65", 6379);
    }
    @After
    public void after() {
        jedis.close();
    }
    @Test
    public void testKeys() {
        // 刪除一個key
        jedis.del("name");
        // 刪除多個key
        jedis.del("name", "age");

        // 設置一個key
        jedis.set("age", "hello");

        // 判斷一個key是否存在
        Boolean name = jedis.exists("name");
        System.out.println(name);

        // 設置一個key超時時間
        Long age = jedis.expire("age", 100);
        System.out.println(age);

        // 獲取一個key超時時間
        Long ttl = jedis.ttl("age");
        System.out.println(ttl);

        // 隨機獲取一個key
        String s = jedis.randomKey();

        // 修改key名稱
        jedis.rename("age", "newage");

        // 查看對應值的類型
        String type1 = jedis.type("name");
        System.out.println(type1);
        String type2 = jedis.type("maps");
        System.out.println(type2);
    }
}

操作 String 相關 API

命令 說明
set 設置一個key/value
get 根據key獲得對應的value
mset 一次設置多個key value
mget 一次獲得多個key的value
getset 獲得原始key的值,同時設置新值
strlen 獲得對應key存儲value的長度
append 爲對應key的value追加內容
getrange 索引0開始 截取value的內容
setex 設置一個key存活的有效期(秒)
psetex 設置一個key存活的有效期(毫秒)
setnx 存在不做任何操作,不存在添加
msetnx原子操作(只要有一個存在不做任何操作) 可以同時設置多個key,只要有一個存在都不保存
decr 進行數值類型的-1操作
decrby 根據提供的數據進行減法操作
incr 進行數值類型的+1操作
incrby 根據提供的數據進行加法操作
incrbyfloat 根據提供的數據加入浮點數
public class TestString {
    private Jedis jedis;
    @Before
    public void before() {
        jedis = new Jedis("192.168.3.65", 6379);
    }
    @After
    public void after() {
        jedis.close();
    }
    @Test
    public void testString() {
        jedis.set("name", "zhenyu"); // set

        String name = jedis.get("name"); // get
        System.out.println(name);

        jedis.mset("content", "好人", "address", "蘇州市"); // mset

        List<String> mget = jedis.mget("name", "content", "address"); // mget
        mget.forEach(v -> System.out.println("v = " + v));

        String set = jedis.getSet("name", "yusael");
        System.out.println(set);

        // ...
    }
}

操作 List 相關 API

命令 說明
lpush 將某個值加入到一個key列表頭部
lpushx 同lpush,但是必須要保證這個key存在
rpush 將某個值加入到一個key列表末尾
rpushx 同rpush,但是必須要保證這個key存在
lpop 返回和移除列表左邊的第一個元素
rpop 返回和移除列表右邊的第一個元素
lrange 獲取某一個下標區間內的元素
llen 獲取列表元素個數
lset 設置某一個指定索引的值(索引必須存在)
lindex 獲取某一個指定索引位置的元素
lrem 刪除重複元素
ltrim 保留列表中特定區間內的元素
linsert 在某一個元素之前,之後插入新元素
public class TestList {
    private Jedis jedis;
    @Before
    public void before() {
        jedis = new Jedis("192.168.3.65", 6379);
    }
    @After
    public void after() {
        jedis.close();
    }
    @Test
    public void testList() {

        jedis.flushDB(); // 清除當前數據庫

        jedis.lpush("names1", "1", "2", "3", "4", "5"); // lpush
        jedis.rpush("names1", "a", "b", "c", "d", "e"); // rpush

        List<String> names1 = jedis.lrange("names1", 0, -1);
        names1.forEach(v -> System.out.println("name = " + v));

        String name = jedis.lpop("names1"); // lpop rpop
        System.out.println(name); // 5

        System.out.println(jedis.llen("names1")); // llen

        // names1 中 2 左邊插入一個 world
        Long linsert = jedis.linsert("names1", BinaryClient.LIST_POSITION.BEFORE, "2", "world");// linsert
        System.out.println("linsert: " + linsert);
        names1 = jedis.lrange("names1", 0, -1);
        names1.forEach(v -> System.out.println("name = " + v));

        // ...
    }
}

操作 Set 的相關 API

命令 說明
sadd 爲集合添加元素
smembers 顯示集合中所有元素 無序
scard 返回集合中元素的個數
spop 隨機返回一個元素 並將元素在集合中刪除
smove 從一個集合中向另一個集合移動元素 必須是同一種類型
srem 從集合中刪除一個元素
sismember 判斷一個集合中是否含有這個元素
srandmember 隨機返回元素
sdiff 去掉第一個集合中其它集合含有的相同元素
sinter 求交集
sunion 求和集
public class TestSet {
    private Jedis jedis;
    @Before
    public void before() {
        jedis = new Jedis("192.168.3.65", 6379);
    }
    @After
    public void after() {
        jedis.close();
    }
    @Test
    public void testSet() {
        jedis.sadd("names","zhangsan", "lisi");

        Set<String> names = jedis.smembers("names");
        names.forEach(v -> System.out.println("v = " + v));

        Boolean sismember = jedis.sismember("names", "zhenyu");
        System.out.println(sismember);
    }
}

操作 ZSet 相關 API

命令 說明
zadd 添加一個有序集合元素
zcard 返回集合的元素個數
zrange 升序 zrevrange 降序 返回一個範圍內的元素
zrangebyscore 按照分數查找一個範圍內的元素
zrank 返回排名
zrevrank 倒序排名
zscore 顯示某一個元素的分數
zrem 移除某一個元素
zincrby 給某個特定元素加分
public class TestZSet {
    private Jedis jedis;
    @Before
    public void before() {
        jedis = new Jedis("192.168.3.65", 6379);
    }
    @After
    public void after() {
        jedis.close();
    }
    @Test
    public void testZSet() {
        jedis.zadd("zset", 8, "張三");
        jedis.zadd("zset", 5, "李四");
        jedis.zadd("zset", 7, "王五");
        jedis.zadd("zset", 2, "趙六");
        jedis.zadd("zset", 33, "Win7");
        jedis.zadd("zset", 6, "Win8");
        jedis.zadd("zset",  77, "Win9");

        Set<String> names = jedis.zrange("zset", 0, -1);
        names.forEach(v -> System.out.println("v = " + v +", zscore = " + jedis.zscore("zset", v)));

        Long zcard = jedis.zcard("zset");
        System.out.println(zcard);

        names = jedis.zrangeByScore("zset", "0", "100", 0, 5);
        names.forEach(v -> System.out.println("v = " + v +", zscore = " + jedis.zscore("zset", v)));
    }
}

操作 Hash 相關 API

命令 說明
hset 設置一個key/value對
hget 獲得一個key對應的value
hgetall 獲得所有的key/value對
hdel 刪除某一個key/value對
hexists 判斷一個key是否存在
hkeys 獲得所有的key
hvals 獲得所有的value
hmset 設置多個key/value
hmget 獲得多個key的value
hsetnx 設置一個不存在的key的值
hincrby 爲value進行加法運算
hincrbyfloat 爲value加入浮點值
public class TestHash {
    private Jedis jedis;
    @Before
    public void before() {
        jedis = new Jedis("192.168.3.65", 6379);
    }
    @After
    public void after() {
        jedis.close();
    }
    @Test
    public void testHash() {
        jedis.hset("maps","name","zhangsan");

        Map<String, String> map = new HashMap<>();
        map.put("age", "12");
        map.put("content", "好人");
        jedis.hmset("maps", map);

        String maps = jedis.hget("maps", "name");
        System.out.println(maps);
        Map<String, String> all = jedis.hgetAll("maps");
        all.forEach((k, v) -> System.out.println("k = " + k + ", v = " + v));
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章