Redis基礎

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  密碼 //鏈接時指定密碼來進行受權

相關文章
相關標籤/搜索