Redis數據庫管理

NoSQL是一項全新的數據庫革命性運動,它是指運用非關係型數據庫的存儲。Nosql解決了大規模數據集合多重數據類帶來的挑戰,尤其是大數據應用難題。


Nosql數據庫的四大分類


1,鍵值

   tokyo

   Cabinet/tyrant

   Redis

   Voldemort

   Oracle BDB


應用場景:內容緩存,主要用於處理大量數據的高訪問負載,也用於一些日誌系統等等。


數據模型:key指向value的鍵值對,通長用hash、table來實現的 


優點:查找速度快


2,列存儲數據庫

Cassadnra

HBase,Riak


應用場景:分佈式文件系統


數據模型:以列簇式存儲,將同一列的數據存儲在一起。


優點:查找速度塊,擴展性強,更容易進行飯呢不是擴展


3,文檔型數據庫  

CouchDB

MongoDb


應用場景:web應用


數據模型:key-Value對應的鍵值對,Value爲結構化的數據


優點:數據結構要求不嚴格,表結構可變,不需要像關係型數據庫一樣需要預定義表結構。


4,圖形數據庫:

Neo4j

InfoGrid

Infinite Graph


應用場景:社交網絡,推薦系統等,專屬於構建關係圖譜。


數據模型:圖結構


優點:利用圖結構相關算法。比如最短路徑尋址,N度關係查找等。



NoSQL特點




Nosql是key-value形式存儲,和傳統的關係型數據庫不一樣,不一定遵循傳統 數據庫的一些基本要求,比如說遵循sql標準,acid屬性,表結構等等。這類數據庫主要有以下特點:非關係型的,分佈式,開源,水平可擴展。

    1,處理超大的數據量。

    2,運行在便宜的pc服務器的集羣上。

    3,擊碎了性能瓶頸。

      對數據的高併發讀寫

      對海量數據的高效存儲和訪問

      對數據的高擴展性和高可用性


Redis

   Redis是一個開源的,先進的key-value存儲,它通常被稱爲數據結構服務器,因爲鍵可以包含string,hash,list,set和zset(sorted-set--有序集合)。這些數據類型都支持push/pop,add/remove及取交集並集和差集及更豐富的操作,他的操作比mysql數據庫更加簡化。

   Redis和Memcahed類似,它支持存儲的value類型相對更多,與memecached一樣,爲了保證效率,數據都是緩存在內存中,區別是Redis會週期性的把更新的數據寫入了磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave主從同步

   Redis現在很多軟件上都用redis作爲mysql的緩存數據庫,在適當的時候與mysql同步。


Redis適用場景

   在應用程序直接訪問Redis數據庫。

   在應用程序直接訪問redis,只用當redis訪問失敗時才訪問mysql數據庫

   

    yum -y install gcc*

    tar -zxvf redis-2.8.6.tar.gz

    cd redis-2.8.6  

    make  

    make PREFIX=/usr/local/redis install

    mkdir /usr/local/redis/etc

    cp ./redis.conf /usr/local/redis/etc/

Redis的啓動方式:/usr/local/redis/bin/redis-server

          #不加配置文件會提示警告

修改配置文件:

      vim /usr/local/redis/etc/redis.conf

      daemnize on 改爲

      daemonize yes #後臺啓動 端口:6379


客戶端連接:

     /usr/lcoal/redis/bin/redis-cli

 -h IP:          連接指定的redis服務器

 -p 6379:        指定redis服務器的端口

 -a 密碼          使用密碼登陸

 -n 數據庫號       指定連接那個數據庫

 --raw:         redis支持中文存儲


redis關閉

    /usr/local/redis/bin/redis-cli shutdown 或者 pkill -9 redis


Redis配置文件

      daemonize 如果需要後臺運行,改成yes

      pidfile 配置多個pid的地址,默認在/var/run/redis.pid

      bind 綁定ip,設置後只接受來自該ip的請求

      port 監聽端口,默認爲6379

      timeout 設置客戶端連接時的超時時間,單位爲秒

      loglevel 分爲4級,debug、verbose、notice、warning

      logfile 配置log文件地址

      databases 設置數據庫的個數,默認使用的數據庫爲0,最大爲16個

      save 設置Redis進行數據庫鏡像的頻率(快照)     

      rdbcompression 在進行鏡像備份時,是否進行壓縮

      dbfilename 鏡像備份文件的文件名

      dir 數據庫鏡像備份的文件放置位置

      slaveof 設置數據庫爲其他數據庫的從數據庫

      masterauth 主數據庫連接需要的密碼驗證

      requirepass 設置登錄時需要使用密碼

      maxclients 限制同時連接的客戶數量

      maxmemory 設置redis能夠使用的最大內存

      appendonly 開啓append only模式

      ppendfsync 設置對appendonly.aof文件同步的頻率

      vm-enabled 是否開啓虛擬內存支持

      vm-swap-file 設置虛擬內存的交換文件路徑

      vm-max-memory 設置redis使用的最大物理內存數

      vm-page-size 設置虛擬內存的頁大小

      vm-pages 設置交換文件的總的page數量

      vm-max-threads 設置VMIO同時使用的線程數量

      glueoutputbuf 把小的輸出緩存存放在一起

      hash-max-zipmap-entries 設置hash的臨界值

      activerehashing 重新hash


