Redis學習筆記

Redis學習筆記

安裝

wget http://download.redis.io/releases/redis-4.0.9.tar.gznode

tar -xvf redis-4.0.9.tar.gzredis

make && make install數據庫

./utils/install_server.sh 配置啓動瀏覽器

ps -ef|grep redis 查看是否啓動緩存

service redis_6379 start 啓動服務器

service redis_6379 stop 中止cookie

redis默認只能localhost登陸,因此須要開啓遠程登陸。解決方法以下:session

在redis的配置文件redis.conf中,找到bind 120.0.0.1註釋掉。數據結構

protected-mode yes 改成 protected-mode noapp

redis-server 服務端命令

redis-cli 客戶端命令

建立多個

複製/etc/redis/redis.conf  /etc/redis/redis6379.conf

修改pidfile與port修改成新的端口號配置:

port  7000                                        //端口7000,7002,7003        
bind 本機ip                                       //默認ip爲127.0.0.1 須要改成其餘節點機器可訪問的ip 不然建立集羣時沒法訪問對應的端口,沒法建立集羣
daemonize    yes                               //redis後臺運行
pidfile  /var/run/redis_7000.pid          //pidfile文件對應7000,7001,7002
cluster-enabled  yes                           //開啓集羣  把註釋#去掉
cluster-config-file  nodes_7000.conf   //集羣的配置  配置文件首次啓動自動生成 7000,7001,7002
cluster-node-timeout  15000                //請求超時  默認15秒,可自行設置
appendonly  yes                           //aof日誌開啓  有須要就開啓,它會每次寫操做都記錄一條日誌 

redis-server /etc/redis/redis.conf 啓動便可

redis-server /etc/redis/redis.conf  & 後臺啓動

GUI https://redisdesktop.com/download

簡介

Redis是一個遠程內存數據庫。提供了5種不一樣類型的數據結構,經過複製、持久化和客戶端分片等特性,能夠方便進行擴展。

Redis是一個速度很是快的非關係型數據庫,能夠存儲鍵與5種不一樣類型的值之間的映射,能夠將存儲在內存的鍵值對數據持久化到硬盤,可使用複製特性來擴展讀性能,可使用客戶端分片來擴展寫性能。

Redis與Memcached比較,性能相差無幾,但Redis能夠自動以兩種不一樣的方式將數據寫入硬盤,而且能存儲5種數據結構。

對於內存數據庫來說,最重要的就是關機時,數據將何去何從。Reids擁有兩種不一樣形式的持久化方式,能夠用小而緊湊的格式寫入硬盤。

第一種持久化方式爲時間點轉儲,便可以在指定時間段內有指定數量的寫操做執行條件被知足時執行,還能夠經過調用兩條轉儲到硬盤命令中的任何一條來執行。

第二種持久化的方式將全部修改了數據庫的命令都寫入一個只追加文件裏面,用戶能夠根據數據的重要程度,將只追加寫入設置爲從不一樣步,每秒同步或寫入一個命令就同步。

Redis實現了主從複製特性,執行復制的從服務器會鏈接上主服務器,接受主服務器發送的整個數據庫的初始副本,以後主服務器執行的寫命令,都會被髮送給全部鏈接着的從服務器取執行,從而實時地更新從服務器的數據集。

使用Redis的理由

1. Redis的LIST和Set能夠容許用戶直接添加或刪除元素

2. 可讓代碼更簡單易懂、更容易維護,還可使代碼的運行速度更快。

3. 能夠直接使用原子的INCR命令請求並不須要通過查詢分析器和查詢優化器進行處理,對數據執行寫的速度很是迅速。

數據結構介紹

Reids能夠存儲多種不一樣數據類型之間的映射,分別爲String(字符串)、List(列表)、Set(集合)、HASH(散列)、ZSet(有序集合)、bitmaps、hyperloglogs、地理空間(geospatial)索引半徑查詢。

Redis內置了複製(replication)、LUA腳本(Lua scripting)、LRU驅動事件(LRU eviction)、事務(transactions)、磁盤持久化

經過Redis哨兵(Sentinel)、自動分區(Cluster)能夠提升可用性

有一部分命令是通用的,可是也有一部分命令只能對特定的一種或兩種結構使用。

STRING

能夠是字符串、整數、浮點型

能夠對整個字符串或其中一部分進行操做,對整數和浮點數進行自增、自減

LIST

一個鏈表,每一個節點都包含了字符串

