1. 程式人生 > >Redis數據操作--字符串

Redis數據操作--字符串

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數據操作--字符串