redis的五種數據類型:

     strig,hash,list,set及zset(sorted set)


基礎命令操作

      添加一個name=lingyu的鍵值對應

> set name lingyu


> get name

"lingyu"


  setnx設置key對應的值爲string類型的value,如果已存在返回的值是0,nx是not extist的意思


> set name linux


> setnx name lingyu

(integer) 0


> get name

"linux"


 setex設置指定鍵值對應的有效期


>setex age 2 age


>get age

"18"


>get age

(nil)


ttl 以秒爲單位,返回給定key的剩餘生存時間

127.0.0.1:6379> setex mv 22 huayu

OK

127.0.0.1:6379> ttl mv

(integer) 19

127.0.0.1:6379> ttl mb

(integer) -2

127.0.0.1:6379> ttl mv

(integer) 12

127.0.0.1:6379> ttl mv

(integer) 9

127.0.0.1:6379> ttl mv

(integer) 6

127.0.0.1:6379> ttl mv

(integer) 2

127.0.0.1:6379> ttl mv

(integer) -2

127.0.0.1:6379> 

當 key 不存在時,返回 -2 。

當 key 存在但沒有設置剩餘生存時間時,返回 -1 。

否則,以秒爲單位,返回 key 的剩餘生存時間。


setrange

     講[email protected]的郵箱替換成huayu郵箱

127.0.0.1:6379> set name [email protected]

OK

127.0.0.1:6379> get name

"[email protected]"

127.0.0.1:6379> setrange name 9 huayu.com

(integer) 18

127.0.0.1:6379> get name

"wag_linuxhuayu.com"

127.0.0.1:6379> 


mest 

   一次設置多個key的值,成功返回ok表示所有的值都已經設置,失敗返回0表示沒有任何值唄設置。

127.0.0.1:6379> mset key1 lamp1 key2 lamp2

OK

127.0.0.1:6379> get key

(nil)

127.0.0.1:6379> get key1

"lamp1"

127.0.0.1:6379> get key2

"lamp2"

127.0.0.1:6379> 


msetnx

   一次設置多個key的值,成功返回ok表示所有的值都已經設置,失敗返回0表示沒有人很值唄設置,但是不會覆蓋已存在的key的值


127.0.0.1:6379> msetnx key3 lingyu key4 boy key5 19

(integer) 1

127.0.0.1:6379> get key3

"lingyu"

127.0.0.1:6379> get key4

"boy"

127.0.0.1:6379> get key5

"19"

127.0.0.1:6379> msetnx key6 lingyu key7 boy key5 19

(integer) 0

127.0.0.1:6379> get key6

(nil)


get 獲取key對應的string值,如果key不存在返回nil


getset設置key的值,並返回key的舊值

127.0.0.1:6379> get name 

"wag_linuxhuayu.com"

127.0.0.1:6379> getset name [email protected]

"wag_linuxhuayu.com"

127.0.0.1:6379> get name

"[email protected]"


getrange

   獲取key的值value值得子字符串

127.0.0.1:6379> get name

"[email protected]"

127.0.0.1:6379> getrange name 0 7

"lingyu@p"

127.0.0.1:6379> getrange name 0 5

"lingyu"

  

mget 一次獲取多個key的值,如果對應key不存在則對應返回nil

127.0.0.1:6379> mget key1 key2 key3 key4 key5 key6 key7

1) "lamp1"

2) "lamp2"

3) "lingyu"

4) "boy"

5) "19"

6) (nil)

7) (nil)


incr對key的值做加加(遞增)操作,並返回新的值

127.0.0.1:6379> get key5

"19"

127.0.0.1:6379> incr key5

(integer) 20


incrby

   同類似incr類型,加指定值,key不存在時會設置key,並認爲原來的是value0

127.0.0.1:6379> incrby key5 6

(integer) 26

127.0.0.1:6379> get key6

(nil)

127.0.0.1:6379> incrby key6 6

(integer) 6


decr對key的值做加加(遞減的操作),並返回新的值

127.0.0.1:6379> decr key5

(integer) 25

127.0.0.1:6379> decr key5

(integer) 24


decrby同decr類似,加指定值,key不存在時會設置在key,並認爲原來的是value是0

127.0.0.1:6379> decr key5

(integer) 23

127.0.0.1:6379> decrby key5 3

(integer) 20



append給指定的key的字符串追加value,返回新字符串的長度

127.0.0.1:6379> get key3

"lingyu"

127.0.0.1:6379> append key3 @163.com

(integer) 14

127.0.0.1:6379> get key3

"[email protected]"


strlen取指定key的value值得長度

127.0.0.1:6379> get key3

"[email protected]"

127.0.0.1:6379> strlen key3

(integer) 14


del刪除一個已創建的key

127.0.0.1:6379> del key5

(integer) 1

127.0.0.1:6379> get key5

(nil)


Redis數據庫的類型hash

   hash是一個string類型的field和value的映射表,它的添加,刪除操作都是0(1)平均;hash特別適合用於存儲對象,相較於將對象的每個字段存成單個string類型,將一個對象存儲在hash類型中會佔用更少的內存,並且可以更方便存儲整個對象


hset設置hash filed爲指定值,如果key不存在,則先創建

127.0.0.1:6379> hset num1 name lingyu

(integer) 1

127.0.0.1:6379> hget num1 name

"lingyu


hestnx設置hash filed爲指定值,如果key不存在,則先創建,如果存在則返回0

127.0.0.1:6379> hsetnx num name handsome

(integer) 1

127.0.0.1:6379> hsetnx num name hashsome

(integer) 0


hmset同時設置hash的多個field

127.0.0.1:6379> hmset num2 name wag age 18

OK

127.0.0.1:6379> hget num2 name

"wag"

127.0.0.1:6379> hget num2 age

"18"


hget獲取hash表裏面的某一個字段


hmget獲取hash表裏面的多個字段


hincrby指定的hash field加上給定值

127.0.0.1:6379> hget num2 age

"18"

127.0.0.1:6379> hincrby num2 age 5

(integer) 23


hexists測試指定的field是否存在

127.0.0.1:6379> hexists num2 age

(integer) 1

127.0.0.1:6379> hexists num2 sex

(integer) 0


hlen返回指定hash的field數量

127.0.0.1:6379> hlen num2

(integer) 2


hedl刪除指定hash的field

127.0.0.1:6379> hget num2 age

"23"

127.0.0.1:6379> hdel num2 age

(integer) 1

127.0.0.1:6379> hget num2 age

(nil)


hkeys返回hash的所有的field

127.0.0.1:6379> hmset num3 name hansome age 22 sex nv

OK

127.0.0.1:6379> hkeys num3

1) "name"

2) "age"

3) "sex"


hvals返回hash所有的value

127.0.0.1:6379> hvals num3

1) "hansome"

2) "22"

3) "nv"


hgetall同時返回指定hash表中的全部field和value

127.0.0.1:6379> hgetall num3

1) "name"

2) "hansome"

3) "age"

4) "22"

5) "sex"

6) "nv"


Redis數據庫的類型--list


  list是一個鏈表結構,主要功能是push、pop、獲取一個範圍 內的所有的值等等,操作中key理解爲鏈表的名字,redis的list類型的其實就是一個每個子元素都是string類型的雙向鏈表,我們可以通過push、pop操作從鏈表的頭部或尾部添加刪除元素,這樣list既可以最爲棧,又可以作爲隊列。


lpush在key對應得list的頭部添加字符串元素。

127.0.0.1:6379> lpush list1 "world"

(integer) 1

127.0.0.1:6379> lpush list1 "hello"

(integer) 2

127.0.0.1:6379> lrange list1 0 -1

1) "hello"

2) "world"


0代表從頭部開始第一個元素

-1代表從尾部的第一個元素

0 -1代表list鏈表中所有的數據


rpush在key對應list的尾部添加字符串的元素。

127.0.0.1:6379> lrange list2 0 -1

1) "world"

2) "hello


linsert在key對應的list的特定位置前或後添加字符串

127.0.0.1:6379> rpush list3 world

(integer) 1

127.0.0.1:6379> linsert list3 before world hello

(integer) 2

127.0.0.1:6379> lrange list3 0 -1

1) "hello"

2) "world"


和before對應的有after


lset設置list中指定下標的元素值

127.0.0.1:6379> rpush list4 one

(integer) 1

127.0.0.1:6379> rpush list4 two

(integer) 2

127.0.0.1:6379> rpush list4 three

(integer) 3

127.0.0.1:6379> lrange list4 0 -1

1) "one"

2) "two"

3) "three"

127.0.0.1:6379> lset list4 0 wan

OK

127.0.0.1:6379> lrange list4 0 -1

1) "wan"

2) "two"

3) "three"


lrem從key對應list中刪除n個”指定值“的元素

127.0.0.1:6379> rpush list5 hello

(integer) 1

127.0.0.1:6379> rpush list5 hello

(integer) 2

127.0.0.1:6379> 

127.0.0.1:6379> rpush list5 hello

(integer) 3

127.0.0.1:6379> lrem list5 1 hello

(integer) 1

127.0.0.1:6379> lrange list 5 0 -1

(error) ERR wrong number of arguments for 'lrange' command

127.0.0.1:6379> lrange list5 0 -1

1) "hello"

2) "hello"

127.0.0.1:6379> lrem list5 0 hello

(integer) 2

127.0.0.1:6379> lrange list5 0 -1

(empty list or set)

n 代表刪除“指定值”元素的數量

n > 0 

從隊列頭向尾刪除n個“指定值”元素

n < 0 

從隊列尾向頭刪除n個“指定值”元素

n = 0

刪除所有值爲“指定值”的元素


lpop從list的頭部刪除元素,並返回刪除元素

lrange list 0 -1

lamp

hello

world

lpop list1

lamp

lrange list1 0 -1

hello

world


rpop從list的尾部刪除元素,並返回刪除元素。


rpoplpush從第一個list的尾部移除的元素添加到第二個list的頭部

127.0.0.1:6379> lrange list2 0 -1

1) "world"

2) "hello"

127.0.0.1:6379> lrange list3 0 -1

1) "hello"

2) "world"

127.0.0.1:6379> rpoplpush list2 list3

"hello"

127.0.0.1:6379> lrange list3 0 -1

1) "hello"

2) "hello"

3) "world"


lindex獲取隊列中的指定下標元素的值

127.0.0.1:6379> lrange list4 0 -1

1) "wan"

2) "two"

3) "three"

127.0.0.1:6379> lindex list4 1

"two"

127.0.0.1:6379> lindex list4 2

"three"


llen獲取隊列的長度(元素個數)


Redis的數據類型--set


set類型及操作

  set是集合,它是string類型的無序集合。Set是通過hash table實現的,對集合我們可以取並集、交集、差集。通過這些操作我們可以實現社交網站中的好友推薦和blog的tag功能。集合不允許有重複值。


sadd添加一個或多個元素到集合中

127.0.0.1:6379> sadd mest1 1

(integer) 1

127.0.0.1:6379> sadd mset1 2 3 4

(integer) 3


smembers獲取集合裏面所有的元素

127.0.0.1:6379> sadd mset1 2 3 4

(integer) 3

127.0.0.1:6379> smembers mset1

1) "2"

2) "3"

3) "4"

集合裏面不能有重複的元素


srem從集合中刪除指定的一個或多個元素

127.0.0.1:6379> srem mset1 2 4

(integer) 2

127.0.0.1:6379> smembers mset1

1) "3"

127.0.0.1:6379> srem mset1 2

(integer) 0

刪除鍵,依然使用’del’命令


spop隨機從集合中刪除一個元素,並返回

127.0.0.1:6379> sadd mset2 1 2 3 4 5 5

(integer) 5

127.0.0.1:6379> spop mset2

"4"

127.0.0.1:6379> spop mset2

"1"

127.0.0.1:6379> smembers mset2

1) "2"

2) "3"

3) "5"

本身set集合就是無秩序的集合所以刪除時隨機的


srandmember隨機返回集合中一個元素,但不能刪除

127.0.0.1:6379> srandmember mset3

"4"

127.0.0.1:6379> srandmember mset3

"3"

127.0.0.1:6379> srandmember mset3

"3"

127.0.0.1:6379> smembers mset3

1) "1"

2) "2"

3) "3"

4) "4"

5) "5"

6) "6"


scard獲取集合裏面的元素個數

127.0.0.1:6379> scard mset3

(integer) 6


sismember確定一個指定的值是否是集合中的元素

127.0.0.1:6379> scard mset3

(integer) 6

127.0.0.1:6379> smembers mset1

1) "3"

127.0.0.1:6379> sismember mset1 3

(integer) 1

127.0.0.1:6379> sismember mset1 2

(integer) 0


sdiff返回集合1與集合2的差集,以集合1爲主

127.0.0.1:6379> sadd mset4 1 2 3 

(integer) 3

127.0.0.1:6379> sadd mset5 2 3 4

(integer) 3

127.0.0.1:6379> sdiff mset4 mset5

1) "1"

127.0.0.1:6379> sdiff mset5 mset4

1) "4"

前邊的集合作爲標準,後面的和它進行對比


sdiffstore返回集合1和集合2的差集,並把結果存入新集合

127.0.0.1:6379> sdiff mset5 mset4

1) "4"

127.0.0.1:6379> sdiffstore mset6 mset5 mset4

(integer) 1

127.0.0.1:6379> smembers mset6

1) "4"


sinter獲得兩個集合的交集

127.0.0.1:6379> smembers mset4

1) "1"

2) "2"

3) "3"

127.0.0.1:6379> smembers mset5

1) "2"

2) "3"

3) "4"

127.0.0.1:6379> sinter mset4 mset5

1) "2"

2) "3"


sinterstore獲得集合1和集合2的交集

127.0.0.1:6379> sinterstore mset7 mset4 mset5

(integer) 2

127.0.0.1:6379> smembers mset7

1) "2"

2) "3"


sunion獲得指定集合的並集

sunionstore獲得指定集合的並集,並把結果保存如新集合

127.0.0.1:6379> sunion mset4 mset5 

1) "1"

2) "2"

3) "3"

4) "4"

127.0.0.1:6379> sunionstore mset8 mset4 mset5

(integer) 4

127.0.0.1:6379> smembers mset8

1) "1"

2) "2"

3) "3"

4) "4"


somve將指定的值從源集合移動到目標集合

127.0.0.1:6379> sadd mset9 1 2

(integer) 2

127.0.0.1:6379> sadd mset10 3 4

(integer) 2

127.0.0.1:6379> somve mset9 mset10 2 

(error) ERR unknown command 'somve'

127.0.0.1:6379> smove mset9 mset10 2

(integer) 1

127.0.0.1:6379> smembers mset9

1) "1"

127.0.0.1:6379> smembers mset10

1) "2"

2) "3"

3) "4"



Redis數據類型

      

zset類型及操作

zset是set的一個升級版本,它在set的基礎上增加了一個順序屬性,這一屬性在添加修改元素的時候可以指定,每次指定後,zset會自動重新按新的值調整順序。可以理解爲有兩列的mysql表,一列存的value,一列存的順序。操作中key理解爲zset的名字。


zadd向一個指定的有序集合中添加元素,每一個元素會對應的有一個分數。你可以指定多個分數/成員組合。如果一個指定的成員已經在對應的有序集合中了,那麼其分數就會被更新成最新的,並且該成員會重新調整到正確的位置,以確保集合有序。分數的值必須是一個表示數字的字符串。

127.0.0.1:6379> zadd zset1 1 handsome 2 lingyu

(integer) 2

127.0.0.1:6379> zadd zset1 1 ingyu

(integer) 1

127.0.0.1:6379> zrange zset1 0 -1

1) "handsome"

2) "ingyu"

3) "lingyu"


zrange 返回有序集合中指定區間內的成員。其中成員按照score(分數)值從小到大排序。具有相同score值的成員按照字典順序來排列。

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "handsome"

2) "1"

3) "ingyu"

4) "1"

5) "lingyu"

6) "2"


zrangebyscore返回有序集合中score(分數)在指定區間的值

127.0.0.1:6379> zadd zset2 1 one 2 two 3 three 4 four

(integer) 4

127.0.0.1:6379> zrange zset2 0 -1 withscores

1) "one"

2) "1"

3) "two"

4) "2"

5) "three"

6) "3"

7) "four"

8) "4"

127.0.0.1:6379> zrangebyscore zset2 2 3 withscores

1) "two"

2) "2"

3) "three"

4) "3"


zrem刪除出有序集合中指定的值

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "handsome"

2) "1"

3) "ingyu"

4) "1"

5) "lingyu"

6) "2"

127.0.0.1:6379> zrem zset ingyu

(integer) 0

127.0.0.1:6379> zrem zset1 ingyu

(integer) 1

127.0.0.1:6379> zrangee zset1 0 -1 withscores

(error) ERR unknown command 'zrangee'

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "handsome"

2) "1"

3) "lingyu"

4) "2"


zincrby給有序集合中指定值的成員的分數(score)值加上增量(increment)。如果集合中沒有這個值,則給添加一個分數是increment的值。

127.0.0.1:6379> zincrby zset1 2 lingyu

"4"

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "handsome"

2) "1"

3) "lingyu"

4) "4"

127.0.0.1:6379> zincrby zset1 5 lingyu

"9"

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "handsome"

