redis常用資料型別操作一 字串(string)
redis字串(string)
簡介
string 是redis最基本的型別,可以理解成與Memcache一模一樣的型別 一個key對應一個value
string型別是二進位制最安全的。意味著redis的string可以包含任何資料。比如jpg圖片,或者序列化的物件
string型別是redis最基本的資料,一個redis中字串value最多可以是512M
常用命令:
set <key> <value>:設定值 ,如果相同的就會覆蓋
get <key> : 獲取值
append <key> <appendvalue>: 追加 ,返回追加過後值的長度
setnx <key> <value> 只有key不存在時,才會設定key的值
incr <key> 將key中儲存的數字值增1,只能對數字值進行操作,如果為空,新增值為1
decr <key> 將key中儲存的數字值減1,只能對數字值進行操作,如果為空,新增值為-1
incrby/decrby <key> <步長> 將key中儲存的數字值增減。自定義步長
原子操作
redis 單執行緒操作
(1)在單執行緒當中,能夠在單條指令當中完成的操作都可以認為是“原子操作”,因為中斷只能發生在指令之間。
(2)多執行緒中,不能被其他程序(執行緒)打斷的操作就叫原子操作。
redis單命令的原子性主要得益於redis的單執行緒
案例
c# 中的i++是不是原子操作? 不是
i=0;兩個執行緒分別對i進行++100次,值是多少?
最大值200,最小值是2 ;
分析:執行緒建立誰先誰後是不確定的,a執行緒在操作過程中有可能打斷b執行緒的操作,互相打斷操作,所以不是原子操作
mset <key1><value1><key2><value2>.... 同時設定一個或多個key-value對
mget<key1><key2><key3><key4>... 同時獲取一個或多個 value
msetnx <key1><value1> <key2><value2>.. 同時設定一個或多個key-value時,當且僅當所有的key都不存在,原子性有一個失敗則都失敗
getrange <key> <起始位置><結束位置> :獲取值的範圍,類似於 c#的substring 前包,後包 下標從0開始
setrange <key> <起始位置><value> :用value覆蓋所儲存的字串值,從<起始位置>開始(索引從0開始)
setex <key> <過期時間> <value> 設定鍵的同時,設定過期時間 單位秒
getset<key><value> 以新換舊 ,設定了新值同時獲得舊值
資料結構
string 的資料結構為簡單的動態字串,是可以修改的字串,內部結構實現上類似於c#的list,採用預分配的冗餘空間的方式來減少記憶體分配頻繁。
如圖所示,內部為當期字串實際分配的記憶體空間 capacity】一般要高於實際字串len。當字串長度小於1M時,擴容都是加倍現有的空間,如果超過1M,擴容一次只會多增長1M的空間。需要注意的是,字串最大長度為512M。