能夠從兩端推入或者彈出元素,根據偏移量進行修剪。讀取單個或多個元素,查找或移除元素

SET

包含字符串的無序收集器,被包含的每一個字符串都是不一樣的

能夠添加、獲取、移除、檢查、計算交集、並集、差集、隨機獲取元素

HASH

包含鍵值對的無序散列表

能夠添加、獲取、移除、獲取全部

ZSET

字符串成員與浮點數分值之間的有序映射,元素的排列順序由分值大小決定

能夠添加、獲取、刪除、篩選

Reids中的字符串

字符串命令:GET、SET、DEL

使用redis-cli,啓動客戶端

set hello world

get hello

del hello

Reids中的列表

一個列表結構能夠有序地存儲多個字符串。

LPUSH命令和RPUSH命令 將元素推入列表的左端和右端

LPOP命令和RPOP命令 從列表的左端和右端彈出元素。

LINDEX 獲取列表在給定位置上的一個元素

LRANGE 獲取列表在給定範圍上的全部元素

127.0.0.1:6379> rpush list-key item
(integer) 1
127.0.0.1:6379> rpush list-key item2
(integer) 2
127.0.0.1:6379> rpush list-key item3
(integer) 3
127.0.0.1:6379> lrange list-key 0 -1
1) "item"
2) "item2"
3) "item3"
127.0.0.1:6379> lindex list-key 1
"item2"
127.0.0.1:6379> lpop list-key
"item"
127.0.0.1:6379> lrange list-key 0 -1
1) "item2"
2) "item3"

Redis中的集合 

Redis的集合和列表均可以存儲多個字符串,列表能夠存儲多個相同字符串,集合使用散列表來保證本身存儲的每一個字符串都是各不相同的。

集合使用無序方式存儲元素,從集合的某一端彈出元素。

SADD 將元素添加到集合

SREM 從集合移除元素

SISMEMBER 快速地檢查一個元素是否已經存在與集合中

SMEMBERS 獲取集合包含的全部元素

127.0.0.1:6379> sadd set-key item
(integer) 1
127.0.0.1:6379> sadd set-key item2
(integer) 1
127.0.0.1:6379> sadd set-key item
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item"
2) "item2"
127.0.0.1:6379> sismember set-key item3
(integer) 0
127.0.0.1:6379> sismember set-key item
(integer) 1
127.0.0.1:6379> srem set-key item
(integer) 1
127.0.0.1:6379> srem set-key item
(integer) 0
127.0.0.1:6379> smembers set-key
1) "item2"

Reids中的散列 

Reids的散列能夠存儲多個鍵值對之間的映射。和字符串不同,散列存儲的值既能夠時字符串又能夠是數字之,一樣能夠自增自減。

HSET 散列關聯起給定的鍵值對

HGET 獲取指定散列鍵的值

HGETALL 獲取散列包含的全部鍵值對

HDEL 若是給定鍵存在與散列,那麼移除

127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 1
127.0.0.1:6379> hset hash-key sub-key2 value2
(integer) 1
127.0.0.1:6379> hset hash-key sub-key1 value1
(integer) 0
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"
3) "sub-key2"
4) "value2"
127.0.0.1:6379> hdel hash-key sub-key2
(integer) 1
127.0.0.1:6379> hdel hash-key sub-key2
(integer) 0
127.0.0.1:6379> hget hash-key sub-key1
"value1"
127.0.0.1:6379> hgetall hash-key
1) "sub-key1"
2) "value1"

Redis中的有序集合 

有序集合和散列同樣,都用於存儲鍵值對。有序集合的鍵被稱爲成員,成員各不相同。值被稱爲分值,分值必須爲浮點數

ZADD 將一個帶有給定分值的成員添加到有序集合裏面

ZRANGE 根據元素在有序排列中所處的位置,獲取多個元素

ZRANGEBYSCORE 獲取有序集合在給定分值範圍內的全部元素

ZREM 若是給定成員存在於有序集合,那麼移除成員

127.0.0.1:6379> zadd zset-key 728 member1
(integer) 1
127.0.0.1:6379> zadd zset-key 982 member0
(integer) 1
127.0.0.1:6379> zadd zset-key 1 member0
(integer) 0
127.0.0.1:6379> zrange zset-key 0 -1 withscores
1) "member0"
2) "1"
3) "member1"
4) "728"
127.0.0.1:6379> ZRANGEBYSCORE zset-key 0 1 withscores
1) "member0"
2) "1"
127.0.0.1:6379> zrem zset-key member1
(integer) 1
127.0.0.1:6379> ZREM zset-key member1
(integer) 0