2) "1"

3) "lingyu"

4) "9"


zrank返回有序集合中指定的下標。值按照score從小到大的排序 

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "handsome"

2) "1"

3) "lingyu"

4) "9"

127.0.0.1:6379> zrank zset1 lingyu

(integer) 1


zrevrank返回有序集合中指定值的下標,值按照score從大到小排序。

127.0.0.1:6379> zrank zset1 lingyu

(integer) 1

127.0.0.1:6379> zrevrank zset1 liingyu

(nil)

127.0.0.1:6379> zrevrank zset1 lingyu

(integer) 0

zrank 從小到達

zrevrank是從大到小


zcount返回有序集合中,score值在起始分數與截止分數之間的個數

27.0.0.1:6379> zrange zset1 0 -1 withscores

1) "handsome"

2) "1"

3) "lingyu"

4) "9"

127.0.0.1:6379> zadd zset1 1 sc

(integer) 1

127.0.0.1:6379> zrange zset1 0 -1 withsores

(error) ERR syntax error

127.0.0.1:6379> zrange zset1 0 -1 withscres

(error) ERR syntax error

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "handsome"

2) "1"

3) "sc"

4) "1"

5) "lingyu"

6) "9"

127.0.0.1:6379> zcount zset1 1 4

(integer) 2


zcard返回有序集合元素的個數

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "handsome"

2) "1"

3) "sc"

4) "1"

5) "lingyu"

6) "9"

127.0.0.1:6379> zcard zset1

(integer) 3


zremrangebyrangk刪除有序集合中,下標在指定區間的元素

127.0.0.1:6379> zremrangebyrank zset1 0 1

(integer) 2

127.0.0.1:6379> zrange  zset1 0 -1 withscores

1) "lingyu"

2) "9"


zremrangebysocre刪除有序集合中,分數在指定區間的元素。

127.0.0.1:6379> zrange zset1 0 -1 withscores

1) "lingyu"

2) "9"

127.0.0.1:6379> zremrangebysocre zset1 3 4 

(error) ERR unknown command 'zremrangebysocre'

127.0.0.1:6379> zremrangebtscore zset1 3 4

(error) ERR unknown command 'zremrangebtscore'

127.0.0.1:6379> zremrangebyscore zset1 3 4

(integer) 0

127.0.0.1:6379> 

127.0.0.1:6379> zrange zset1  0 -1 withscores

1) "lingyu"

2) "9"


zinterstore取集合1和集合2的交集,並把結果保存到新集合中。在計算交集之前,需要指定計算交集的集合的個數。交集中,值的分數是多個集合中分數的和。

127.0.0.1:6379> zadd zset3 1 one 2 two 3 three 4 four

(integer) 4

127.0.0.1:6379> zadd zset4 2 two 3 three 4 four 5 five

(integer) 4

127.0.0.1:6379> zinterstore zset5 zset3 zset4

(error) ERR value is not an integer or out of range

127.0.0.1:6379> zinterstore zset5 2 zset3 zset4

(integer) 3

127.0.0.1:6379> zrange zset5 0 -1 withscores

1) "two"

2) "4"

3) "three"

4) "6"

5) "four"

6) "8"


      Redis常用命令

Redis提供了豐富的命令對數據和各種數據庫類型進行操作,這些命令可以在linux終端使用。

1,鍵值相關命令

2,服務器相關命令


keys按照鍵名查找指定 的鍵,支持通配符。

127.0.0.1:6379> set hello 1

OK

127.0.0.1:6379> set hallo 1

OK

127.0.0.1:6379> set heeello 1

OK

127.0.0.1:6379> keys h?llo

1) "hallo"

2) "hello"

127.0.0.1:6379> keys h/llo

(empty list or set)

127.0.0.1:6379> keys h*llo

1) "hallo"

2) "heeello"

3) "hello"


exits去頂一個鍵是否存在 1表示鍵存在 0表示不存在

127.0.0.1:6379> exists name

(integer) 1

127.0.0.1:6379> exists age

(integer) 0


del刪除一個鍵

127.0.0.1:6379> del hello

(integer) 1

127.0.0.1:6379> exists hello

(integer) 0


expire設置一個鍵的過期時間,如果鍵已經過期,將會被自動刪除。

127.0.0.1:6379> set age 18

OK

127.0.0.1:6379> expire age 20

(integer) 1

127.0.0.1:6379> ttl age

(integer) 15

127.0.0.1:6379> ttl age

(integer) 13

127.0.0.1:6379> ttl age

(integer) 12

127.0.0.1:6379> exists age

(integer) 1


