1. 程式人生 > >redis 的使用,及如何使用redis維護數億人的登錄狀態

redis 的使用,及如何使用redis維護數億人的登錄狀態

字段 type str 可選參數 是我 blog 如何 ann 是什麽

一、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

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)
二、string操作
  • 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

2.2 批量設置和獲取
  • mset key1 value1 key2 value2 可以一次性設置多個key-value
  • mget key1 key2 一次性獲得多個value
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"
2.3 一些其他方法
  • 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 在後面追加

2.4 setbit 的牛逼應用 維護數億人的登錄狀態
  • 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維護數億人的登錄狀態