Redis自學筆記:3.2入門-字串型別
3.2字串型別
- 實際上redis不只是資料庫,更多的公司和團隊將redis用作快取和
佇列系統
3.2.1介紹
字串型別是redis最基本的資料型別,它能儲存任何形式的字串,
包括二進位制資料.你可以用其儲存使用者的郵箱、JSON化的物件甚至
是一張圖片.
- 一個字串型別鍵允許儲存的資料的最大容量是512M
字串型別是其他4中資料型別基礎,其他資料型別和字串型別
的差別是從某種角度來說只是組織字串的形式不同.例如,- 列表型別是以列表的形式組織字串
- 集合型別是以集合的形式組織字串
3.2.2 命令
賦值與取值:set key value / get key
127.0.0.1:6379> set bar '早上好' OK 127.0.0.1:6379> get bar "\xe6\x97\xa9\xe4\xb8\x8a\xe5\xa5\xbd" 127.0.0.1:6379> set foo 'hello' OK 127.0.0.1:6379> get foo "hello"
- $redis-cli --raw啟動客戶端,顯示中文
遞增數字:incr key
127.0.0.1:6379> incr num 1 127.0.0.1:6379> incr num 2
- 當操作的鍵不存在時會預設值為0,所以第一次遞增後的結果是1.
127.0.0.1:6379> set foo lorem OK 127.0.0.1:6379> incr foo ERR value is not an integer or out of range
- 當鍵值不是整數時,redis會提示錯誤
3.2.3實踐
文章訪問量統計
為每篇文章使用一個名為post: 文章ID: page.view的鍵來記錄文章
的訪問量,每次訪問文章的時候incr命令使相應的鍵值增加- redis對鍵的命名沒有強制的要求,但比較好的實踐是用 "物件型別:物件ID:物件屬性" 來命名一個鍵.如"user: 1: friends"
生成自增ID
關係型資料庫中設定欄位屬性為AUTO_INCREMNT.
redis中實現的方法:
對於每一類物件使用名為物件型別(複數形式):count的鍵來儲存當前型別物件的數量,每增加一個新的物件時都使用incr命令增加該鍵的值.
由於incr命令建立的鍵初始值數1,所以很容易得知,incr命令返回值既是加入該物件後的當前型別物件的總數,又是該新增加物件的ID
儲存文章資料
每個字串型別鍵只能儲存一個字串,而一篇部落格文章是由標題、正文、
作者與釋出時間等多個元素構成。為了儲存這些元素,我們需要使用序列化
函式將它們轉換成字串。除此之外因為字串型別鍵可以儲存二進位制資料,
所以也可以使用messagePack進行序列化,速度更快,佔用空間也小。
儲存文章虛擬碼:# 首先獲得新文章的id $postID = incr posts: count # 將部落格文章的諸多元素序列化成字串 $serializedPost = serialize($title,$content,$author,$time) # 把序列化後的字串存入字串型別的鍵中 set post:$postID: data,$serializedPost
獲取文章虛擬碼(以訪問id為42的文章為例):
# 從redis中讀取文章資料 $serializedPost = get post: 42: data # 將文章資料反序列化成文章的各個元素 $title,$content,$author,$time = unserialize($serializedPost) # 獲取並遞增文章的訪問數量 $count = incr post: 42: page.view
還可以對每個元素使用一個字串型別鍵來儲存
3.2.4命令拾遺
增加指定的整數:incrby key int(可為負,即為減)
127.0.0.1:6379> incrby bar 2 2 127.0.0.1:6379> incrby bar 3 5
減少指定的整數:decrby key int(可為負,即為加)
127.0.0.1:6379> decrby bar 1 4 127.0.0.1:6379> decrby bar 3 1
增加指定浮點數:incrbyfloat key 數(可為負,即為減,亦可為整數)
127.0.0.1:6379> incrbyfloat bar 0.5 1.5 127.0.0.1:6379> incrbyfloat bar -0.5 1 127.0.0.1:6379> incrbyfloat bar 5e+4 50001
向尾部追加值:append key value
127.0.0.1:6379> set bar hello OK 127.0.0.1:6379> get bar hello 127.0.0.1:6379> append bar world! 11 127.0.0.1:6379> get bar helloworld! 127.0.0.1:6379> append bar ' good' 16 127.0.0.1:6379> get bar helloworld! good
- 該方法可以建立鍵
127.0.0.1:6379> keys * bar 127.0.0.1:6379> append foo book 4 127.0.0.1:6379> keys * bar foo
獲取字串長度:strlen key
127.0.0.1:6379> strlen bar 16 127.0.0.1:6379> set bar 你好 OK 127.0.0.1:6379> strlen bar 6
同時獲得/設定多個鍵值:meset k1 v1 k2 v2... / get k1 k2...
127.0.0.1:6379> keys * 127.0.0.1:6379> mset a 1 b 2 c 3 OK 127.0.0.1:6379> keys * b c a 127.0.0.1:6379> mget c b a 3 2 1
位操作:
getbit key offset
獲得一個字串型別鍵指定位置的二進位制位的值(0或1),索引從0開始
- 如果超出了索引,預設值為0
setbit key offset value
設定字串指定位置的二進位制的值,返回值是該位置的舊值
bitcount key [start][end]
獲得字串型別鍵中值是1的二進位制位個數
[start][end]限制統計的位元組範圍
bitop operation destkey [key...]
對多個字串型別鍵進行位運算,並將結果儲存在deskey引數指定的鍵中
bitop支援的運算操作符:and or xor not
bitpos key value [start][end]
獲得指定鍵第一個值是value(0或者1)的位置
- 如果不設定結束位元組且鍵值所有的二進位制位都是1,則查詢0的偏移量會是鍵值長度的下一個字位的偏移量
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> getbit foo 0
0
127.0.0.1:6379> getbit foo 1
1
127.0.0.1:6379> getbit foo 2
1
127.0.0.1:6379> getbit foo 3
0
127.0.0.1:6379> getbit foo 6
1
- bar三個字母對應的ascll碼為98\97\114,所以foo鍵中二進位制位結構是
01100010 01100001 01110010
127.0.0.1:6379> setbit foo 6 0
1
127.0.0.1:6379> setbit foo 7 1
0
127.0.0.1:6379> get foo
aar
127.0.0.1:6379> bitcount foo
10
127.0.0.1:6379> bitcount foo 0 1
6
127.0.0.1:6379> keys *
foo2
foo1
foo
127.0.0.1:6379> bitop or res foo1 foo2
3
127.0.0.1:6379> keys *
foo2
foo1
res
foo
127.0.0.1:6379> get res
car
127.0.0.1:6379> bitop and res foo1 foo2
3
127.0.0.1:6379> get res
`ar
127.0.0.1:6379> bitpos foo 0
0
127.0.0.1:6379> bitpos foo 1
1
127.0.0.1:6379> bitpos foo 1 1 2
9