帶你學 Redis: 基本命令 String 操作(三)

前言

Redis 常用的數據結構有: String (字符串)、 List(列表)、Set(集合)、HashMap(哈希)、Sorted sets(有序集合)。不常用的有:Bitmaps(位圖)、Hyperloglogs 、Geospatial。本文主要介紹如何Redis 中 String 的操作介紹 。

Redis 所有的數據結構和Java 中的HashMap 一樣key 是唯一的並且這個key是一個字符串,然後通過唯一 key 值來獲取
value 數據。而我們所說的 string(字符串)、 list(列表)、set(集合)、hashmap(哈希)、sorted
sets(有序集合) 等說的是value 結構的差異。

String 命令操作介紹

字符串類型是Redis中最爲基礎的數據存儲類型,它是二進制安全的字符串,這就意味着它可以接受任何格式的數據。在Redis中字符串類型的value最多可以容納的數據長度是512M

關於string 內存分配大致原理如下:

Redis 的字符串是動態字符串,是可以修改的字符串,內部結構實現上類似於 Java 的
ArrayList,採用預分配冗餘空間的方式來減少內存的頻繁分配,如圖中所示,內部爲當前字符串實際分配的空間 capacity 一般要高於實際字符串長度 len。當字符串長度小於1M 時,擴容都是加倍現有的空間,如果超過 1M,擴容時一次只會多擴 1M 的空間。需要注意的是字符串最大長度爲 512M。

引用自:掘金小冊【Redis 深度歷險:核心原理與應用實踐】

Docs命令操作

set key value

向指定的key中添加 string 的value 返回ok,如果有則覆蓋。

>  SET mykey "Hello" 
OK
>  GET mykey 
"Hello"

get key

獲取指定key的value值,返回值是string 的 value。

>  SET mykey "Hello" 
OK
>  GET mykey 
"Hello"

append key value

向指定的key中value內容進行追加 返回值是 value 字符串的長度。

>  APPEND mykey "Hello" 
(integer) 5
>  APPEND mykey " World" 
(integer) 11
>  GET mykey 
"Hello World"

strlen key

獲取指定key中value字符串的長度

>  SET mykey "Hello world" 
OK
>  STRLEN mykey 
(integer) 11
>  STRLEN nonexisting 
(integer) 0

exists key

判斷指定 key 是否存在,如果存在返回 1 ,如果不存在返回 0。

>  EXISTS mykey 
(integer) 0
> set mykey "Hello" 
OK
> EXISTS mykey
1

incr key

對指定的 key 字符串進行遞增1 操作,返回值遞增後的值。value默認爲整數字符串。

>exists personcount
0
>incr personcount
1
>get personcount
1

incrby key value

對是整數的字符串遞增指定增加多少的操作,返回值遞增後的值。

>  SET mykey "10" 
OK
>  INCRBY mykey 5 
(integer) 15
redis>  

decr key

對指定的 key 字符串進行遞減1 操作,返回值遞減後的值。value默認爲整數字符串。

>  SET mykey "10" 
OK
>  DECR mykey 
(integer) 9

decrby key value

對是整數的字符串遞增指定增加多少的操作,返回值遞增後的值。

>  SET mykey "10" 
OK
>  DECRBY mykey 3 
(integer) 7

setex key seconds value

原子性完成兩個操作,一是設置該Key的值爲指定字符串,同時設置該Key在Redis服務器中的存活時間(秒數)。

>  SETEX mykey 10 "Hello" 
OK
>  TTL mykey 
(integer) 10
>  GET mykey 
"Hello"

setnx key value
如果指定的 key 不存在,則設定該 key 持有指定字符串 value,此時其效果等價於 set 命令。相反,如果該Key已經存在,該命令將不做任何操作並返回。 1表示設置成功,否則返回0。

>  SETNX mykey "Hello" 
(integer) 1
>  SETNX mykey "World" 
(integer) 0
>  GET mykey 
"Hello"

getset key value

原子性的設置 key 的新 value,同時返回該 key 原有值。和 get 命令一樣,該命令也只能處理string類型的 value,否則 Redis將給出相關的錯誤信息。如果該 key 之前並不存在,則返回nil。

>  SET mykey "Hello" 
OK
>  GETSET mykey "World" 
"Hello"
>  GET mykey 
"World"

setrange key, offset newValue

向key 中的 vlaue值中的指定角標中替換爲新的 value, 返回值是替換後的字符串的長度

>  SET key1 "Hello World" 
OK
>  SETRANGE key1 6 "Redis" 
(integer) 11
>  GET key1 
"Hello Redis"

getrange key start end

獲取指定 key 中 value 字符串從 start 到 end 角標的字符串的內容,返回值是截取字符串的內容。

>  SET mykey "This is a string" 
OK
>  GETRANGE mykey 0 3 
"This"
>  GETRANGE mykey -3 -1 
"ing"
>  GETRANGE mykey 0 -1 
"This is a string"
>  GETRANGE mykey 10 100 
"string"

mset key value key2 value2 … …

該命令原子性的完成參數中所有 key/value 的設置操作,其具體行爲可以看成是多次迭代執行 set 命令。 該命令不會失敗,始終返回值總是 string字符串 OK

>  MSET key1 "Hello" key2 "World" 
OK
>  GET key1 
"Hello"
>  GET key2 
"World"
> 

mget key key2 … …

返回所有指定keys 的 values 的值,如果其中某個key不存在,或者其值不爲string類型,該key的 value將返回nil。

>  SET key1 "Hello" 
OK
>  SET key2 "World" 
OK
>  MGET key1 key2 nonexisting 
1) "Hello"
2) "World"
3) (nil)

msetnx key value key2 value2 … …

該命令原子性的完成參數中所有 key value的設置操作,其具體行爲可以看成是多次迭代執行 setnx 命令。1表示所有key 都設置成功,0 則表示沒有任何 key 被修改。

>  MSETNX key1 "Hello" key2 "there" 
(integer) 1
>  MSETNX key2 "there" key3 "world" 
(integer) 0
>  MGET key1 key2 key3 
1) "Hello"
2) "there"
3) (nil)

keys key
該命令用於查詢 執行名稱的key 返回key的名稱列表。keys * 表示查詢所有的 key的列表。 key a * 表示查詢以a爲前綴的所有的key。

> keys *
1) a
2) mykey
3) personcount

>keys mykey
1) mykey

>keys mykey*
1) mykey

del key
刪除指定的 key 名稱的的key-value 信息,返回刪除的個數。

> keys *
1) a
2) mykey
3) personcount

> del a
1

> keys *
1) mykey
2) personcount

> keys * 
1) mykey
2) personcount
>del mykey personcount
2

>keys * 
>

Java 客戶端操作 Redis

Jedis 版本:

通過 Jedis客戶端連接Redis 的代碼請參考:玩轉 SpringBoot 2.x 之 快速集成 Jedis客戶端(普通版)

RedisTemplate 版本:

通過 Spring 提供 RedisTemplate 連接Redis 的代碼請參考:玩轉 SpringBoot 2.x 之 RedisTemplate 操作

小結

本文儘可能把Docs 命令下 String 操作介紹了一下,並沒有太多的去介紹 Java 客戶端的操作。因爲 Java 客戶端的操作實際上也是執行 最爲基礎的 Docs命令。具體 Java 客戶端操作就交給您去探索了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章