ttl以秒爲單位,返回給定key的剩餘生存時間

當key不存在時,返回-2

當key存在但沒有設置剩餘時間時,返回-1

否則,以秒爲單位,返回key的剩存生存時間。

127.0.0.1:6379> setex mv 20 handsome

OK

127.0.0.1:6379> ttl mv

(integer) 17

127.0.0.1:6379> ttl mv

(integer) 16

127.0.0.1:6379> ttl

(error) ERR wrong number of arguments for 'ttl' command

127.0.0.1:6379> ttl mv

(integer) 13

127.0.0.1:6379> ttl name

(integer) -1


select選擇一個數據庫默認連接的數據庫是0,可以支持共16個數據庫。在配置文件中,通過databases16關鍵字定義。

127.0.0.1:6379> select 1

OK

127.0.0.1:6379[1]> 


move將當前數據庫的鍵移動到指定的數據空中

127.0.0.1:6379> set age 18

OK

127.0.0.1:6379> get age

"18"

127.0.0.1:6379> move age 1

(integer) 1

127.0.0.1:6379> get age

(nil)

127.0.0.1:6379> select 1

OK

127.0.0.1:6379[1]> get age

"18"


randomkey從當前數據庫返回一個隨機的鍵,如果當前數據庫沒有任何鍵,則返回nil

127.0.0.1:6379[1]> move age 0

(integer) 1

127.0.0.1:6379[1]> randomkey

(nil)

127.0.0.1:6379[1]> select 0

OK

127.0.0.1:6379> randomkey

"key3"

127.0.0.1:6379> randomkey

"key3"


rename對鍵值進行重命名

127.0.0.1:6379> get name

"[email protected]"

127.0.0.1:6379> rename name  name_new

OK

127.0.0.1:6379> get name

(nil)

127.0.0.1:6379> get name_new

"[email protected]"

127.0.0.1:6379> get name

"[email protected]"

127.0.0.1:6379> rename name  name_new

OK

127.0.0.1:6379> get name

(nil)

127.0.0.1:6379> get name_new

"[email protected]"


type返回鍵的類型

127.0.0.1:6379> type age 

string

127.0.0.1:6379> type zset1

zset

127.0.0.1:6379> type mset5

set

127.0.0.1:6379> type list1

list


ping測試服務器是否可以鏈接

127.0.0.1:6379> ping

PONG


echo在命令行輸出字符串

127.0.0.1:6379> echo "wo  ai ni"

"wo  ai ni"



quie退出redis數據庫(exit或者ctrl+d都行)

save保存所有的數據。很少在生產環境直接使用SAVE 命令,因爲它會阻塞所有的客戶端的請求,可以使用BGSAVE 命令代替. 如果在BGSAVE命令的保存數據的子進程發生錯誤的時,用 SAVE命令保存最新的數據是最後的手段。

dbsize返回當前庫中鍵的數量

127.0.0.1:6379> dbsize

(integer) 33


info獲取服務器的詳細信息

config get獲取redis服務器配置文件中的參數。支持通配符

過了900秒並且有1個key發生了改變 就會觸發save動作

過了300秒並且有10個key發生了改變 就會觸發save動作

過了60秒並且至少有10000個key發生了改變 也會觸發save動作

127.0.0.1:6379> config get *

  1) "dbfilename"

  2) "dump.rdb"

  3) "requirepass"

  4) ""

  5) "masterauth"

  6) ""

  7) "unixsocket"


flushdb刪除當前數據庫中所有的數據

dbsize

flushdb

dbsize



    Redis高級應用

安全性

主從複製

持久化

事務處理

發佈及訂閱消息


安全性

設置客戶端連接後進行任何其他指定前需要使用密碼。

警告:因爲redis速度非常快—嗖,所以在一臺比較好的服務器下,一個外部的用戶可以在一秒內進行150K次的密碼嘗試,這意味着你要指定非常強大的密碼來防止暴力破解。

密碼三原則:複雜性、易記性、時效性



主從複製

Redis主從複製特點:

master可以擁有多個slave

多個slave可以連接同一個master外,還可以連接到其它slave

主從複製不會阻塞master,在同步數據時,master可以繼續處理client請求

提高系統的伸縮性


Redis主從複製過程:

Slave與master建立連接,發送sync同步命令

Master會啓動一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存。

後臺完成保存後,就將此文件發送給slave

Slave將此文件保存到硬盤上


vi /etc/sysconfig/network-scripts/ifcfg-eht0

rm  -rf  /etc/udev/rules.d/70-persistent-net.rule刪除網卡和MAC地址綁定文件

注意關閉防火牆和SELinux

