溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Redis數(shù)據(jù)操作--字符串

發(fā)布時間:2020-08-04 16:48:56 來源:網(wǎng)絡 閱讀:652 作者:繆克拉 欄目:關系型數(shù)據(jù)庫
| 儲存文字,儲存數(shù)字(整數(shù),浮點數(shù)),二進制數(shù)
|  字符串操作
-- 設置字符串
    set key value
    # 如果字符串鍵key已經(jīng)存在,
    那么使用新值覆蓋原來的舊值
-- 獲取字符串
    get key
    # 返回字符串鍵key儲存的值
-- 僅在鍵不存在的情況下進行設置
    setnx key value
    # 僅在鍵key不存在的情況下,將鍵key的值設置為value,
    效果和set key value NX一樣。NX的意思為"Not exists"。
    # 鍵不存在并且設置成功時命名返回1;
    因為鍵已經(jīng)存在而導致設置失敗時,命令返回0。
-- 同時設置或獲取多個字符鍵的值
    mset key value...(key value)
    mget key value...(key value)
    # 多個get,set同時執(zhí)行一樣
-- 一次設置多個不存在的鍵
    msetnx key value [key value...]
    # 只有在所有給定鍵都不存在的情況下,給所有給定鍵設置值,
    效果和同時執(zhí)行多個setnx一樣。如果給定的鍵至少有一個是
    存在的,那么msetnx將不執(zhí)行任何設置操作。
-- 設置新值并返回舊值
    getset key new-value
    # 將字符串鍵的值設置為new-value,并返回字符串鍵在設置新值
    之前儲存的舊值(old value)。
-- 追加內(nèi)容到字符串末尾
    append key value
    # 將值value推入到字符串鍵key已儲存內(nèi)容的末尾
-- 返回值得長度
    strlen key
    # 返回字符串鍵key儲存的值的長度
| 鍵的命名
    # 因為Redis的數(shù)據(jù)不能同時出現(xiàn)兩個同名的鍵,所以
    我們通常會使用field1::field2::field3這樣的格式來區(qū)分
    同一類型的多個字符串鍵。最好統(tǒng)一使用符號。
    如:網(wǎng)站用戶對應的郵件地址: huangz::email鍵,peter::email
    鍵來區(qū)分。
    (也可以選用自己喜歡的其他分隔符)
| 字符串索引(正,負)
-- 范圍設置
    setrange key index value
    # 從索引index開始,用value復寫(overwrite)給定值key
    所儲存的字符串值。只接受正數(shù)索引。
    命令返回復寫之后,字符串的長度
-- 范圍取值
    getrange key start end
    # 返回鍵key儲存的字符串值中,位于start和end兩個索引
    之間的內(nèi)容(閉區(qū)間),范圍取值的索引可以是正數(shù)或者負數(shù)。
| 設置和獲取數(shù)字
    # 只要儲存在字符串鍵里面的值可以被解釋為64位整數(shù),或者IEEE-754
    的64位浮點數(shù),那么用戶就可以對這個字符串鍵執(zhí)行對數(shù)字值的命令。
    # 10086 可以被解釋為整數(shù);3.14可以被解釋為浮點數(shù);+123可以被解釋
    為整數(shù);1234....(很多) 值太大,沒辦法使用64位整數(shù)來儲存;2.0e7這樣
    的科學計數(shù)法無法被Redis解釋;123ABC包含文字,不可以被解釋;
-- 增加或者減少數(shù)字的值(整數(shù))
    # 對于一個保存著數(shù)字的字符串鍵key,我們可以使用incrby,decrby命令
    來增加或者減少它的值
    incrby key increment 將key儲存的值加上增量,返回key的值
    decrby key increment 將key儲存的值減去減量,返回key的值
    # 如果執(zhí)行過程中key不存在,name命令會線將鍵key初始化為0,
    然后再執(zhí)行增加或者減少操作
-- 增一和減一(整數(shù))
    incr key 等同于incrby key 1
    decr key 等同于decrby key 1
    # 因為針對數(shù)字值得增一和減一操作非常常見,所以Redis特別創(chuàng)建了這
    兩個值得命令
    (計數(shù)器API的實現(xiàn))
    counter.py文件:Counter(name, redis_client), Counter.incr(), Counter.get()
    , Count.reset
    (id生成器API的實現(xiàn))
    id_generator.py文件:IdGenerator(name, redis_client), IdGenerator.gen()
    IdGenerator.int()
