1. 程式人生 > 實用技巧 >初入Redis

初入Redis

一、背景

以前也看過一點Redis的內容,現在詳細的介紹一下。

二、介紹

1.Redis是完全開源的資料庫,遵從BSD協議,是一個高效能的key-value資料庫。Redis的優勢:

1.Redis支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟的時候可以再次載入進行使用。
2.Redis不僅僅支援簡單的key-value型別的資料,同時還提供list,set,zset,hash等資料結構的儲存。
3.Redis支援資料的備份,即master-slave模式的資料備份。

2.Redis的優勢

1.效能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
2.豐富的資料型別 – Redis支援二進位制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料型別操作。
3.原子 – Redis的所有操作都是原子性的,意思就是要麼成功執行要麼失敗完全不執行。單個操作是原子性的。多個操作也支援事務,即原子性,通過MULTI和EXEC指令包起來。 4.豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。

3.Redis的資料型別

Redis支援五種資料型別:string(字串),hash(雜湊),list(列表),set(集合)及zset(sorted set:有序集合)。

3.1字串

string 是 redis 最基本的型別,你可以理解成與 Memcached 一模一樣的型別,一個 key 對應一個 value。

string 型別是二進位制安全的。意思是 redis 的 string 可以包含任何資料。比如jpg圖片或者序列化的物件。

string 型別是 Redis 最基本的資料型別,string 型別的值最大能儲存 512MB。

例項

用SET(可以小寫)設定string的資料欄位  單引號或者雙引號都可以
用GET獲取資料

SET first "我愛Redis"
>>> OK
GET first
>>> "我愛Redis"

3.2Hash(雜湊)

Redis hash 是一個鍵值(key=>value)對集合。

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

每個 hash 可以儲存 232 -1 鍵值對(40多億)。

例項

使用HMSET設定資料

使用HGET獲取資料,使用對應的key獲取對應的field

HMSET runoob field1 
"Hello" field2 "World" >>> OK HGET field1 >>> "Hello" HGET field2 >>> "World"

3.3List(列表)

Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素到列表的頭部(左邊)或者尾部(右邊)。其中左邊預設為列表的頭部(索引小的),右邊預設為列表的尾部(索引大的),同時列表中的資料可以重複
列表最多可儲存
232 - 1 元素 (4294967295, 每個列表可儲存40多億)。

例項

Lpush——先進後出,在列表頭部插入元素
Rpush——先進先出,在列表的尾部插入元素
Lrange——出棧,根據索引,獲取列表元素
Lpop——左邊出棧,獲取列表的第一個元素
Rpop——右邊出棧,獲取列表的最後一個元素
Lindex——根據索引,取出元素
Llen——連結串列長度,元素個數
Lrem——根據key,刪除n個value
Ltrim——根據索引,刪除指定元素
Rpoplpush——出棧,入棧
Lset——根據index,設定value
Linsert before——根據value,在之前插入值
Linsert after——根據value,在之後插入值

順序和新增元素的驗證:

然後lpush,rpush,lpush說明他的新增元素的順序以及輸出的結果
> Lpush list1 java
(integer) 1
> rpush list1 java1
(integer) 2
> lpush list1 python
(integer) 3
> lrange list1 0 10
1) "python"
2) "java"
3) "java1"

出棧入棧插入:

RpopLpush指令

指令RpopLpush  list1  list2表示:list1從右邊出棧的元素從左邊加入到list2中
>Rpoplpush list1 java2
"java1"
> lrange list1 0 10
1) "python"
2) "java"
> lrange java2 0 10
1) "java1"

pop指令等

> Lrange list1 0 -1
1) "javak-1"
2) "python"
3) "java"
4) "javak-2"
> Rpop list1
"javak-2"
> Lpop list1
"javak-1"
> Lrange list1 0 -1
1) "python"
2) "java"
> Lindex list1 8  沒找到就是nil
(nil)
> Lindex list1 1
"java"
> llen list1
(integer) 2

插入指令

插入指令語法:Linsert list_object  after/before  列表中元素   插入元素
> Linsert list1 after java java1
4
> lrange list1 0 -1
1) "java"
2) "java1"
3) "python"
4) "java"
> Linsert list1 before java java2
5
> lrange list1 0 -1
1) "java2"
2) "java"
3) "java1"
4) "python"
5) "java"
> Linsert list1 before javan javak
-1
> lrange list1 0 -1
1) "java2"
2) "java"
3) "java1"
4) "python"
5) "java"
注意:如果元素沒有就會顯示插入失敗,返回-1的值,插入順序只有左插入,在遇到第一個元素時就插入並結束插入過程

索引操作和值操作

語法:Lindex list_object index表示從列表物件中獲取索引位置的元素
> lrange list1 0 -1
1) "java2"
2) "java"
3) "java1"
4) "python"
5) "java"
> Lindex list1 3
"python"
> Lindex list1 100
(nil)

語法:Lset list_object index  替換內容,表示從列表中選取index的元素,並進行替換
> lrange list1 0 -1
1) "java2"
2) "java"
3) "java1"
4) "python"
5) "java"
> lset list1 0 php
OK
> lrange list1 0 -1
1) "php"
2) "java"
3) "java1"
4) "python"
5) "java"

Lrem list_object number key:根據key值刪除列表物件中的指定數量的元素
> lrange list1 0 -1
1) "java"
2) "python"
3) "java1"
4) "java"
5) "python"
6) "java1"
> lrem list1 1 python
(integer) 1
> lrange list1 0 -1
1) "java"
2) "java1"
3) "java"
4) "python"
5) "java1"

Ltrim list_object start_index  end_index:根據index的刪除列表物件中的指定元素,需要注意壓棧的順序,從左邊入棧左邊就是小的,從右邊入棧右邊就是小的
> Lpush list1k java php python ruby Django
(integer) 5
> lrange list1k 0 -1
1) "Django"
2) "ruby"
3) "python"
4) "php"
5) "java"
> Ltrim list1k 0 2
OK
> lrange list1k 0 -1
1) "Django"
2) "ruby"
3) "python"

3.4Set(集合)

Redis 的 Set 是 string 型別的無序集合。

集合是通過雜湊表實現的,所以新增,刪除,查詢的複雜度都是 O(1)。

注意:根據集合內元素的唯一性,第二次插入的元素將被忽略。

集合中最大的成員數為 232 - 1(4294967295, 每個集合可儲存40多億個成員)。

3.5zSet(有序集合)

Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個double型別的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。

zset的成員是唯一的,但分數(score)卻可以重複。

4.各類資料的應用場景

型別簡介特性場景
String(字串) 二進位制安全 可以包含任何資料,比如jpg圖片或者序列化的物件,一個鍵最大能儲存512M ---
Hash(字典) 鍵值對集合,即程式語言中的Map型別 適合儲存物件,並且可以像資料庫中update一個屬性一樣只修改某一項屬性值(Memcached中需要取出整個字串反序列化成物件修改完再序列化存回去) 儲存、讀取、修改使用者屬性
List(列表) 連結串列(雙向連結串列) 增刪快,提供了操作某一段元素的API 1,最新訊息排行等功能(比如朋友圈的時間線) 2,訊息佇列
Set(集合) 雜湊表實現,元素不重複 1、新增、刪除,查詢的複雜度都是O(1) 2、為集合提供了求交集、並集、差集等操作 1、共同好友 2、利用唯一性,統計訪問網站的所有獨立ip 3、好友推薦時,根據tag求交集,大於某個閾值就可以推薦
Sorted Set(有序集合) 將Set中的元素增加一個權重引數score,元素按score有序排列 資料插入集合時,已經進行天然排序 1、排行榜 2、帶權重的訊息佇列

三、參考與手冊

菜鳥教程這裡有關於Redis很詳細的操作,可以參考。

網站,這個網站可以進行線上學習。ush list1k java php python ruby Django

(integer) 5 >lrange list1k 0 -1 1) "Django"
2) "ruby"
3) "python"
4) "php"
5) "java" >Ltrim list1k 0 2 OK >lrange list1k 0 -1 1) "Django"
2) "ruby"
3) "python"