重啓動系統


在slave服務器上修改配置文件

vim /usr/local/redis/etc/redis.conf

196: slaveof 192.168.66.11 6379

204: masterauth aaaaaa #沒設密碼可以不寫

重啓slave服務器的redis服務


在master的redis創建新的鍵,在slave端查看是否成功。


通過info命令可以查看服務器是主還是從role:master就是主role:slave就是從。


這裏我們以本機配置 1臺Master + 1臺Slave 爲例子,其中:

Master IP:127.0.0.1  PORT:6379

Slave1 IP:127.0.0.1  PORT:63791

複製出一臺從服務器進行相應修改,來實現主從。


複製從服務器

cp -r /usr/local/redis/ /usr/local/redis-slave

修改從服務器配置文件

vi  /usr/local/redis-slave/etc/redis.conf

pidfile /usr/local/redis-slave/redis.pid    #指定pid文件

          port 63791                         #指定端口號

          dir /usr/local/redis-slave/              #指定數據庫文件存放位置

          slaveof 127.0.0.1 6379                  #指定主服務器IP和端口

          masterauth flzx_3QC                   #指定主服務器密碼

     啓動slave服務  

                                 查看兩個redis端口是否都啓動了

 


Redis是一個支持持久化的內存數據庫,也就是說需要經常將內存中的數據同步到硬盤來保證持久化。

snapshotting(快照)--默認方式

           append-only file(縮寫aof)

         

            snapshotting(快照)

RDB持久化方式能夠在指定的時間間隔能對你的數據進行快照存儲。是默認的持久化方式。這種方式是將內存中數據以快照的方式寫入到二進制文件中,默認的文件名爲dump.rdb。這種持久化方式被稱爲快照 snapshotting(快照)。


#   過了900秒並且有1個key發生了改變 就會觸發save動作

#   過了300秒並且有10個key發生了改變 就會觸發save動作

#   過了60秒並且至少有10000個key發生了改變 也會觸發save動作


驗證dump.rdb數據保存文件

cd /usr/local/redis

./bin.redis-server ./etc/redis.conf



pkill -9 redis

/usr/local/redis/bin/redis-server \

usr/local/redis/etc/redis.conf

/usr/local/redis/bin/redis-cli


由於沒有添加key所以不需要手動保存

key*

save

quit

結論:在redis.conf文件中dir ./定義了數據庫文件的存放位置,默認是當前目錄。所以每次重啓redis服務所在的位置不同,將會生成新的dump.rdb文件。


持久化使用AOF 會讓你的Redis更加耐久: 你可以使用不同的持久化策略:每次寫的時候備份、每秒備份、無備份。使用默認的每秒備份策略,Redis的性能依然很好(備份是由後臺線程進行處理的,主線程會盡力處理客戶端請求),一旦出現故障,你最多丟失1秒的數據。



append-only file(aof)

打開redis.conf配置文件開啓AOF持久化

appendonly no

#默認不使用AOF持久化(450行)將no改成yes。

# appendfsync always

#有寫操作,就馬上寫入磁盤。效率最慢,但是最安全

appendfsync everysec

#默認,每秒鐘寫入磁盤一次。

# appendfsync no

#不進行AOF備份,將數據交給操作系統處理。最快,最不安全

重啓redis服務,登錄client添加一個鍵值,退出然後ls命令查看下是否生成appendonly.aof。可以用cat查看。


事務處理:Redis對事務的支持還是比較簡單的。Redis只能保證一個client發起的事務中的命令可以連續的執行,而中間不會插入其它的client命令。

當一個client在連接中發出multi命令時,這個鏈接會進入一個事務處理模式,該鏈接後續的命令不會立即執行,而是先儲存在一個隊列中,當執行對應結束命令時,redis纔會對隊列當中存儲的命令進行依次順序執行或取消執行。



結束事務處理輸入,並且順序執行隊列當中命令

get age

multi

set age 50

set age 60

exec

get age

discard結束事務處理輸入,並且清空隊列當中的命令。所有已輸入命令全都不執行。(類似事務回滾)


get age 

multi

set age 30

set age 18

discard

get age


發佈訂閱(pub/sub)是一種消息通訊模式,主要的目的是解除消息發佈者和消息訂閱者之間的耦合,Redis作爲一個pub/sub的server,在訂閱者和發佈者之間起到了消息路由的功能。訂閱者可以通過subscribe和psubscribe命令向redis server訂閱自己感興趣的消息類型,redis將信息類型稱爲通道。

當發佈者通過publish命令向redis server 發送特定類型的信息時,訂閱該信息類型的全部client都會收到此消息。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章