-- 浮點數(shù)的自增和自減
    # 為字符串鍵key儲存的值加上浮點數(shù)增量increment,返回key值
    附:沒有響應的decrbyfloat,但可以通過給定負值來達到decrbyfloat
    的效果。
    redis>set num 10
    redis>incrbyfloat num 3.14
    redis>incrbyfloat num -2.04
    注意事項:即使字符串鍵儲存的是數(shù)字值,它也可以執(zhí)行append、strlen、
    setrange的命令,Redis會先將數(shù)字值轉(zhuǎn)換成字符串,然后再執(zhí)行命令
| 二進制數(shù)據(jù)操作
-- 設置和獲取二進制數(shù)據(jù)
    # set,get,setnx,append等命令設置二進制數(shù)據(jù)
    # 因為Redis自帶的客戶端redis_cli沒辦法方便的設置二進制數(shù)據(jù)
    # 所以這里使用Python客戶端來進行
    >> import redis
    >> r = redis.Redis()
    >>r.set('bits', 0b10010100)  # 將字符串鍵bits的值設置為二進制10010100
    >>True
    >> bin(int(r.get('bits')))  # 獲取字符串鍵bits儲存的二進制值(需要進行轉(zhuǎn)換)
    >>'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的二進制位的數(shù)量
    bitcount key [start][end]
    # 計算并返回字符串鍵儲存的值中,被設置為1的二進制位的數(shù)量
    start和end參數(shù)的設置,來限制一個范圍,可以使用負數(shù)值。
-- 二進制位的運算
    bitop operation destkey key [key ...]
    # 對一個或多個保存二進制位的字符串鍵執(zhí)行位元操作
    ,并將結(jié)果保存到destkey上。
    operation可以是AND,OR,NOT,XOR
    ADN: 對一個或多個key求邏輯并
    OR: 對一個或者多個key求邏輯或
    XOR: 對一個或多個key求邏輯異或  
    # 邏輯運算法則:a^b=(a' and b) or (a and b')
    NOT: 對給定key求邏輯非
    # 命令的返回值為計算結(jié)果的字節(jié)長度
    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
    # 實現(xiàn)在線人數(shù)統(tǒng)計 online_count.py
    # 使用Redis緩存熱門圖片
    cache= Cache(redis_client)  # 設置緩存的客戶端
    file = open('reids-logo.jpg', 'r')  # 打開文件
    data = file.read()                       # 讀取文件數(shù)據(jù)
    file.close()                                 # 關閉文件
    cache.put('redis-logo', data)   # 以redis-logo為名字,將圖片緩存起來
    cache.get('redis-logo')            # 取出redis-logo圖片的數(shù)據(jù)
| 儲存中文時的注意事項
-- strlen,setrange,getrange不適用于中文
# 一個英文字符只需要使用單個字節(jié)來儲存,而一個中文
    字符卻需要使用多個字節(jié)來儲存。
# strlen,setrange,getrange都是為英文設置的,它們只會
    在字符為單個字節(jié)的情況下正常工作,而一旦我們儲存的
    是類似中文這樣多字節(jié)字符,那這三個命令就不再適用了。
-- strlen示例
    $ redis-cli --raw  # 在redis-cli中使用中文時,必須打開--raw
    選項,才能正常顯示中文
    redis> set msq '世界你好'
    OK
    redis> get msg
    redis> strlen msg  # 這里strlen顯示了'世界你好'的字節(jié)長度為12字節(jié)
    12                           # 但我們真正想知道的是msg鍵里面包含多少個字符
--setrange和getrange示例
    setrange和getrange的情況也是類似的:因為這兩個命令所使用的索引
    是根據(jù)字節(jié)而不是字符來編排的,所以調(diào)用setrange或者getrange來
    處理中文,得不到我們想要的結(jié)果。
--結(jié)論
    # 不要使用strlen、setrange和getrange來處理中文。
    # 例外情況:如果你想知道被儲存的中文包含多少個字節(jié),那么可以使用
    strlen。
向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI