NoSql之Redis數據庫

一.NoSqlRedis數據庫

1.Redis簡介

Redis是Remote Dictionary Server(遠程數據服務)的縮寫,它是NoSql中一款很是出色的產品,由意大利人 antirez(Salvatore Sanfilippo)  開發的一款內存高速緩存數據庫同時支持持久化設置。該軟件使用C語言編寫,它的存儲格式也是key-value然而它支持豐富的數據結構,具體一共有5種數據類型,還有1中服務器命令類型(key類型,不支持windows)php

String(字符串類型)html

list(鏈表)mysql

hash(哈希表類型)linux

set(無序的集合)  laravel

sorted set(有序集合,縮寫爲zset)。redis

並且redis經過簡單的配置把數據從內存保存到硬盤當中進行持久保存。算法

Redis爲高併發而生,是NoSql中的佼佼者sql

2.Redis的特色

1)高速讀取數據(in-memory)shell

2)減輕數據庫負擔數據庫

3)有集合計算功能(優於普通數據庫和同類別產品)

4)多種數據結構支持

 

下面是官方的bench-mark數據測試數據:

1.測試完成了50個併發執行100000個請求。

2.設置和獲取的值是一個256字節字符串。

3.Linux box是運行Linux 2.6,這是X3320 Xeon 2.5 ghz。

4.文本執行使用loopback接口(127.0.0.1)。

結果:讀的速度是110000次/s,寫的速度是81000次/s 。

 

3.Redis的缺點

Redis雖然具備安全認證機制,但Redis的安全認證機制是明文的密碼,因此Redis並不安全,聽說這是由於它的開發者並不擅長安全加密領域,因此只能簡單地賦予Redis一個明文的安全認證和本地安全訪問機制,Redis是一個我的開發者提供的開源產品,並無正式官方支持它的發展

二.RedisMemcache的對比和區別

memcache不支持數據持久化,軟件運行和安裝都較小。Memcache是存內存存儲的數據庫,memcache沒有能力把數據保存到硬盤中進行持久化保存,單個key只能保存1M的數據,默認最大的內存存儲量是64M,使用當中,memcache能夠直接設置超時時間,Memcache具備分佈式的算法功能。

redis 支持數據持久化和內存存儲兩種方式,軟件運行比memcache大一點,設置超時的key,須要使用另外的函數,redis集羣是一個主從模式的,主服務器可用來讀寫,從服務器只能用來讀。redis沒有內置的分佈式算法功能。Redis單個key能夠存儲最大空間爲1G,而總存儲容量能夠視硬盤的大小而定。

PHP的官方當中Memcache具備Memcache類和Memcached類。而Redis沒有PHP官方的支持,Redis的PHP擴展是其開發做者編寫的。

在國內使用php+redis架構的公司,新浪微博,微信朋友圈

三.Redis的安裝和啓動

1.Redis的安裝操做系統說明

redis是一款開源產品,主要開發平臺爲linux,因此原生的代碼在linux下運行是最好的。

redis做者不肯意開發windows版本下的redis,微軟技術小組,在redis源碼的基礎上,進行了開發windows版的redis,主要提供給ASP.NET使用,因此你也能夠安裝windows版本的redis程序。在本階段當中,咱們主要學習redis在Linux下的應用爲主。

2.Linux下安裝Redis

安裝命令:yum -y install redis

Reids的命令行工具是很是人性化,因此咱們可使用xshell工具來操做Redis,安裝的步驟以下圖所示:

 

 

回車就能夠安裝redis.成功安裝出現的界面以下圖所示

 

 

當安裝完成以後,咱們能夠使用rpm -ql redis查看redis全部的安裝目錄和文件的存放位置,效果以下圖所示:

 

 

3.安裝RedisPHP擴展PHP5.6當中

Linux服務器中的/var/www/html下有一個文件叫phpinfo.php(這個文件是咱們以前學習所創建的,你能夠在memcache的課程目錄code當中找回),因此你須要運行該文件來獲取php當前的擴展模塊信息,搜索redis關鍵字,發覺沒有找到,證實redis沒有安裝,然而咱們的php版本須要肯定是否爲php5.6,由於laravel框架找須要使用php.5.5以上的版本才能支持redis,因此你的php版本必須爲php5.5以上,肯定信息以下圖所示:。

 

 

確認無誤後,能夠鍵入一下安裝命令(該命令只能安裝php5.6的redis擴展包):

