1. 程式人生 > >redis資料型別以及使用場景

redis資料型別以及使用場景

string  字串型別,可以是int     用做快取、計數器

<?php

//連線本地的 Redis 服務
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";
//設定 redis 字串資料
$redis->set("tutorial-name", 1);
// 獲取儲存的資料並輸出

var_dump($redis->get("tutorial-name"));     //string '1'
var_dump($redis->incr("tutorial-name"));    //int 2

hash    hash特別適合用於儲存物件, 就是一個key存多個鍵值對。例如使用者資訊。string 型別可以儲存物件序列化,將一個物件儲存在 hash 型別中會佔用更少的記憶體,並且可以更方便的存取整個物件

<?php

//連線本地的 Redis 服務
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";echo '<br>';

//給hash表中某個key設定value
//如果沒有則設定成功,返回1,如果存在會替換原有的值,返回0,失敗返回0
echo $redis->hset('myhash', 'cat1', 'cat');echo '<br>';         //1
echo $redis->hset('myhash', 'cat1', 'cat');echo '<br>';         //0
echo $redis->hset('myhash', 'cat1', 'cat1');echo '<br>';        //0
echo $redis->hset('myhash', 'dog1', 'dog');echo '<br>';         //1
echo $redis->hset('myhash', 'bird1', 'bird');echo '<br>';       //1
echo $redis->hset('myhash', 'monkey1', 'monkey');echo '<br>';   //1
//獲取hash中某個key的值
echo $redis->hget('myhash', 'cat1');echo '<br>';                //cat1
echo $redis->hget('myhash', 'dog1');echo '<br>';                //dog

list    簡單的字串列表,按照插入順序排序。佇列

set     無序集合。一堆不重複值的組合。Redis還為集合提供了求交集、並集、差集等操作。在微博應用中,可以將一個使用者所有的關注人存在一個集合中,將其所有粉絲存在一個集合。實現如共同關注、共同喜好、二度好友等功能

<?php

//連線本地的 Redis 服務
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
echo "Connection to server sucessfully";echo '<br>';

//集合
// 新增一個元素
echo $redis->sadd('myset1', 'cat');echo '<br>';         //1
echo $redis->sadd('myset1', 'cat');echo '<br>';         //0
echo $redis->sadd('myset1', 'dog');echo '<br>';         //1
echo $redis->sadd('myset1', 'rabbit');echo '<br>';      //1
echo $redis->sadd('myset1', 'bear');echo '<br>';        //1
echo $redis->sadd('myset1', 'horse');echo '<br>';       //1

// 檢視集合中所有的元素
$set = $redis->smembers('myset1');
echo "<pre>";
print_r($set);echo '<br>';

/*Array
(
    [0] => dog
    [1] => bear
    [2] => rabbit
    [3] => cat
    [4] => horse
)*/

sset    有序集合。一堆不重複值的有序組合。做排行榜比較好

一:快取——熱資料

快取熱資料,過程可能如下:

Select 資料庫前查詢redis,有的話使用redis資料,放棄select 資料庫,沒有的話,select 資料庫,然後將資料插入redis

update或者delete資料庫前,查詢redis是否存在該資料,存在的話先刪除redis中資料,然後再update或者delete資料庫中的資料

上面這種操作,如果併發量很小的情況下基本沒問題,但是高併發的情況請注意下面場景:為了update先刪掉了redis中的該資料,這時候另一個執行緒執行查詢,發現redis中沒有,瞬間執行了查詢SQL,並且插入到redis中一條資料,回到剛才那個update語句,這個悲催的執行緒壓根不知道剛才那個該死的select執行緒犯了一個彌天大錯!於是這個redis中的錯誤資料就永遠的存在了下去,直到下一個update或者delete

二:計數器

諸如統計點選數等應用。由於單執行緒,可以避免併發問題,保證不會出錯,而且100%毫秒級效能!爽。

命令:INCRBY

當然爽完了,別忘記持久化,畢竟是redis只是存了記憶體!

三:佇列

由於redis把資料新增到佇列是返回新增元素在佇列的第幾位,所以可以做判斷使用者是第幾個訪問這種業務

佇列不僅可以把併發請求變成序列,並且還可以做佇列或者棧使用

四:位操作(大資料處理)

用於資料量上億的場景下,例如幾億使用者系統的簽到,去重登入次數統計,某使用者是否線上狀態等等。

想想一下騰訊10億使用者,要幾個毫秒內查詢到某個使用者是否線上,你能怎麼做?千萬別說給每個使用者建立一個key,然後挨個記(你可以算一下需要的記憶體會很恐怖,而且這種類似的需求很多,騰訊光這個得多花多少錢。。)好吧。這裡要用到位操作——使用setbit、getbit、bitcount命令。

原理是:

redis內構建一個足夠長的陣列,每個陣列元素只能是0和1兩個值,然後這個陣列的下標index用來表示我們上面例子裡面的使用者id(必須是數字哈),那麼很顯然,這個幾億長的大陣列就能通過下標和元素值(0和1)來構建一個記憶系統,上面我說的幾個場景也就能夠實現。用到的命令是:setbit、getbit、bitcount

五:分散式鎖與單執行緒機制

驗證前端的重複請求(可以自由擴充套件類似情況),可以通過redis進行過濾:每次請求將request Ip、引數、介面等hash作為key儲存redis,設定多長時間有效期,然後下次請求過來的時候先在redis中檢索有沒有這個key,進而驗證是不是一定時間內過來的重複提交

秒殺系統,基於redis是單執行緒特徵

六:最新列表

例如新聞列表頁面最新的新聞列表,如果總數量很大的情況下,儘量不要使用select a from A limit 10這種low貨,嘗試redis的 LPUSH命令構建List,一個個順序都塞進去就可以啦。不過萬一記憶體清掉了咋辦?也簡單,查詢不到儲存key的話,用mysql查詢並且初始化一個List到redis中就好了。

七:排行榜

誰得分高誰排名往上。命令:ZADD(有續集,sorted set)

redis命令詳解

字串:就是存放字串,用的最多的就是快取

Hash: 雜湊,特點是一個string型別的field和value的對映表,hash特別適合用於儲存物件。

List: 字串列表

set 集合型別:特點就是無序集合。集合成員是唯一的

add - sAddArray:把字串放入集合
alldata - sMembers:返回集合所有成員
member - sIsMember:是否是集合成員
rem - sRem:移除集合key 中的一個或多個成員,不存在的成員將被忽略
pop - sPop:移除並返回集合中的一個隨機元素
SCARD 返回集合中元素的數量

sorted set 有序集合:每個元素都會關聯一個double型別的分數,通過分數來從小到大的排序
              “範圍查詢“的天敵就是”有序集合“,預設情況下,SortedSet是以key的升序排序的方式進行存放。

zScore
incrScore - zIncrBy - 為有序集key的成員member的score值加上增量increment
firstWithScore - zRange - 返回帶權重的第一個值  (取得特定範圍內的排序元素,0代表第一個元素,1代表第二個以此類推。-1代表最後一個,-2代表倒數第二個...)
srem - zRem - 移除有序集 key 中的一個或多個成員,不存在的成員將被忽略
sadd - zAdd - 將一個或多個 member 元素及其 score 值加入到有序集 key 當中
first - zRange - 獲取有序集合第一個
ZCARD key 獲取有序集合的成員數
ZCOUNT key min max 計算在有序集合中指定區間分數的成員數

有一個問題:memcach、redis的key可以用中文嗎? 可以- 但是將您的中文Key,加個密或轉下碼轉為一定規律的字串。不是更好嗎??