對於Redis來講,全部的key都是字符串,其value能夠是string,list,hash,set,zsetphp
好比下面的java
鍵值對的value還能夠更加複雜,好比能夠是json格式,xml格式,序列化等python
字符串類型的value的長度不能大於512MB。redis
在實際生產中,若是一個值保存成500MB的話,獲取這個值的時候會佔用不少的網絡流量,其次讀取的時候也會很是慢,這對於Redis這種單線程應用來講並不明智json
在生產環境中,考慮到併發和網絡流量的因素,value的大小建議在100KB之內緩存
Redis字符串的使用場景:網絡
緩存 計數器,好比視頻網站中視頻的播放次數統計等 分佈式鎖
get key 獲取key對應的value set key value 設置key-value del key 刪除key-value
例子:併發
127.0.0.1:6379> set hello 'world' OK 127.0.0.1:6379> get hello "world" 127.0.0.1:6379> del hello (integer) 1 127.0.0.1:6379> get hello (nil)
注意事項:app
get命令,set命令和del命令的時間複雜度都是O(1)
incr key key自增1,若是key不存在,自增後get(key) = 1 decr key key自減1,若是key不存在,自減後get(key) = -1 incrby key k key自增k,若是key不存在,自增後get(key) = k decrby key k key自減k,若是key不存在,自減後get(key) = -k
例子:分佈式
127.0.0.1:6379> get counter (nil) 127.0.0.1:6379> incr counter (integer) 1 127.0.0.1:6379> get counter "1" 127.0.0.1:6379> incrby counter 99 (integer) 100 127.0.0.1:6379> get counter "100" 127.0.0.1:6379> decr counter (integer) 99 127.0.0.1:6379> get counter "99" 127.0.0.1:6379> decrby counter 50 (integer) 49 127.0.0.1:6379> get counter "49"
注意事項:
incr/decr命令和incrby/decrby命令時間複雜度爲O(1) Redis是自然適合作計數器的 Redis是單線程的,順序執行,併發執行incr命令不會有競爭的問題,不會計錯數
實戰
記錄網站每一個用戶的我的主頁的訪問量,可使用以下命令
incr userid:pageview(單線程:無競爭)
說明:假如一個用戶的id爲123,初始pageview爲0,別的用戶每瀏覽一次123用戶的主頁,pageview自增1,這樣每一個用戶id的訪問量就進行了區分。
set key value 無論key是否存在,都進行設置 setnx key value key不存在,才進行設置 set key value xx key存在才設置
例子:
127.0.0.1:6379> exists python (integer) 1 127.0.0.1:6379> del python (integer) 1 127.0.0.1:6379> exists python (integer) 0 127.0.0.1:6379> set python good OK 127.0.0.1:6379> setnx python good (integer) 0 127.0.0.1:6379> set python base xx OK 127.0.0.1:6379> get python "base" 127.0.0.1:6379> exists python (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> exists java (integer) 0 127.0.0.1:6379> setnx java easy (integer) 1 127.0.0.1:6379> set java aaa xx OK 127.0.0.1:6379> get java "aaa"
注意事項:
set命令和setnx命令的時間複雜度爲O(1)
mget key1 key2 key3 批量獲取key,原子操做 mset key1 value1 key2 value2 key3 value3 批量設置key-value
例子:
127.0.0.1:6379> mset hello world python best php easy OK 127.0.0.1:6379> mget hello python php 1) "world" 2) "best" 3) "easy"
注意事項:
1.mget命令和mset命令的時間複雜度爲O(n) 2.使用get命令獲取某個key的值,server端計算後返回對應的值給client端 此時若是想獲取n個key的值,須要傳輸n次,server端也須要計算n次,這樣所須要的時間爲 n次get = n次網絡時間 + n次命令時間 3.若是使用mget命令一次傳遞n個key的值到server端,只須要傳輸一次,server端計算以後,一次性把計算結果返回給client端 這樣所須要的時間爲:1次mget = 1次網絡時間 + n次命令時間 4.在不少場景中,使用mget命令的效率比get命令效率高不少,mget命令後接的key越多效率越明顯,可是當key的量不少時,能夠對key進行拆分,分批獲取key的值,
getset key newvalue set key newvalue並返回舊的value append key value 將value追加到舊的value strlen key 返回字符串的長度(注意中文)
例子:
127.0.0.1:6379> set hello world OK 127.0.0.1:6379> getset hello python "world" 127.0.0.1:6379> append hello ',java' (integer) 11 127.0.0.1:6379> get hello "python,java" 127.0.0.1:6379> strlen(hello) (error) ERR unknown command 'strlen(hello)' 127.0.0.1:6379> strlen hello (integer) 11 127.0.0.1:6379> set hello '足球' OK 127.0.0.1:6379> strlen hello (integer) 6
注意事項:
getset命令,append命令和strlen命令的時間複雜度爲O(1)
incrbyfloat key float key自增float值 getrange key start end 獲取字符串指定下標全部的值 setrange key index value 設置指定下標全部對應的值
例子:
127.0.0.1:6379> incr counter (integer) 50 127.0.0.1:6379> del counter (integer) 1 127.0.0.1:6379> incr counter (integer) 1 127.0.0.1:6379> incrbyfloat counter 1.1 "2.1" 127.0.0.1:6379> get counter "2.1" 127.0.0.1:6379> set hello pythonbest OK 127.0.0.1:6379> getrange hello 0 6 "pythonb" 127.0.0.1:6379> getrange hello 0 5 "python" 127.0.0.1:6379> setrange hello 6 e (integer) 10 127.0.0.1:6379> get hello "pythoneest"
注意事項:
incrby命令,getrange命令和setrange命令的時間複雜度爲O(1)