yum install -y --enablerepo=remi --enablerepo=remi-php56 php-pecl-redis

安裝的結果以下:

 

 

回車就能夠安裝,完成後,效果以下圖所示:

 

 

完成了以上的安裝後,咱們須要重啓apache服務器,命令: service httpd restart,效果以下:

 

 

重啓apache後,從新在瀏覽器端打開phpinfo.php查看redis的擴展模塊是否正確安裝,效果以下圖所示,表明安裝成功:

 

 

然而redis的本地安全機制很坑爹,因此咱們須要修改redis的配置文件,讓php能正常的支持redis擴展,redis的配置文件目錄在/etc/redis.conf下,因此咱們可使用vim /etc/redis.conf打開redis的配置文件,效果以下圖所示:

 

 

回車打開/etc/redis.conf文件,內容以下:

 

 

這時redis的安全本地訪問機制,默認狀況是打開的

註釋結果以下:

 

 

保存並退出(:x),註釋該選項會屏蔽掉redis的本地安全訪問機制,由於redis的這個機制很坑爹。這時若是你的redis處於啓動的狀態那麼就須要重啓,若是沒有開啓的時候須要開啓,命令以下:

service redis start #開啓redis服務器

service redis restart #重啓redis服務器

service redis stop#中止redis服務器

service redis status#查看redis服務器的狀態

 

 

redis加入開機啓動腳本當中:chkconfig redis on

 

 

4.啓動並登陸Redis客戶端

第一步:啓動redis服務器,命令:service redis start

 

 

第二步:redis安裝的時候會在/usr/bin有一個叫作redis-cli的文件,具體的路徑以下:

/usr/bin/redis-cli,該文件是一個redis的客戶端登錄工具,咱們能夠直接忽略路徑輸入redis-cli 這個命令進入redis客戶端,以下所示:

 

 

默認會啓動redis的6379端口

使用exit退出redis客戶端

四.Redis的數據類型和管理命令

1.RedisString數據類型

string是redis最基本的類型

redis的string能夠包含任何數據。包括jpg圖片或者序列化的對象。

單個value值最大上限是1G字節。memcache單個value存儲1M。

若是隻用string類型,redis就能夠被看做加上持久化特性(服務器重啓以後,數據不丟失)的memcache

1set命令

該命令用於設置或者修改Redis中的鍵值(這個功能於Memcache的set有點相似) 命令語法:set 鍵名(key) (value) 

例如:咱們添加一個name=「xiaoqian」的鍵值對。 

使用命令: set name xiaoqian

 

 

修改name的值爲ningcaichen

 

 

注意:在redis當中默認使用set那麼會永久存儲在硬盤和內存當中,使用redis快照的方式進行存儲的,redis的string類型沒有所謂的過時時間命令,過時時間的命令屬於服務器的key類型

2get命令

該命令用於獲取Redis中key對應的string值,若是key不存在返回 nil,

命令語法:get 鍵名

1.獲取一個已經存在的鍵名,能夠獲得該鍵名的值

 

 

2.若是一個鍵名不存在,那麼獲取該鍵名會返回nil

 

 

 

2.Redishash數據類型

 

 

1)hset命令(hash set)

命令的功能:在哈希表中設置一個字段(field)和 一個字段的值(value)

命令格式: hset 哈希表的名稱 字段(field) 字段值(value)

例如:存儲一個名爲Users:Jay,字段爲name,age和jober的哈希表數據,以下:

 

 

2)hget命令

命令的功能:在一張指定的哈希表中獲取字段的值,若是字段不存在那麼將返回nil

命令格式: hget 哈希表的名稱 字段(field)

例如:獲取一張名爲Users:Jay的哈希表中獲取姓名和年齡,代碼以下所示:

 

 

以上使用hset和hget咱們獲取和設置哈希表的要一個一個的進行,比較沒有效率,假設咱們要一次設置多個哈希表的字段和值,那麼咱們應該怎麼作呢?

3)hmset命令

命令的功能:在哈希表中設置多個字段(field)和 多個字段的值(value)

命令格式: hmset 哈希表的名稱 字段(field) 字段值(value)....

例如:存儲一個表名爲foods,字段名爲food1,存放的字段值爲apple,字段名爲food2,存放的字段值爲pear,命令以下所示:

原理圖以下:

 

 

設置上表命令以下所示:

hmset Foods:Fruit foods1 apple foods2 pear

 

 

4)hgetall命令

命令的功能:在哈希表獲取全部的字段和值

命令格式: hgetall 哈希表的名稱

例如:獲取一個表名爲Foods:Fruit的哈希表中的全部字段和值,代碼以下所示:

hgetall Foods:Fruit

 

 

假設要獲取Users:Jay,那麼語句以下:

 

 

 

hset和hget的應用的範圍以下:

例子1:把Users:Jay當中的age改成55歲,而且只獲取其年齡,咱們應該如何操做

 

 

 

 

例子2:把Users:Jay當中添加一個字段爲money,值爲8000元,這時應該如何作?

 

 

3.Redis的list鏈表數據類型

鏈表數據結構中的棧:先進後出的特色,其原理圖以下:【索引從0開始,最後進的索引爲0】

 

 

鏈表數據結構中的隊列:先進先出【索引從0開始,第一個進的索引爲0】

 

 

1)lpush命令(跟棧相關)

命令的功能:在鏈表的棧中由頭部壓入一條數據

命令格式: lpush 鏈表的名稱(棧名稱) 值

命令以下:

例子:在一個名爲list8的棧中壓入數據one,two,three

 

 

以上分別在棧中頭部壓入的順序爲one,two,three,以下圖所示

 

 

2)rpush命令(跟隊列相關)

命令的功能:在鏈表的隊列中由尾部壓入一條數據

命令格式: rpush 鏈表的名稱(隊列) 值

命令以下:

例子:在一個名爲list9的隊列中壓入數據one,two,three

 

 

以上分別在隊列中尾部壓入的順序爲one,two,three,以下圖所示

 

 

 

3)lrange命令(跟隊列和棧都相關,用於查詢)

命令的功能:在鏈表的中獲取一個範圍的數據

命令格式: lrange 鏈表的名稱 開始位置 結束位置(-1表明獲取到所有)

例如:獲取一個棧的全部數據,好比獲取list8的鏈表中全部棧的數據

lrange list8 0 -1

 

 

如圖所示:

 

 

 

例如:獲取一個隊列list9的全部數據

lrange list9 0 -1

 

 

如圖所示:

 

 

 

例如:獲取一個隊列list9中開始位置爲0,結束位置爲1的數據

 

 

例如:獲取一個棧list8中開始位置爲1,結束位置爲2的數據

 

(4)lpop命令(與棧和隊列相關)

命令的功能:移除並返回 key 的頭元素的值

命令格式: lpop 鏈表的名稱

彈出list8棧中頭部數據,以下圖所示:

 

 

彈出成功後,list8的棧中剩下如下數據:

使用命令: lpop list8

 

 

 

這時two就處於棧中的頭部,若是你繼續lpop就會依次彈出並刪除two,one這個兩個數據

彈出list9隊列中的頭部數據,以下圖所示:

 

 

彈出成功後,list9的隊列中剩下如下數據:

使用命令: lpop list9

 

 

這時two就處於隊列中的頭部,若是你繼續lpop就會依次彈出並刪除two,three這個兩個數據

 

(5)ltrim命令(通常用於隊列操做比較多)

命令的功能:讓列表只保留指定區間內的元素,不在指定區間以內的元素都將被刪除

命令格式: ltrim 鏈表的名稱 開始的位置 結束的位置

例子1:在list10的隊列中壓入元素爲one,two,three,four

 

 

執行結果以下:

 

 

例子2:在list10的隊列保存two和three,刪除one和four

分析可知,two和three所在的索引爲1和2,所以命令編寫以下:

ltrim list10 1 2

 

 

執行結果以下所示:

 

 

4.Redis的Set集合數據類型(無序集合)

在現實開發當中集合通常用於社交網站或者社交軟件的朋友圈功能(例如:新浪微博好友圈),以下圖所示:

 

 

在現實的社交網站開發當中存在着一個好友推薦的功能,這個就是把一個用戶有朋友而另外一個用戶沒有的朋友推薦,在redis當中這種功能可使用集合中求差集的方法進行實現

差集的定義:一個集合存在某一個元素,而另一個集合不存在的元素,該元素就屬於兩個集合的差集

 

 張三與李四差集:以張三爲主,張三多出公有的部分的那一部分

交集的定義:一個集合和另一個集合共同的元素,稱爲交集,在現實開發當中就是社交網站的共同好友功能

 

 

