Redis 1 5種基本數據類型

Redis : Remote Dictionary Server 遠程字典服務器
一個高性能的key/value 的分佈式數據庫,滿足了CAP中的CP兩項特徵
特點:
內存的存儲和持久化:異步的將內存的數據寫到硬盤上,並且不影響程序的執行

生產環境下的redis 都是在linux 環境下運行,讀寫每秒高達幾萬次,這也說明了爲什麼他是一個分佈式的數據庫,用於海量數據的處理

https://github.com/CyC2018/CS-Notes/blob/master/notes/Redis.md 中文官方文檔

Redis 安裝使用的是6379 這個端口
Redis是一個單進程,單進程處理客戶端的請求
Redis 默認16個數據庫,庫號從0開始,初識默認使用0號庫
Select 命令可以切換數據庫: Select 庫號
Dbsize 命令:查看當前數據庫key 的數量
FlushDb : 清空當前數據庫
FlushAll :清空所有數據庫


Redis常用的數據類型詳解

常用的五大數據類型:String Hash List Set Zset (有序集合)

  1. String 是Redis 最基本的數據類型。String類型是二進制安全的, 意思是redis 的String 可以包括任何數據 ,圖片或者是序列化的對象。理論情況下一個 String類型的值最大512M
  2. Hash: 類似Java中的Map, 特別適用於對象的存儲,類似於Java中的map<String,Object>
  3. List(列表) : 有序的字符串列表,按照插入順序排序,可以添加一個元素在列表的頭部或者尾部(底層是一個鏈表)
  4. Set(集合):是String類型的無序集合,他是通過HashTable 實現的
  5. Zset(sorted set) : String類型的有序集合,排序的hash 有序集合,通過在值前面帶一個double 類型的分數達到排序的目的

常用的數據類型操作指令doc: http://redisdoc.com

Redis 鍵(Key) :

1. keys * :查詢當前庫中的所有key
2. exists keyName: 判斷是否有這個key 的存在
 exists apple ;存在一個值爲apple 的key 返回1,不存在返回
3. move keyName db : 將這個key 從當前庫中移除
4. expire keyName 秒鐘: 爲給定的key 設置過期時間
5. ttl keyName : 查看看這個key 還有多久過期,-1表示永不過期;-2表示已經過期。過期的key 就會被從當前庫中移除
6. type keyName : 判斷當前key 的類型
7. set keyName  value : 設置數據,如果對同一個key 重複設置,後面的value 會覆蓋前面的value
8. get keyName: 獲取給定key 的value 值
9. del keyName : 從當前庫刪除這個key

一:String

  1. append : 給指定的key 對應的value 添加上指定的內容
 例如: k3 ty
 redis>append k3 123456
 redis>get k3
 ->ty123456
  1. strlen : 當前key 對應的value 值的長度
  2. incr 自增一/decr 自減一/incrby 加上多少/decrby 減去多少: 這兩個操作的前提是 value 必須是數字
 例如: k3 12
 redis>incr k3
 redis>get k3
 ->13
 redis>decr k3
 redis> get k3
 ->12
 redis> incrby k3 3
 redis> get k3
 ->15
 redis>decrby k3 5
 ->10
  1. getrange/setrange : 獲取/設置某個索引範圍內的數據,獲取值含頭含尾,設置從偏移量offset 開始
    負數偏移量表示從字符串的末尾開始計數,-1 表示最後一個字符,依次類推-2 表示倒數第二個字符
    設置
例如 k3 hello12345
	redis>getrange k3 0 5
	->hello1
	redis>setrange k3 0 xxx
	->xxxlo12345
不存在的key 當作空白字符串處理
	redis>exists k4
	->0
	redis>set k4 3 hello
	->\x00\x00\x00hello
  1. setex : 設置鍵值對對的時候順便設置存活的時間
格式 setex key 秒 value
redis>setex k3 10 12 
key 爲k3 值爲12 的這個鍵值對存活的時間是 12s
  1. setnx : set if not exsits 如果這個鍵值對不存在那麼就進行設置,如果存在就不設置,返回失敗0
  2. mset/mget/msetnx : 同時對多個鍵值對進行操作
