高可用Redis(二):字符串類型

1.Redis字符串結構

對於Redis來講,全部的key都是字符串,其value能夠是string,list,hash,set,zsetphp

好比下面的java

鍵值對的value還能夠更加複雜,好比能夠是json格式,xml格式,序列化等python

字符串類型的value的長度不能大於512MB。redis

在實際生產中,若是一個值保存成500MB的話,獲取這個值的時候會佔用不少的網絡流量,其次讀取的時候也會很是慢,這對於Redis這種單線程應用來講並不明智json

在生產環境中,考慮到併發和網絡流量的因素,value的大小建議在100KB之內緩存

Redis字符串的使用場景:網絡

緩存
計數器,好比視頻網站中視頻的播放次數統計等
分佈式鎖

2.Redis字符串相關命令

2.1 get命令,set命令和del命令

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)

2.2 整型操做命令

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的訪問量就進行了區分。

2.3 set命令和setnx命令

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)

2.4 mget命令和mset命令

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的值,

2.5 getset命令,append命令和strlen命令

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)

2.6 incrby命令,getrange命令和setrange命令

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)
相關文章
相關標籤/搜索