並集的定義:一個集合和另一個集合進行合併而後去除重複的元素後所獲得的結果就是並集,在實際開發當中並集的使用就是爲了共享,遊戲行業中的道具共享就是並集的結果

 

 

1)sadd命令(set add)

命令的功能:在無序集合當中添加一個元素,該元素若是存在該元素不會被重複添加

命令格式: sadd 集合的名稱 集合的元素

好比:建立一個zhangsan的朋友圈集合

 

 

好比:建立一個lisi的朋友圈集合

 

 

2)smembers命令(set members)

命令的功能:獲取一個無序集合中的全部元素

命令格式: smembers 集合的名稱

好比:建立一個zhangsan的朋友圈集合裏面的好友列表

 

 

好比:建立一個lisi的朋友圈集合裏面的好友列表

 

 

(3)sdiff命令

命令的功能:以一個集合做爲標準去求另一個集合不存在的元素,咱們稱爲差集(能夠參考集合概念中差集的圖片輔助理解)

命令格式: sdiff 做爲標準的集合名稱 求差集的集合名稱

好比:以張三的朋友圈(zsFriends)做爲標準去求李四朋友圈(lsFriends)中的差集,

使用命令: sdiff zsFrineds lsFriends

 

 

結果以下圖所示:

 

 

好比:以李四的朋友圈(lsFriends)做爲標準去求張三的朋友圈(zsFrineds)中的差集,結果以下圖所示:

 

 

結果以下圖所示:

 

 

 

(4)sinter命令

命令的功能:一個集合和另一個集合共同的元素,咱們稱爲交集(能夠參考集合概念中交集的圖片輔助理解)

命令格式: sinter 集合名稱1 集合名稱2

好比說:咱們但願找到zsFrineds和lsFriends裏面的共同好友(元素),代碼以下:

①sinter zsFriends lsFriends

②sinter lsFriends zsFriends

使用命令①和命令②結果是同樣的:

 

 

(5)sunion命令

命令的功能:求出兩個集合合併後全部的元素並去掉重複的元素的結果稱爲並集(能夠參考集合概念中並集的圖片輔助理解)

命令格式: sunion 集合名稱1 集合名稱2

好比:把張三的朋友和李四的朋友合併在一塊兒進行羣聊功能就可使用如下命令:

①sunion zsFrineds lsFriends

②sunion lsFriends zsFrineds

使用命令①和命令②結果是同樣的:

 

 

 

(6)scard命令

命令的功能:統計集合中的元素個數,並返回總數的整型值

命令格式: scard 集合名稱

好比:但願知道張三有多少個好朋友,那麼就可使用該命令:

 

 

能夠知道張三一共有4個好友,若是如今再添加一個好友叫caisibei那麼它就會有五個好友了:

 

 

5.Redis的Zset集合數據類型(有序集合)

sorted set是set的一個升級版本,意大利文叫zset,在set的基礎上增長了一個順序屬性,這一屬性在添加修改元素的時候能夠指定,每次指定後,zset會自動從新按新的值調整順序。有序列表值完成的是集合元素排序的功能,通常不多用於其餘方向。

(1)zadd 命令

命令功能:向有序集合中添加元素。若是該元素存在,則更新其順序。

zset當中序號是順序,索引號是下標,注意區分,按序號排序,改變序號。則會從新排序

命令格式: zadd  集合名  序號  元素

好比:添加一個明星的集合,1爲林志玲(lzl),2爲高圓圓(gyy),3爲蔡思貝(csb)

 

 

1,2,3是元素的順序號,而他們的索引號是0=lzl,1=gyy,2=csb

注意:若是一個元素存在,而它的序號發生改變,那麼會從新更新的她的順序,效果以下:

 

 

若是再次使用zrange stars 0 -1去查看,發覺lzl排到csb以後,由於csb的序號是3,而lzl的序號是100,由小到大排列天然是100在3的後面

 

 

(2)zrange命令

命令功能:按序號升序(由小到大)獲取有序集合中的內容

命令格式zrange 集合名稱 開始位置(索引)  結束位置(索引)(-1獲取所有)

好比:獲取stars當中全部有序集合中的元素,用升序進行排列

使用命令:zrange stars 0 -1

 

 

3zrevrange命令

命令功能:按序號降序(由大到小)獲取有序集合中的內容。

命令格式zrevrange 集合名稱 開始位置(索引)  結束位置(索引)(-1獲取所有)

