Redis數據操作--字符串
阿新 • • 發佈:2017-09-07
redis數據操作-字符串
| 儲存文字,儲存數字(整數,浮點數),二進制數 | 字符串操作 -- 設置字符串 set key value # 如果字符串鍵key已經存在, 那麽使用新值覆蓋原來的舊值 -- 獲取字符串 get key # 返回字符串鍵key儲存的值 -- 僅在鍵不存在的情況下進行設置 setnx key value # 僅在鍵key不存在的情況下,將鍵key的值設置為value, 效果和set key value NX一樣。NX的意思為"Not exists"。 # 鍵不存在並且設置成功時命名返回1; 因為鍵已經存在而導致設置失敗時,命令返回0。 -- 同時設置或獲取多個字符鍵的值 mset key value...(key value) mget key value...(key value) # 多個get,set同時執行一樣 -- 一次設置多個不存在的鍵 msetnx key value [key value...] # 只有在所有給定鍵都不存在的情況下,給所有給定鍵設置值, 效果和同時執行多個setnx一樣。如果給定的鍵至少有一個是 存在的,那麽msetnx將不執行任何設置操作。 -- 設置新值並返回舊值 getset key new-value # 將字符串鍵的值設置為new-value,並返回字符串鍵在設置新值 之前儲存的舊值(old value)。 -- 追加內容到字符串末尾 append key value # 將值value推入到字符串鍵key已儲存內容的末尾 -- 返回值得長度 strlen key # 返回字符串鍵key儲存的值的長度 | 鍵的命名 # 因為Redis的數據不能同時出現兩個同名的鍵,所以 我們通常會使用field1::field2::field3這樣的格式來區分 同一類型的多個字符串鍵。最好統一使用符號。 如:網站用戶對應的郵件地址: huangz::email鍵,peter::email 鍵來區分。 (也可以選用自己喜歡的其他分隔符) | 字符串索引(正,負) -- 範圍設置 setrange key index value # 從索引index開始,用value復寫(overwrite)給定值key 所儲存的字符串值。只接受正數索引。 命令返回復寫之後,字符串的長度 -- 範圍取值 getrange key start end # 返回鍵key儲存的字符串值中,位於start和end兩個索引 之間的內容(閉區間),範圍取值的索引可以是正數或者負數。 | 設置和獲取數字 # 只要儲存在字符串鍵裏面的值可以被解釋為64位整數,或者IEEE-754 的64位浮點數,那麽用戶就可以對這個字符串鍵執行對數字值的命令。 # 10086 可以被解釋為整數;3.14可以被解釋為浮點數;+123可以被解釋 為整數;1234....(很多) 值太大,沒辦法使用64位整數來儲存;2.0e7這樣 的科學計數法無法被Redis解釋;123ABC包含文字,不可以被解釋; -- 增加或者減少數字的值(整數) # 對於一個保存著數字的字符串鍵key,我們可以使用incrby,decrby命令 來增加或者減少它的值 incrby key increment 將key儲存的值加上增量,返回key的值 decrby key increment 將key儲存的值減去減量,返回key的值 # 如果執行過程中key不存在,name命令會線將鍵key初始化為0, 然後再執行增加或者減少操作 -- 增一和減一(整數) incr key 等同於incrby key 1 decr key 等同於decrby key 1 # 因為針對數字值得增一和減一操作非常常見,所以Redis特別創建了這 兩個值得命令 (計數器API的實現) counter.py文件:Counter(name, redis_client), Counter.incr(), Counter.get() , Count.reset (id生成器API的實現) id_generator.py文件:IdGenerator(name, redis_client), IdGenerator.gen() IdGenerator.int() -- 浮點數的自增和自減 # 為字符串鍵key儲存的值加上浮點數增量increment,返回key值 附:沒有響應的decrbyfloat,但可以通過給定負值來達到decrbyfloat 的效果。 redis>set num 10 redis>incrbyfloat num 3.14 redis>incrbyfloat num -2.04 註意事項:即使字符串鍵儲存的是數字值,它也可以執行append、strlen、 setrange的命令,Redis會先將數字值轉換成字符串,然後再執行命令 | 二進制數據操作 -- 設置和獲取二進制數據 # set,get,setnx,append等命令設置二進制數據 # 因為Redis自帶的客戶端redis_cli沒辦法方便的設置二進制數據 # 所以這裏使用Python客戶端來進行 >> import redis >> r = redis.Redis() >>r.set(‘bits‘, 0b10010100) # 將字符串鍵bits的值設置為二進制10010100 >>True >> bin(int(r.get(‘bits‘))) # 獲取字符串鍵bits儲存的二進制值(需要進行轉換) >>‘0b10010100‘ >> r.append(‘bits‘, 0b111) # 將0b111(也即是十進制的7)推入到bits已有 二進制位的末尾 >>4 >> bin(int(r.get(‘bits‘))) # 推入之前的值為0b10010100 =148 ‘0b10111001111‘ # 推入之後的值為0b1011100111 = 1487 -- 二進制位的索引 # 和儲存文字時的索引不同,當字符串鍵儲存的是二進制位時,二進制的索引 會從左到右依次遞減。 -- 設置二進制位的值 setbit key index value # 將給定索引上的二進制位的值設置為value, 命令返回被設置的位原來儲存的舊值 redis> setbit bits 2 1 (integer) 0 -- 獲取二進制位的值 getbit key index # 返回給定索引上的二進制位的值 -- 計算值為1的二進制位的數量 bitcount key [start][end] # 計算並返回字符串鍵儲存的值中,被設置為1的二進制位的數量 start和end參數的設置,來限制一個範圍,可以使用負數值。 -- 二進制位的運算 bitop operation destkey key [key ...] # 對一個或多個保存二進制位的字符串鍵執行位元操作 ,並將結果保存到destkey上。 operation可以是AND,OR,NOT,XOR ADN: 對一個或多個key求邏輯並 OR: 對一個或者多個key求邏輯或 XOR: 對一個或多個key求邏輯異或 # 邏輯運算法則:a^b=(a‘ and b) or (a and b‘) NOT: 對給定key求邏輯非 # 命令的返回值為計算結果的字節長度 b:01001101 b2:10110101 redis> bitop and b1-and-b2 # 00000101 (integer) 1 redis> bitop or b1-or-b2 b2 # 11111101 (integer) 1 redis> bitop xor b1-xor-b2 b1 b2 # 11111000 (intefer) 1 redis> bitop not noy-b1 b1 # 10110010 (integer) 1 # 實現在線人數統計 online_count.py # 使用Redis緩存熱門圖片 cache= Cache(redis_client) # 設置緩存的客戶端 file = open(‘reids-logo.jpg‘, ‘r‘) # 打開文件 data = file.read() # 讀取文件數據 file.close() # 關閉文件 cache.put(‘redis-logo‘, data) # 以redis-logo為名字,將圖片緩存起來 cache.get(‘redis-logo‘) # 取出redis-logo圖片的數據 | 儲存中文時的註意事項 -- strlen,setrange,getrange不適用於中文 # 一個英文字符只需要使用單個字節來儲存,而一個中文 字符卻需要使用多個字節來儲存。 # strlen,setrange,getrange都是為英文設置的,它們只會 在字符為單個字節的情況下正常工作,而一旦我們儲存的 是類似中文這樣多字節字符,那這三個命令就不再適用了。 -- strlen示例 $ redis-cli --raw # 在redis-cli中使用中文時,必須打開--raw 選項,才能正常顯示中文 redis> set msq ‘世界你好‘ OK redis> get msg redis> strlen msg # 這裏strlen顯示了‘世界你好‘的字節長度為12字節 12 # 但我們真正想知道的是msg鍵裏面包含多少個字符 --setrange和getrange示例 setrange和getrange的情況也是類似的:因為這兩個命令所使用的索引 是根據字節而不是字符來編排的,所以調用setrange或者getrange來 處理中文,得不到我們想要的結果。 --結論 # 不要使用strlen、setrange和getrange來處理中文。 # 例外情況:如果你想知道被儲存的中文包含多少個字節,那麽可以使用 strlen。
Redis數據操作--字符串