Redis基礎php
Redis是一個開源的,先進的key-value存儲。它一般被稱爲數據結構服務器,由於鍵能夠包含字符串,哈希,鏈表,集合和有序集合。程序員
Redis 簡介redis
Redis 是徹底開源免費的,遵照BSD協議,是一個高性能的key-value數據庫。mongodb
Redis 與其餘 key - value 緩存產品有如下三個特色:數據庫
Redis支持數據的持久化,能夠將內存中的數據保存在磁盤中,重啓的時候能夠再次加載進行使用。apache
Redis不只僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。windows
Redis支持數據的備份,即master-slave模式的數據備份。(主--從)緩存
Redis 優點安全
性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。服務器
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操做
原子 – Redis的全部操做都是原子性的,同時Redis還支持對幾個操做全並後的原子性執行。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過時等等特性。
Redis與其餘key-value存儲有什麼不一樣?
Redis有着更爲複雜的數據結構而且提供對他們的原子性操做,這是一個不一樣於其餘數據庫的進化路徑。
Redis的數據類型都是基於基本數據結構的同時對程序員透明,無需進行額外的抽象。
Redis運行在內存中可是能夠持久化到磁盤,因此在對不一樣數據集進行高速讀寫時須要權衡內存,
由於數據量不能大於硬件內存。在內存數據庫方面的另外一個優勢是,相比在磁盤上相同的複雜的數據結構,在內存中操做起來很是簡單,這樣Redis能夠作不少內部複雜性很強的事情。同時,在磁盤格式方面他們是緊湊的以追加的方式產生的,由於他們並不須要進行隨機訪問。
Redis 安裝
Window 下安裝
一.安裝redis服務
Redis 支持 32 位和 64 位。這個須要根據你係統平臺的實際狀況選擇,
這裏咱們下載 32位 Redis-Windows-32bit.zip壓縮包到 C 盤,解壓後,將文件夾從新命名爲redis。
打開一個 cmd 窗口 使用cd命令切換目錄到 C:\redis 運行 redis-server.exe redis.windows.conf 。
後面的那個 redis.windows.conf 能夠省略,若是省略,會啓用默認的。
這時候另再開啓一個cmd窗口,原來的不要關閉,否則就沒法訪問服務端了。
切換到redis目錄下運行 redis-cli.exe -h 127.0.0.1 -p 6379 。
按照上面的運行是能夠的,可是這樣就會形成兩個命令行窗口都要開啓,特別是服務器端,一旦關閉了那麼客戶端就沒法使用了,那麼這樣能夠把redis服務安裝到windows服務裏面
Redis是能夠安裝成windows服務的,開機自啓動,命令以下:
redis-server --service-install redis.windows.conf
Redis並無啓動,啓動命令以下:
redis-server --service-start
中止命令:
redis-server --service-stop
卸載命令:
redis-server --service-uninstall
二.安裝php redis擴展
1.phpinfo檢測是否開啓
2.php擴展目錄 extension_dir
php_redis.dll放置到php擴展目錄下
3.php配置文件修改
extension=php_redis.dll
4.重啓服務apache服務
Ubuntu 下安裝
在 Ubuntu 系統安裝 Redi 可使用如下命令:
$sudo apt-get update
$sudo apt-get install redis-server
啓動 Redis
$ redis-server
查看 redis 是否啓動?
$ redis-cli
以上命令將打開如下終端:
redis 127.0.0.1:6379>
127.0.0.1 是本機 IP ,6379 是 redis 服務端口。如今咱們輸入 PING 命令。
redis 127.0.0.1:6379> ping
PONG
以上說明咱們已經成功安裝了redis。
Redis 數據類型
Redis支持五種數據類型:
string(字符串)
list(列表)
set(集合)
zset(有序集合)
hash(哈希)
String(字符串)
string是redis最基本的類型,你能夠理解成與Memcached如出一轍的類型,一個key對應一個value。
string類型是二進制安全的。意思是redis的string能夠包含任何數據。好比jpg圖片或者序列化的對象 。
string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
實例
redis 127.0.0.1:6379> SET name "runoob"
OK
redis 127.0.0.1:6379> GET name
"runoob"
在以上實例中咱們使用了 Redis 的 SET 和 GET 命令。鍵爲 name,對應的值爲 runoob。
注意:一個鍵最大能存儲512MB。
--------------------------------------------
set 命令:設置一個鍵和值,鍵存在則只覆蓋,返回ok
> set 鍵 值
例如: >set name zhangsan
get 命令:獲取一個鍵的值,返回值
> get 鍵 例如:>get name
setnx命令:設置一個不存在的鍵和值(防止覆蓋),
> setnx 鍵 值 若鍵已存在則返回0表示失敗
setex命令:設置一個指定有效期的鍵和值(單位秒)
> setex 鍵 [有效時間] 值
例如: >setex color 10 red
不寫有效時間則表示永久有效,等價於set
setrange命令:替換子字符串 (替換長度由子子串長度決定)
> setrange 鍵 位置 子字串
> setrange name 4 aa 將name鍵對應值的第4個位置開始替換
mset命令:批量設置鍵和值,成功則返回ok
> mset 鍵1 值1 鍵2 值2 鍵3 值3 ....
msetnx命令:批量設置不存在的鍵和值,成功則返回ok
> msetnx 鍵1 值1 鍵2 值2 鍵3 值3 ....
getset命令:獲取原值,並設置新值
getrange命令:獲取指定範圍的值
>getrange 鍵 0 4 //獲取指定0到4位置上的值
mget命令: 批量獲取值
>mget 鍵1 鍵2 鍵3....
incr命令: 指定鍵的值作加加操做,返回加後的結果。
> 鍵 例如: >incr kid
incrby命令: 設置某個鍵加上指定值
> incrby 鍵 m //其中m能夠是正整數或負整數
decr命令: 指定鍵的值作減減操做,返回減後的結果。
> decr 鍵 例如: >decr kid
decrby命令: 設置某個鍵減上指定值
> decrby 鍵 m //其中m能夠是正整數或負整數
append命令:給指定key的字符串追加value,返回新字符串值的長度
>append 鍵 追加字串
strlen求長度
>strlen 鍵名 //返回對應的值。
List(列表)
Redis 列表是簡單的字符串列表,按照插入順序排序。
你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
實例
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>
列表最多可存儲 232 - 1 元素 (4294967295, 每一個列表可存儲40多億)。
--------------------------------------------
list便可以做爲「棧」也能夠做爲"隊列"。
操做:
>lpush list1 "world" //在list1頭部壓入一個字串
>lpush list1 "hello" // 在list1頭部壓入一個字串
>lrange list1 0 -1 //獲取list1中內容
0:表示開頭 -1表示結尾。
>rpush list2 "world" //在list2尾部壓入一個字串
>rpush list2 "hello" // 在list2尾部壓入一個字串
>lrange list2 0 -1 //獲取list2中內容
0:表示開頭 -1表示結尾。
>linsert list2 before hello there
在key對應list的特定位置前或後添加字符串
>lset list2 1 "four"
修改指定索引位置上的值
>lrem list2 2 "hello" //刪除前兩個hello值
>lrem list2 -2 "hello" //刪除後兩個hello值
>lrem list2 0 "hello" //刪除全部hello值
>ltrim mylist8 1 3 //刪除此範圍外的值
>lpop list2 //從list2的頭部刪除元素,並返回刪除元素
>rpop list2 //從list2的尾部刪除元素,並返回刪除元素
>rpoplpush list1 list2 //將list1的尾部一個元素移出到list2頭部。並返回
>lindex list2 1 //返回list2中索引位置上的元素
>llen list2 //返回list2上長度
Set(無序集合)
Redis的Set是string類型的無序集合。
集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。
sadd 命令
添加一個string元素到,key對應的set集合中,
成功返回1,若是元素已經在集合中返回0,key對應的set不存在返回錯誤。
sadd key member
實例
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "rabitmq"
2) "mongodb"
3) "redis"
注意:以上實例中 rabitmq 添加了兩次,但根據集合內元素的惟一性,第二次插入的元素將被忽略。
集合中最大的成員數爲 232 - 1(4294967295, 每一個集合可存儲40多億個成員)。
-------------------------------
>sadd myset "hello" //向myset中添加一個元素
成功返回1,失敗(重複)返回0
>smembers myset //獲取myset中的全部元素(結果是無序的)
>srem myset "one" //從myset中刪除一個one
成功返回1,失敗(不存在)返回0
>spop myset //隨機返回並刪除myset中的一個元素
>srandmember myset //隨機獲取myset中的一個元素,可是不刪除
> smove myset1 myset2 zhangsan:將myset1中zhangsan移動到myset2中
> scard myset1 返回myset1的個數
> sismember myset zhangsan:判斷張三是否在myset中
>sdiff myset1 myset2 //返回兩個集合的差集
以myset1爲標準,獲取myset2中不存在的。
>sdiffstore dstset myset1 myset2 ...// 返回全部集合的差集,並保存到dstset中
>sinter myset1 myset2 myset3... // 返回N個集合中的交集
>sinterstore dstset myset1 myset2 ... // 返回N個集合的交集並存儲到dstset中
> sunion myset1 myset2 ...//返回全部集合的並集
> sunionstore dstset myset1 myset2// 返回全部集合的並集,並存儲到dstset中
zset(sorted set:有序集合)
Redis zset 和 set 同樣也是string類型元素的集合,且不容許重複的成員。
不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。
zset的成員是惟一的,但分數(score)卻能夠重複。
zadd 命令
添加元素到集合,元素在集合中存在則更新對應score
zadd key score member
實例
redis 127.0.0.1:6379> zadd runoob 0 redis
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 mongodb
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 1
redis 127.0.0.1:6379> zadd runoob 0 rabitmq
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE runoob 0 1000
1) "redis"
2) "mongodb"
3) "rabitmq"
----------------------------------------
> zadd zset 1 one 向zset中添加one,排序爲1排序
> zrem zset one:刪除zset中one
> zincrby zset 2 one:若是one存在,則順序增長2,若是one不存在,那麼就是2
> zrank zset one:返回one在 zset中排名(從小到大的排序)
> zrevrank zset one:返回one在zset中排名(從大到小的排序)
> zrange zset 0 -1 withscores:根據score排序(根據score從小到大排序)
> zrevrange zset 0 -1 withscores:根據score排序(根據score從大到小排序)
> zrangebyscore zset 2 3 withscores:返回集合中score在給定區間的元素(包含2和5)
> zcount zset 2 3:返回集合中給定區間的數量
> zcard zset:返回集合中元素的個數
> zscore zset one:返回one元素的score
> zremrangebyrank zset 3 3:刪除集合中排名在給定區間的元素
> zremrangebyscore zset 1 2:將zset中從小到大排序結果的score在1-2之間的刪除
Hash(哈希)
Redis hash 是一個鍵值對集合。
Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。
實例
127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200
OK
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "runoob"
3) "password"
4) "runoob"
5) "points"
6) "200"
以上實例中 hash 數據類型存儲了包含用戶腳本信息的用戶對象。
實例中咱們使用了 Redis HMSET, HGETALL 命令,user:1 爲鍵值。
每一個 hash 能夠存儲 232 -1 鍵值對(40多億)。
------------------------------------------
hset命令:設置一個哈希表的鍵和值
>hset hash名 鍵 值
如:>hset user:001 name zhangsan
hget命令: 獲取執行哈希名中的鍵對應值
hsetnx命令:設置一個哈希表中不存在的鍵和值
>hsetnx hash名 鍵 值 //成功返回1,失敗返回0
如:>hsetnx user:001 name zhangsan
hmset命令:hmset user:001 username zhangsan age 20 sex 1 批量設置
hmget user:001 username age sex:批量獲取值
>hexists user:001 name //是否存在, 若存在返回1
>hlen user:001 //獲取某哈希user001名中鍵的數量
>hdel user:001 name //刪除哈希user:001 中name鍵
>hkeys user:002 //返回哈希名爲user:002中的全部鍵。
>hvals user:002 //返回哈希名爲user:002中的全部值。
>hgetall user:002 //返回哈希名爲user:002中的全部鍵和值。
Redis高級實用特性
1. 安全性:爲Redis添加密碼
警告:由於redis 速度至關快,因此在一臺比較好的服務器下,
一個外部的用戶能夠在一秒鐘進行150K 次的密碼嘗試,
這意味着你須要指定很是很是強大的密碼來防止暴力破解。
1.進入配置文件:
vi /usr/local/redis/etc/redis.conf
設置:requirepass redis的密碼
2. 重啓服務:
# ./redis-cli shutdown 執行關閉
# ./redis-server /usr/local/redis/etc/redis.conf 啓動
3. 登陸(兩種)
# ./redis-cli 客戶端命令連接服務器
>auth 密碼值 //受權後方可以使用
# ./redis-cli -a 密碼 //鏈接時指定密碼來進行受權