好比:獲取stars當中全部有序集合中的元素,用降序序進行排列

 

 

注意:開始位置並不是指代你添加序號,而是集合的索引號,zadd 添加的是序號,序號不是索引號,索引號就比如數組當中的索引號 。

.Redis中與Key相關的命令

1)keys * 命令

命令功能:返回當前數據庫裏面的鍵

 

 

2)exists命令

命令功能:判斷一個鍵是否存在。

命令格式exists  鍵名

 

 

 

若是返回0表明該鍵名不存在,若是返回1表明鍵名存在

3)del

命令功能:刪除指定的鍵(key),若是返回1表明刪除鍵名成功,返回0表明刪除失敗

命令格式del  鍵名

 

 

刪除成功查看name的鍵名

 

 

 

4)expire

命令功能:設置鍵的有效期,若是不調用該命令設置鍵名,默認的狀況下鍵名自己就是永遠不過時

命令格式expire  鍵名  有效期(秒數)

 

 

返回nil表明爲null,而且redis已經刪除了name這個鍵名不會佔據任何的內存和硬盤空間.

設置過時時間返回1表明設置成功,返回0表明設置過時時間失敗。

 

 

若是咱們設置了一個Key的過時時間有60秒,假設咱們想知道,當前這個key還有多長時間才過時,那麼咱們應該作作呢?使用ttl命令,該命令返回過時的倒數時間,結果以下:

 

 

 

5type

命令功能:返回一個鍵的數據類型

命令格式 type  鍵名

 

 

.安全認證

在默認的狀況下redis不須要任何密碼就能夠登陸,爲了設置客戶端鏈接後進行任何其餘操做前須要使用的密碼,咱們使用Redis的安全認證,然而這個安全認證的密碼是明文的。使用exit退出redis客戶端

方法:打開redis的配置文件文件位於/etc/redis.conf

設置安全認證的步驟以下:

1步:使用vim打開/etc/redis.conf文件,使用末行模式搜索關鍵字/foobared,獲得的內容以下:

 

 

2步:把requirepass前的#去除,而且修改redis的安全認證密碼爲123456【這個是便於後面認證用】

 

 

設置完成後,保存並退出(:x)

3步:若是但願redis的安全認證生效,那麼須要重啓redis服務器

 

 

4步:使用redis-cli命令進行登陸,發覺能夠進入客戶端界面但沒法進行操做

 

 

這時咱們須要使用exit命令(快捷鍵ctrl+c)退出redis的客戶端,效果以下圖所示:

 

 

5步:使用安全認證密碼進行登陸再查看redis客戶端操做結果,以下圖所示:

安全認證登陸命令 redis-cli -a 安全認證密碼     【redis-cli中間沒有空格】

 

 

這時表示安全認證設置成功。

.Redis的持久化AOF設置

redis當中,redis開發設計兩種持久化的模式,以下

 

1.Redis的快照模式(默認安裝完成就會自動開啓的持久化模式)能夠經過如下路徑查看redis的快照文件,路徑爲/var/lib/redis/dump.rdb

dump.rdb文件就是redis的快照文件,它保存了redis全部的數據信息和記錄,若是當網站數據量變大,該文件也會隨之增大,若是您操做增刪改那麼就有可能在一個很是龐大容量的快照文件中去完成這一項工做,效率很低。所以咱們有必須去把改模式改成aof持久化模式。

 

2.Redis中的Aof模式:Redis的aof文件有點類型mysql的binlog日誌,該文件把用戶的操做記錄包括查詢的過程所有記錄,那麼當redis在運行時,數據會在redis的一個自定義內存中去訪問,而Aof文件只會記錄這些內存數據的操做,當服務器重啓時,那麼redis纔會將數據從內存中保存到Aof當中,當服務器從新運行時那麼aof就會根據操做的記錄把數據從新還原到Redis的內存當中過去,以卻保數據的完整性。咱們做爲應用者,只須要了解aof的持久化模式是記錄用戶的操做而非實時數據記錄就能夠了,然而咱們須要知道如何開啓aof持久化模式。

 

首先咱們須要觀察/var/lib/redis下有又沒存在一個.aof的文件,查看結果以下圖所示:

 

 

所以咱們須要經過編輯/etc/redis.conf文件去開啓redis的aof持久化模式,以提升網站的訪問速度。設置aof持久化模式的步驟以下:

 