同時設置多個鍵值對:
redis>mset k1 v1 k2 v2
redis>msetnx : 如果每一對鍵值對都不存在這個語句纔會執行成功,如果有部分鍵值對存在,另外一部分鍵值對不存在,那麼這個語句完全不執行
例如:已存在鍵值對 k3 apple
   redis>msetnx k3 n3 k4 n4 
   這個語句無法執行
  1. getset : 先獲取再覆值
    如果key 值存在,新值覆蓋舊值,並返回舊值;如果key 不存在那麼直接返回 nil ;如果key 存在的但是不是字符串命令執行返回一個錯誤

二:List

  1. lpush/rpush : 將一個值插入到表頭/表尾,數據以空格分開,返回的是列表中的數據的個數
redis> LPUSH keyList python
(integer) 1
redis> LPUSH keyList value1
  1. lrange : 返回列表指定區間的元素 索引都是從0 開始 ,也可以使用負數索引-1 表示最後一個數據
按照上面的方式設置list 數據,將數據輸出
redis>lrange keyList 0 -1
1) "value1"
2) "python"
  1. rpop/lpop : 從右邊/左邊彈出一個數據返回的是被彈出的值,彈出之後相當於刪除
例如 按照1中的例子,現在keyList 對應的value : value1 pathon
    redis>lpush keyList english
    (integer) 3
    redis> rpop keyList
    "paython"
    redis>lpop keyList
    "english"
當key 不存在的時候返回nil   
  1. lindex : 獲取指定索引下標的元素(從上到下/從右到左),返回獲取的值,如果不是列表類型會報錯,index不在列表區間內(out of range)返回nil
redis> rpush keyList 1 2 3 4 5 6 7 8
(Integer)8
redis->lindex keyList 2
"3"
也可以使用負數索引-1 表示最後一個數
  1. lrem key N value : 刪除 N 個與value相等的元素 ,返回刪除的數據個數,key 不存在返回0,N 爲負數從列表的尾部開始
N>0: 從表頭開始搜索
N<0: 從表尾開始搜索
N=0: 刪除列表中所有與value 相等的值

redis> LPUSH greet "morning"
(integer) 1
redis> LPUSH greet "hello"
(integer) 2
redis> LPUSH greet "morning"
(integer) 3
redis> LPUSH greet "hello"
(integer) 4
redis> LPUSH greet "morning"
(integer) 5

redis> LRANGE greet 0 4         # 查看所有元素
1) "morning"
2) "hello"
3) "morning"
4) "hello"
5) "morning"

redis> LREM greet 2 morning     # 移除從表頭到表尾,最先發現的兩個 morning
(integer) 2                     # 兩個元素被移除
  1. ltrim key 開始的index 結束的index : 截取指定範圍內的值再賦值給key
redis>LPUSH list01 1 2 3 4 5 6 7 8
(integer)8
redis>ltrim list01 0 4
OK
redis>LRANGE list01 0 -1
1) "8"
2) "7"
3) "6"
4) "5"
5) "4"
  1. rpoplpush 源列表 目的列表 :從源列表的尾巴彈出一個數據添加到目的列表的頭部, 語句執行返回的是被彈出的數據,如果源列表不存在返回nil, 如果目的列表不存在,那麼直接創建
例如 : list01 :1 2 3 4 5 ;list02 :6 7 8 9
redis>rpoplpush list01 list02
"5"
redis>lrange list02
1) "5"
2) "6"
3) "7"
4) "8"
5) "9"
  1. lset key index value : 指定的位置賦值
例如: list01 :1 2 3 4 5 
redis> lset list01 2 x
OK
redis>lrange list01 0 -1
1) "5"
2) "6"
3) "x"
4) "8"
5) "9"
  1. linsert key before/after 值1 值2 :在某個值的前後插入一個值。 執行成功,返回完成插入操作之後列表的長度
例如: list01 :1 2 3 4 5 
redis>linsert list01 2 before x
(integer)6
redis>lrange list01 0 -1
1)"1"
2)"x"
3)"2"
4)"3"
5)"4"
6)"5"

性能總結:

  1. List 是一個字符串鏈表,left,right 都可以進行插入,添加
  2. 如果鍵不存在,創建新的鏈表
  3. 如果鍵已經存在,新增內容
  4. 如果值全部移除,對應的鍵也會全部消失(空值的list 沒有存在的意義)
  5. 對於鏈表進行操作無論是頭還是尾效率都極高,但是對於中間值進行操作效率就比較低

三:Set

字符串集合,數據不能重複

  1. sadd/smenbers/sismenber : 添加數據/顯示數據/判斷是否包含某個數據
sadd : 添加數據,執行成功返回的是成功被添加到set 中的數據個數
smenbers : 顯示集合中的所有的數據
sismenber v : 判斷

redis>sadd set01 1 1 2 2 3 3
(integer)3
redis>sadd set01 1
(integer)0     //重複添加

redis>smenbers set01
1)"1"
2)"2"
3)"3"

redis>sismenber set01 1
(integer)1
redis>siamenber set01 5
(integer)0
  1. scard setName : 獲取集合中數據的個數
  2. srem setName values: 刪除set 集合中的一個或者某個值,返回移除的數據的個數
例如 : set01 :1 2 3 4 
redis>srem set01 2 3
(integer)2
redis>smenbers set01
1)"1"
2)"4"

刪除不存在的元素語句無法執行。返回0,存在沒有數據的set
  1. srandmenber setName (count) :隨機返回set中的一個元素(count 個元素),帶數字count 時 返回的是一個數組,如果set 爲空,則返回一個空數組
redis> SADD fruit apple banana cherry
(integer) 3

# 只給定 key 參數,返回一個隨機元素

redis> SRANDMEMBER fruit
"cherry"

redis> SRANDMEMBER fruit
"apple"

# 給定 3 爲 count 參數,返回 3 個隨機元素
# 每個隨機元素都不相同

redis> SRANDMEMBER fruit 3
1) "apple"
2) "banana"
3) "cherry"

# 給定 -3 爲 count 參數,返回 3 個隨機元素
# 元素可能會重複出現多次

redis> SRANDMEMBER fruit -3
1) "banana"
2) "cherry"
3) "apple"

redis> SRANDMEMBER fruit -3
1) "apple"
2) "apple"
3) "cherry"

# 如果 count 是整數,且大於等於集合基數,那麼返回整個集合

redis> SRANDMEMBER fruit 10
1) "apple"
2) "banana"
3) "cherry"

# 如果 count 是負數,且 count 的絕對值大於集合的基數
# 那麼返回的數組的長度爲 count 的絕對值

redis> SRANDMEMBER fruit -10
1) "banana"
2) "apple"
3) "banana"
4) "cherry"
5) "apple"
6) "apple"
7) "cherry"
8) "apple"
9) "apple"
10) "banana"

# SRANDMEMBER 並不會修改集合內容

redis> SMEMBERS fruit
1) "apple"
2) "cherry"
3) "banana"
  1. spop setName: 隨機移除集合中的一個元素,返回隨機移除的元素
redis> SMEMBERS db
1) "MySQL"
2) "MongoDB"
3) "Redis"

redis> SPOP db
"Redis"

redis> SMEMBERS db
1) "MySQL"
2) "MongoDB"
  1. smove key1 key2 value(在key1 中的某個值):將key1 中的某個值賦給key2;語句執行成功返回1 執行失敗返回0
redis>smenbers set01
1) "Billie Jean"
2) "Believe Me"
redis>smenbers set02
1) "1"
2) "2"
redis smove set01 set02 Billie Jean
(integer)1
redis>smenbers set02
1) "1"
2) "2"
3) "Billie Jean"
  1. 數學集合操作:sdiff/sinter/sunion : 差集/交集/並集
sdiff : 差集,在set01 集合中但是後面的集合中沒有
set01:1 2 3 4 5
set02:1 2 3 a v
差:
redis>sdiff set01 set02
1) "4"
2) "5"
交:
redis>sinter set01 set02
1) "1"
2) "2"
3) "3"
並: 還是要保證互異
redis>sunion set01 set02
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "a"
7) "v"

//順序是任意的,因爲set 時無序的

四:Hash

hash 是最適合存儲對象的數據類型,類似java 中的Map<String ,Object>;KV 的模式不變,但V 是一個鍵值對

  1. hset/hget/hmset/hmget/hgetall/hdel
// 設置值
hset user id 11
(integer)1
//獲取值
hget user id
"11"

//同時設置多個值
redis>hmset user id 11 name zs age 18
OK
//同時獲取多個值
hmget user id name age
1) "11"
2) "zs"
3) "18"
//獲取所有,key 和 value 
redis>hgetall user
1) "id"
2) "11"
3) "name"
4) "zs"
5) "age"
6) "18"

如何理解KV 模式不變,V 是一個鍵值對。類似存了一個對象 名爲user(key) 它的一個屬性 id(key) 存的值爲 11(value)

  1. hdel : 刪除指定key 的某個域,返回成功刪除的域的數量
redis>hdel user id
(integer)1
  1. hlen : 返回hash 指定key 中域的數量
//根據上面的操作,user 中刪掉了一個id ,所以還剩2個域
redis>hlen user
(integer)2
  1. hexists key 域名 :判斷指定的key 對應的value 中是否存在給定的域
redis>hexists user id
(integer)0  //不存在id 這個域(被刪除了)
redis>hexists user name
(integer)1  //user 中存在name 這個域
  1. hkeys/hvals : 獲取所有的域和所有域的值
hkeys:
redis> HMSET website google www.google.com yahoo www.yahoo.com
OK
redis> HKEYS website
1) "google"
2) "yahoo"

hvals:
redis> HVALS website
1) "www.google.com"
2) "www.yahoo.com"
  1. hincrby/hincrbyfloat : 域的值加上一個整數/浮點數,返回加運算之後的結果
redis>hincrby user age 2
"20"
redis>hset user grade  95.5
OK
redis>hincrbyfloat user grade 0.5
"96"
  1. hsetnx : 對不存在的 域進行設置 ,給定域不存在則設置成功返回1,給定域存在而設置失敗返回0
redis>hsetnx user name 15
(integer)0     //age 域已經存在
redis>hsetnx user id 1
(integer)1

五:ZSet(Sorted Set) :有序集合

如何實現的有序?
Set 中的數據 k1 v1 v2 v3
ZSet 中的數據 k1 score1 v1 score2 v2 score3 v3 , 在每一個數據前面加上了一個數,相當於後面也是一個鍵值對的形式(數字,value)

  1. zadd/zrange : 添加value/返回value
redis>zadd zset01 60 v1 40 v2 30 v3
(integer)3   //返回添加的數據的個數
redis>zrange zset01 0 -1
1) "v1"
2) "v2"
3) "v3"
redis>zrange zset01 0 -1 withscores
1) "v1"
2) "60"
3) "v2"
4) "40"
5) "v3"
6) "30"
  1. zrangebysore key 開始的score 結束的score : 返回某個score 段之內的value
//包含開頭和結尾的score 所對應的值
redis>zrangebyscore zset01 40 30
1) "v3"
2) "v2"
redis>zrangebyscore zset01 40 30 withscores
1) "v3"
2) "30"
3) "v2"
4) "40"

//不包含前面寫了( 的score 對應的value
redis>zrangebyscore zset01 (40 30
"v3"

//limit 對返回的數據的個數進行限制 例如 :zset01 60 v1 70 v2 80 v3 90 v4 100 v5
redis>zrangebyscore zset01 60 90
1) "v1"
2) "v2"
3) "v3"
4) "v4"
redis>zrangebyscore zset01 60 90 limit 2 2 //從下標開始,返回兩個數據
3) "v3"
4) "v4"
  1. zrem keyName value : 刪除 指定value的值
redis>zrem zset01 v1
(integer) 1         //返回操作的數據個數
redis>zrange zset01 
1) "v2"
2) "v3"
3) "v4"
4) "v5"
  1. zcard keyName/zcount keyName score區間 /zrank keyName values/zscore keyName value
//zcard keyName : 獲取zset 集合中的數據的個數
redis>zcard zset01 
(integer)4

//zcount keyName score區間 : 獲取某個score 區間內的數據的個數
redis>zcount zset01 60 90
(integer)3

//zrank keyName values : 獲取給定的values 對應的下標
reids>zrank zset01 v3
(integer)1

//zscore keyName value : 獲取給定的value對應的分數(score)
redis>zscore zset01 v3
"80"
  1. zrevrank keyName values : 逆序獲取給定的value值對應的下標
redis>zrevrank zset01 v3
(integer)2
  1. zrevrange : values逆序輸出
redis>zrevrange zset01
1) "v5"
2) "v4"
3) "v3"
4) "v4"
  1. zrevrangebyscore keyName 結束的score 開始的score
redis>zrevrangebyscore zset01 90 60
1) "v4"
2) "v3"
3) "v2"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章