ZINCRBY 用於對有序集合成員的分值執行自增操做。ZINCRBY zset-k 1 mem

HINCRBY   用於對散列存儲的值執行自增操做。

EXPIRE 爲這個集合設置過時時間

登錄和Cookie緩存

當咱們登錄互聯網服務的時候,服務都會使用Cookie來記錄咱們的身份,由少許數據組成,會要求咱們瀏覽器存儲這個數據,並在每次服務發送請求時將這些數據回傳給服務。

對於用來登錄的cookie來講,有兩種常見的方法

一種是簽名cookie,一種是令牌cookie(token)

簽名cookie:一般會存儲用戶名、用戶ID、用戶最後一次登錄時間,以及任何有用的信息,簽名cookie還包含一個簽名,服務器能夠驗證這個簽名來驗證瀏覽器發送的信息是否未經改動

令牌cookie:會在cookie裏面存儲一串隨機字節做爲令牌,服務器能夠根據令牌在數據庫查找令牌擁有着。時間的推移,舊令牌會被替換。

針對令牌Cookie的狀況,可使用Redis散列來進行存儲令牌和已登錄用戶之間的映射。要檢查一個用戶是否已經登錄,根據令牌找對應用戶,登陸狀態下返回用戶ID

def check_token(conn, token):
return conn.hget('login:', token)

檢查令牌並不困難,複雜的工做都是在更新令牌時完成的。用戶每次瀏覽頁面,都會存儲在登錄散列裏面的信息進行更新,並將用戶的令牌和當前時間戳添加到記錄最近登錄用戶的有序集合裏面,並在被記錄商品的數量超過25個時,對這個有序集合進行修剪。

def update_token(conn, token, user, item=None):
    timestamp = time.time()
    conn.hset('login:', token, user)
    conn.zadd('recent:', token, timestamp)
    if item:
        conn.zadd('viewed:' + token, item, timestamp)
        conn.zremrangebyrank('viewed:' + token, 0, -26)

經過update_token函數,每秒至少能夠記錄20000件商品。比關係型數據庫,性能提高了10~100倍

購物車

使用cookie實現購物車,將整個購物車都存儲到cookie中的作法很是常見,這種作法的一大優勢是無須對數據庫進行寫入就能夠實現購物車功能,缺點是程序須要從新解析和驗證cookie,確保cookie格式正確,還有體積比較大,請求和處理的速度可能會下降

每一個用戶的購物車都是一個散列,存儲了商品ID與商品訂購數量之間的映射。在商品數量變化時,對購物車進行更新。若是某件商品的數量大於0,添加商品ID及數量到散列裏面。相反若是小於0,則移除此商品ID

def add_to_cart(conn, session, item, count):
    if count <= 0:
        conn.hdel('cart:' + session, item)
    else:
        conn.hset('cart' + session, item, count)

頁面緩存 

若是頁面的內容改變次數不多,能夠在請求以前或以後添加層(layer)的能力,這種層一般被稱爲中間層、插件。能夠調用Redis緩存函數,對於一個不能被緩存的請求,函數將直接生成並返回頁面。對於能夠被緩存的請求,函數會首先嚐試從緩存裏面取出並返回被緩存的頁面,若是緩存頁面不存在,那麼會將其緩存Redis裏面5分鐘,最後將頁面返回給調用者。

這樣可讓網站在5分鐘以內無需爲它們動態生成視圖頁面。

數據行緩存

對於沒法被整個緩存起來的頁面來說,能夠經過緩存頁面載入時所需的數據庫行來減小載入頁面所需的時間。

編寫一個持續運行的守護進程函數,讓函數將指定的數據行緩存到Redis裏面,並不按期地對這些緩存進行更新。緩存函數會將數據行編碼爲JSON字典並存儲在Redis字符串裏面,其中數據列的名字會被映射爲JSON字典的鍵,數據行的值則被映射爲JSON字典的值。

程序使用兩個有序集合來記錄應該在什麼時候對緩存進行更新,第一個有序集合爲調度有序集合,成員爲數據行的行ID,而分值則是一個時間戳,記錄了什麼時候將指定的數據行緩存到Redis裏面。第二個有序集合爲延時有序集合,成員也是數據行的行ID,分值則記錄了指定數據行的緩存須要每一個多少秒進行更新。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

$

相關文章
相關標籤/搜索