1步:使用vim打開/etc/redis.conf文件,經過末行模式搜索/appendonly,獲得如下內容:

 

 

2步:把appendonly 的選項由no改成yes,表明開啓aof持久化模式,同時須要把appendfilename選項前的#去除,修改以下圖所示:

 

 

3步:觀察與aof模式相關幾個配置項,而且理解這個幾個配置項的做用是什麼

 

 

若是aof的模式一旦啓動,那麼快照就會失效,redis就會把全部的數據緩存到內存當中,若是你發生重啓,中止,關閉服務器等行爲,那麼aof文件就會把內存中數據同步到硬盤中

appendfsync always的選項表明redis的命令每一次只要運行那麼就會立刻寫入aof操做文件當中,更選項是最沒有效率的,而後它倒是最具有操做記錄完整性的。

appendfsync everysec 的選項是redis比較折中的選項,表明每一秒中只有由操做那麼就會進行操做記錄,可是若是在某一秒當中redis發生故障,那麼這一秒的數據操做記錄將有可能發生丟失的狀況,存在必定的風險,然而這個配置的性能比較適合中,因此建議使用,由於redis一秒中內能夠寫81000次/s因此雖然存在必定的風險,但只要不要把一些很是重要的敏感數據至於redis當中,那麼就不須要過度擔憂這個問題

appendfsync no 該配置的效率徹底依賴您當前所在使用的操做系統和計算機的性能,若是操做系統穩定,計算機的性能強大,那麼這一項是最有效率的,反而就是最差,因此通常最好不要設置該項

 

4步:開啓完成後,須要重啓redis服務器,以下圖所示:

 

 

5步:重啓完成後,必須去/var/lib/redis目錄下去查看是否具備aof文件的生成

 

 

6步:使用redis-cli -a 123456登陸到redis的客戶端命令行當中,插入操做一些數據記錄

 

 

7步:再次查看/var/lib/redis目錄下的aof文件的變化

 

 

8步:使用vim打開/var/lib/redis目錄下的aof文件,觀察到如下結果:

 

 

出現以上結果,表明aof持久化模式生效。

若是aof生效了,那麼快照模式就自動失效了,若是你把aof關閉了,那麼快照就會從新自動生效。

.PHP操做Redis的基本方法

redis在php的官方里面並無被承認,因此php的官方沒有redis的php開發文檔,所以對咱們使用php操做redis就帶來了問題,因此咱們須要備用一些離線的手冊做爲往後開發只用。可使用如下這個文檔,也能夠本身去下載本身喜歡的文檔

 

 

1.使用php鏈接Redis

參考代碼:code/connect.php,上傳到/var/www/html下進行測試

 

 

瀏覽器的測是結果以下,出現如下界面表明鏈接成功了:

 

 

2.使用set方法操做redis

參考代碼:code/set.php,上傳到/var/www/html下進行測試

 

若是但願存入中,那麼咱們須要修改代碼以下:

 

 

 

瀏覽器的測是結果以下,出現如下界面表明鏈接成功了:

 

 

 

redis命令行結果以下,發現被轉成了utf-8的字節編碼(不是亂碼):

 

 

utf-8默認用3個字節來表達一個漢字,在redis中不能正常看到中文的顯示,不過咱們能夠經過php的get正常獲取結果以下:【有中文的,咱們須要在php中設置header】

 

 

執行結果以下:

 

 

3.使用hmset和hgetall操做redis的哈希表

參考代碼:code/hmset.php,上傳到/var/www/html下進行測試

例子1:設置一個明星的哈希表Stars:Angela,其字段name=楊穎 born=香港 age=28

 

 

 

瀏覽器的測是結果以下,出現如下界面表明鏈接成功了:

 

 

redis命令行結果以下,發現被轉成了utf-8的字節編碼(不是亂碼):

 

 

 

例子2:設置一個明星的哈希表Stars:Angela,添加兩個字段hasChild=有,hasDear=黃曉明,修改其年齡爲38歲

參考代碼:code/hmset2.php,上傳到/var/www/html下進行測試

 

 

測試以下:

 

 

4.使用sadd和smembers操做無序集合

參考代碼:code/sAdd.php,上傳到/var/www/html下進行測試

例子1:創建張三和李四的朋友圈

 

 

瀏覽器的測是結果以下:

 

 

例子2:分別以張三和李四做爲標準,求他們各自的差集

