redis 介紹及String 、bitmap 使用、key查找

 

表很大的時候,性能下降?

如果表有索引,增刪改變慢,需要維護索引。

1.如果1個或少量查詢以然很快

2.當併發或sql複雜會受硬盤帶寬影響速度。

常識:

硬盤:尋址慢、帶寬慢。

 

Redis 是一個開源(BSD許可)的,內存中的數據結構存儲系統,它可以用作數據庫、緩存和消息中間件。 它支持多種類型的數據結構,如 字符串(strings)散列(hashes)列表(lists)集合(sets)有序集合(sorted sets) 與範圍查詢, bitmapshyperloglogs地理空間(geospatial) 索引半徑查詢。 Redis 內置了 複製(replication)LUA腳本(Lua scripting)LRU驅動事件(LRU eviction)事務(transactions) 和不同級別的 磁盤持久化(persistence), 並通過 Redis哨兵(Sentinel)和自動 分區(Cluster)提供高可用性(high availability)。

 

爲什麼redis 單線程的還很快呢?

因爲cpu很快,磁盤IO很慢。很多請求來了之後,由於cpu的速度很快,所以執行起來依然很快。一筆一筆處理,所以線程安全。

內核的epoll同步,非阻塞多路複用。

redist 取的是字節流,而不是字符流。所以redis是二進制安全的

 

redis 安裝這裏就不教了下面使用的是window的

打開redis的目錄,啓動 redis-server.exe,redis-cli.exe 。順序的,否則報錯。 server爲服務端。

 

redis默認有16個庫。0和1號不能更名。

help @generic  查看指令幫助文檔

help @string  會出現string相關的使用

 

flushdb  清庫

help set 查看當前組的類型

 

redis String , String 類型又分爲三種存儲類型 : String、數值、bitmap

set key value  設置一個key和value

get key value 查詢一個key和value

select 8  切換到8號庫。

set key value1 nx:

nx  不存在這個key的時候纔去設置 key 的value 爲value1。如果存在這個key,則返回nil。新建

msetnx  key1 value1 key2 value 同上,不過可以操作多個,並且是原子性,一個失敗則全部失敗

場景:分佈式鎖。

set key value1 xx : xx 只有當這個key存在的時候纔可以進行操作,修改value 爲value1.否則返回nil。更新

mset key1 a key2 b : 批量插入。

mget key1 key2 : 批量查詢。

APPEND key1 “world” : 給key1追加內容

GETRANGE key1 4 7 : 取出key1 的第5到8個字符的內容。索引從0開始

GETRANGE key1 4 -1 : 取出key1 的第5到最後一個個字符的內容。反向,最後一個爲-1,倒數第二個爲-2

SETRANGET key 5 d : 將key的第5個位置設置爲d。如果是 ddd,那就從第6個位置開始覆蓋

STRLEN key : 輸出key的value長度

type key  : 查看key的value類型

當這個組(group)的類型爲string,value值爲99也是string型的。但是object encoding 可以是 int的

INCR key,encoding 爲int 的會進行自增。 INCRBY key  22  加上22.如果之前爲99,則新的爲121. 搶購、秒殺、商品詳情頁,對數據庫的事務操作完全由redis內存代替,微博點贊、評論等。

DECR key 5,類似INCR key,不過是減。DECRBY key 5同INCRBY

INCRBYFLOAT key 0.5 ,類似INCR key,不過是加0.5的float操作。

 

 

先設置key1 爲23 ,這是type key1 是string,因爲這個group的type就是string。但是不影響它的object encoding 是int的。

在key1 後面追加 22,這時候就是字符串追加了。 key1 由 23 -->  2322。object encoding 變成  raw。

對key1 執行incr ,加1 操作,  2322  變成2323,這時object encoding 又回到 int了。

說明,不同的操作會改變value的object encoding。 

 

這裏追加一箇中字,可能是不兼容,中文顯示的不友好。長度變爲3.這裏中文的長度跟字符編碼有關,如果是UTF-8,則佔3個長度。存儲的時候存儲的是字節

getset 命令,設置一個新值並返回舊值

 

bitmap

setbit  設置指定offset 值,offset 下標從0開始。8bit = 1byte。修改完位後,值爲對應的ascll碼

help bitpos  :Find first bit set or clear in a string 查找bit中第一個字符的位置

查找k1 中從0到9 字節中值爲1的位位置。這裏是字節,非位。返回的是第幾位

 

bitcount : 只統計 1 出現了幾次。

bitcount k1 0 0 : 統計 k1 中從0到0個字節裏面1出現了幾次

bitcount k1 1 1 : 統計 k1 中從1到1個字節裏面1出現了幾次

bitcount k1 0 1 : 統計 k1 中從0到1個字節裏面1出現了幾次

 

bitop  按位操作

bitop and andkey k1 k2 :對k1 和 k2 進行按位與操作(有0則0,全1則1),然後將值放入到 andkey 中

bitop or orkey k1 k2 :對k1 和k2 進行按位或操作(有1 則1,全0則0),將值放入到orkey中

 

位圖應用。

bitcount

例如,統計某個用戶是否登錄過。一年365天。給到400位 = 50個字節。

setbit user1 5 1 : 第五天登錄了, setbit user1 300 1: 第三天登錄了。

統計:  bitcount user1 -1 -1 最後8天內有沒有登錄過。

 

按位或應用

統計雙11,雙12登錄的人數,去重,註冊用戶3E。

key11、key12,分別分配 3億 位 = 3億 / 8 字節 ,每位對應一個用戶

setbit key11  1530 1 ,設置11 第 1530位用戶登錄了

bitop or key1112 key11 key12 , 然後對 key1112 進行bitcout  0 -1 統計所有的字節裏面的爲1的

按位或、按位與 :  二維計算模型

 

 

key查找

keys * : 顯示所有key,不推薦!!!

scan

SCAN 命令是一個基於遊標的迭代器(cursor based iterator): SCAN 命令每次被調用之後, 都會向用戶返回一個新的遊標, 用戶在下次迭代時需要使用這個新遊標作爲 SCAN 命令的遊標參數, 以此來延續之前的迭代過程。

SCAN 命令的遊標參數被設置爲 0 時, 服務器將開始一次新的迭代, 而當服務器向用戶返回值爲 0 的遊標時, 表示迭代已結束。

遍歷所有的key : scan 0,返回下標 9 ,告訴我們這次找到了9個key,下次從9開始找

scan 9 : 從下標9開始找,返回0,告訴我們遍歷完了。

模糊查詢

scan 0 match *k*: 找到了9個,下次從9繼續。

scan 0 match *k* count 20 : 從0開始找,匹配 帶'k' 的key,並返回20個。

 

 

SSCAN 命令用於迭代集合鍵中的元素。

HSCAN 命令用於迭代哈希鍵中的鍵值對。

ZSCAN 命令用於迭代有序集合中的元素(包括元素成員和元素分值)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章