redis 的使用,及如何使用redis維護數億人的登錄狀態
select db redis 下默認有有16個表,0~15可以通過:select 2 或者 select 11這樣的方式切換表
keys pattern 查看該表下匹配到的 keys 命令 keys * 查看表下所有key
type key 查看key對應的類型
exists key 檢測key是否是表中存在
expire key time 為某個key設置超時時間
move key db 將key 移動到另一個db下
del key 刪除指定key 還可以一次性刪除多個: del key1 key2 key3
二、string操作127.0.0.1:6379> keys * 1) "loveyue" 2) "name" 3) "num" 127.0.0.1:6379> type name string 127.0.0.1:6379> exists info (integer) 0 127.0.0.1:6379> expire name 1 (integer) 1 127.0.0.1:6379> get name (nil) 127.0.0.1:6379> keys * 1) "loveyue" 2) "num" 127.0.0.1:6379> set name2 'lina' OK 127.0.0.1:6379> set name3 'david' OK 127.0.0.1:6379> keys name* 1) "name2" 2) "name3" 127.0.0.1:6379> del name2 name3 (integer) 2 127.0.0.1:6379> keys name* (empty list or set)
- set key value 設置key對應value 後面還有可選參數, ex:超時時間(秒) px: 毫秒 nx: 只有當key 不存在時,才會創建, xx: 只有當key存在時才能修改
127.0.0.1:6379> set key value [EX seconds] [PX milliseconds] [NX|XX] 如:set name lina ex 3 nx
127.0.0.1:6379> keys * 1) "loveyue" 2) "num" 127.0.0.1:6379> set name lina ex 10 nx OK 127.0.0.1:6379> get name "lina"
- setnx key value 只有不存在是才創建,和上面的帶可選參數nx 一樣
- setxx key value 同理
setex key seconds value 直接設置超時時間 setex name 5 lina 這個5秒後就不在了
get key 獲取key 對應的value 如:get name
- mset key1 value1 key2 value2 可以一次性設置多個key-value
- mget key1 key2 一次性獲得多個value
2.3 一些其他方法127.0.0.1:6379> mset name1 lina name2 david name3 wang OK 127.0.0.1:6379> mget name1 name2 name3 1) "lina" 2) "david" 3) "wang"
strlen key 返回字符串長度,註意utf-8下一個中文三個字節
getset key value 獲取到key原來的值返回,並給它賦新值value
- getrange key start end 獲取key 對應的字符,並切片 從 start 到 end 返回
setrange key offset value 將key對應 值,從offset 位置開始用value覆蓋
127.0.0.1:6379> getset name1 xxxx
"lina"
127.0.0.1:6379> getrange name1 1 -1
"xxx"
127.0.0.1:6379> setrange name1 1 99999
(integer) 6
127.0.0.1:6379> get name1
"x99999"
- incr key 自增,調用一次自增一
decr key 自減
append key value 在後面追加
- setbit key offset value 這個命令會把key下面的值的二進制數據格式,長度的offset位置的值改為value(只能為 0 或 1)
如 name -anny 如果執行命令: setbit name 6 1 那麽anny--->cnny ,原理 a 的ASCII 值為:97 在內存中二進制數據為:0b1100001 改動第六位變成: 0b1100011 ASCII值變為99變成了c
127.0.0.1:6379> set name anny
OK
127.0.0.1:6379> setbit name 6 1
(integer) 0
127.0.0.1:6379> get name
"cnny"
當然你還可以不用管key 對應的值是什麽隨便設置
- setbit name 1997 1 如我將1997位設置為1 ,當然字符串的長度4x8=32 位肯定不夠1千多位,中間缺少的自動用0補齊了
127.0.0.1:6379> setbit name 1997 1
(integer) 0
127.0.0.1:6379> get name
"cnny\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x
......................................................
0\x00\x00\x00\x00\x00\x00\x04"
- bitcount key start end 統計該值中二進制數據一共有多少個1,後面兩個為可選參數,默認0到最後(-1)
- gitbit key offset 拿到key 對應的offset 位置的二進制數據是為0 還是1
127.0.0.1:6379> bitcount name 0 -1
(integer) 20
127.0.0.1:6379> bitcount name
(integer) 20
127.0.0.1:6379> getbit name 6
(integer) 1
應用場景:假設你要維護數億條登錄狀態數據,如騰訊QQ,微信什麽的,如果是在mysql中,我們就需要增加一個字段login_status,存登錄狀態,但是數以億計的就會導致耗費巨量存儲空間,及查詢速度
但是我們使用redis 的這個功能, setbit gitbit bitcount
我們只需要0表示未登錄,1表示登錄
那麽一億人的數據會占據多大空間呢?8x1024x1024x12 = 100663296 一億多十萬。 也就12M的空間
當第1717個人登錄時:我們只需
setbit login_status 1717 1
當他註銷時:
setbit login_status 1717 0
查看第437 個人是否是登錄狀態
getbit login_status 437
統計當前有多少人在線
bitcount login_status 0 -1
127.0.0.1:6379> setbit login_status 1717 1
(integer) 0
127.0.0.1:6379> setbit login_status 437 1
(integer) 0
127.0.0.1:6379> getbit login_status 437
(integer) 1
127.0.0.1:6379> bitcount login_status
(integer) 4
redis 中的hash、列表、集合
請點這兒,redis中的hash、列表、集合
redis 的使用,及如何使用redis維護數億人的登錄狀態