參考代碼:code/sDiff.php,上傳到/var/www/html下進行測試

 

 

 

 

執行結果以下:

 

 

例子2:分別以張三和李四的共同好友,求張三和李四的交集

參考代碼:code/sInter.php,上傳到/var/www/html下進行測試

 

 

 

執行結果以下:

 

 

 

例子3:張三和李四的好友列表共享,求並集

 

 

執行結果以下:

 

 

 

5.使用zadd和zrange和zrevrange操做有序集合

參考代碼:code/zAdd.php,上傳到/var/www/html下進行測試

例子1:讀取數據庫當中的新聞列表到有序集合當中

 

 

測試結果以下;

 

 

例子2:把無序集合中的內容讀取到網頁當中

 

 

測試結果以下:

 

 

 

例子3:完善zAdd.php程序以下

 

 

爲了解決的重複性記錄問題,咱們須要每次複製數據庫記錄到zset當中以前把zset的key先刪除,因此修改代碼以下:

 

 

 

.使用TP操做Redis(拓展知識)

thinkPHP3.2.3當中tp框架把Redis當成了緩存來對待,因此Redis在tp框架中就是一個Memcache的使用,它只能操做Redis的String數據類型,然而使用Laravel框架能夠更好的使用Redis,若是消息隊列等等.

thinkPHP3.2.3當中把Redis當作緩存也就算了,但的是ThinkPHP3.2.3的Redis操做類有個小bug,所以我我的認爲這個類的底層須要修改的,因此我把它修改了,所以咱們如今用的這個ThinkPHP3.2.3當中Redis配置若是你放在標準的Redis下是不會生效的。若是你對這個Redis類的bug有興趣,那麼你能夠參考一下路徑,打開一下路徑進行查看

tp\ThinkPHP\Library\Think\Cache\Driver\Redis.class.php

 

 

修改bug完成後,那麼咱們須要在Application/Common/Conf/config.php加入配置內容以下:

 

 

完成後,編寫IndexController.class.php文件以下:

 

 

測試結果以下所示:

 

 

編寫操做String數據類性的增,改和刪

 

 

若是但願使用框架操做redis最好就是laravel,由於laravel的做者之一是redis原生開發者

十.使用PHP實現消息隊列

(實際就是操做鏈表數據類型的隊列)

使用php代碼實現醫院的模擬醫生就診叫號流程:

1)掛號(把病人的信息加入消息隊列)

2)醫生叫號(把病人的信息在消息隊列中彈出,病人看完後醫生中止就診)

1步:編寫掛號的代碼以下 :

 

 

測試結果以下所示:

 

 

2步:是醫生叫號,病人排隊進入診室,就把隊列中依次彈出

 

 

測試結果以下:

 

 

繼續刷新頁面,醫生實際中是點擊了一個按鈕

 

 

繼續刷新頁面,醫生實際中是點擊了一個按鈕

 

 

若是醫生看完了全部的病人,那麼就應該顯示當前當前中止就診了

 

 

十一.Redis16個數據庫和分庫操做

在默認的狀況下其實Redis有16個數據庫,若是您默認進入redis當中其實redis會幫你選擇了一個id=0的數據庫,若是你但願切換數據庫,那麼就可使用一個命令叫select

命令格式:select 數據庫的id(0-15)

例子1:切換到2號數據庫中

 

 

假設在當前數據中操做set語句,以下:

 

 

能夠成功把數據保存在當前數據庫中,若是這時切換到數據庫0當中

 

 

咱們會發覺0數據庫的name和2數據庫的name分別是表明不一樣的值

若是咱們但願清除當前的全部key那麼咱們可使用flushdb命令進行清除,以下所示:

 

 

flushdb只能清除當前數據,不在當前數據庫的key均可以被保留下來

在現實開發當中,咱們設置不一樣的數據庫對數據進行存放,可是同時帶來一個這樣的問題,若是咱們當前的數據在數據庫2當中,那麼咱們在 php中應該如何選擇數據庫2呢?

 

例子2:使用php操做指定的redis數據庫

詳細代碼參考:code/selectdb.php

 

 

測試結果以下:

 

 

例子3:使用php操做指定的redis數據庫中一個key過時

在手冊中沒有expire的方法,若是但願設置這個方法咱們須要使用setTimeOut來進行代替

 

 

測試結果以下:

 

相關文章
相關標籤/搜索