redis小結

NoSQL介紹 NoSQL是以key-value形式存儲,特色:非關係型的,分佈式的,開源的,水平可擴展的 1.處理超大量的數據 2.運行在便宜的PC服務器集羣上 3.擊碎了性能瓶頸 NoSQL適用場景 1.對數據高併發讀寫 2.對海量數據的高效率存儲和訪問 3.對數據的高可擴展性和高可用性 Redis的介紹 開源的,key-value存儲,一般被稱爲數據結構服務器  鍵能夠包含字符串strings,哈希hashes,鏈表lists,集合sets,有序集合sorted sets 這些數據類型都支持 push/pop,add/remove及取交集和並集以及更豐富的操做 Redis支持不一樣方式的排序 數據都緩存在內存中,也能夠週期性的把更新的數據寫入磁盤,或者把修改操做寫入追加的記錄文件 Redis適用場合 新浪微博redis的部署場景不少,大概分2種: 1.應用程序直接訪問Redis數據庫 2.應用程序直接訪問Redis,只有當Redis訪問失敗的時候才訪問MySQL 應用場景: 1.取最新的N個數據的操做 2.排行榜應用,取TOP N的操做 3.須要精確設定過時時間的應用 4.計數器應用 5.Uniq操做,獲取某段時間全部數據排重值 惟一操做 6.實時系統,反垃圾系統 7.pub/sub構建實時消息系統 8.構建隊列系統 9.緩存 redis             MySQL            mongodb 區別 1.庫              庫               庫 2.無表            有表             集合-相似於MySQL的表 3.無字段、行、列  有字段、行、列   無字段、行、列 redis的安裝 官網:http://redis.io/download 穩定版 2.4.17 1.下載安裝包 wget http://redis.googlecode.com/files/redis-2.4.17.tar.gz 2.編譯源程序 tar -zxvf redis-2.4.17.tar.gz cd redis-2.4.17 make cd src && make test make test 的時候若是出現 You need tcl 8.5 or newer in order to run the Redis test make: *** [test] Error 1 這樣的錯誤,則須要安裝tcl 下載tcl wget http://downloads.sourceforge.net/tcl/tcl8.6.0-src.tar.gz cd tcl8.6.0/ cd unix && ./configure --prefix=/usr \             --mandir=/usr/share/man \ --without-tzdata \             $([ $(uname -m) = x86_64 ] && echo --enable-64bit) && make && sed -e "s@^\(TCL_SRC_DIR='\).*@\1/usr/include'@" \ -e "/TCL_B/s@='\(-L\)\?.*unix@='\1/usr/lib@" \ -i tclConfig.sh make install && make install-private-headers && ln -v -sf tclsh8.6 /usr/bin/tclsh && chmod -v 755 /usr/lib/libtcl8.6.so 若是是32位機,則須要把x86_64改爲x86_32,--enable-64bit 改爲32bit make install redis沒有配置configure 直接進行編譯安裝 3.移動文件,便於管理 mkdir -p /usr/local/redis/bin mkdir -p /usr/local/redis/etc mv /lamp/redis-2.4.17/redis.conf /usr/local/redis/etc cd /lamp/redis-2.4.17/src mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin 4.啓動redis服務 /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 指定配置文件 redis服務端的默認鏈接端口是6379 5.客戶端鏈接 /usr/local/redis/bin/redis-cli 6.中止redis實例 咱們可使用/usr/local/redis/bin/redis-cli shutdown 也可使用 pkill redis-server Redis的配置 daemonize 若是須要在後臺運行,把該項改成yes pidfile 配置多個pid的地址 默認爲 /var/run/redis.pid bind 綁定ip 設置後只接受來自該ip的請求 port 監聽端口 默認爲6379 timeout 設置客戶端鏈接時的超時時間 單位爲秒 loglevel 分爲4級 debug,verbose,notice,warning logfile 配置log文件地址 database 設置數據庫的個數,默認使用的數據庫爲0 save 設置redis進行數據庫鏡像的頻率 rdbcompression 在進行鏡像備份時,是否進行壓縮 Dbfilename 鏡像備份文件的文件名 Dir 數據庫鏡像備份的文件放置路徑 Slaveof 設置數據庫爲其餘數據庫的從數據庫 Masterauth 主數據庫鏈接須要的密碼驗證 Requirepass 設置登陸時須要使用的密碼 Maxclients 限制同時鏈接的客戶數量 Maxmemory 設置redis可以使用的最大內存 Appendonly 開啓 append only 模式 Appendfsync 設置對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的數據類型 strings類型及操做 string是最簡單的類型,一個key對應一個value,string類型是二進制安全的 redis的string能夠包含任何數據,好比JPG圖片或序列化的對象 Set 設置key對應的值爲string類型的value 例如:添加一個name=lijie的鍵值對 redis 127.0.0.1:6379> set name lijie ok 獲取設置的name值 redis 127.0.0.1:6379> get name Setnx 設置key 對應的值爲string類型的value 若是key已經存在,返回0,nx是not exists的意思 Setex 設置key 對應的值爲string類型的value 並指定此鍵值對應的有效期 例如:添加一個haircolor=red的鍵值對,並指定有效期爲10秒 redis 127.0.0.1:6379> setex haircolor 10 red Setrange 設置指定key的value值的子字符串 例如:將lijie的126郵箱替換爲gmail郵箱 若是替換的字符串沒有原來的字符串長,則長於替換的字符串的字符將被保留 redis 127.0.0.1:6379> get name "lijie@126.com" redis 127.0.0.1:6379> setrange name 6 gmail.com (integer) 15 redis 127.0.0.1:6379> get name "lijie@gmail.com" mset 一次設置多個key的值,成功返回OK表示全部的值都設置了,失敗返回0表示沒有任何值被設置 redis 127.0.0.1:6379> mset key1 lijie1 key2 lijie2 ok redis 127.0.0.1:6379> get key1 "lijie1" redis 127.0.0.1:6379> get key2 "lijie2" msetnx 一次設置多個key的值,成功返回OK表示全部的值都設置了 失敗返回0表示沒有任何值被設置,可是不會覆蓋已經存在的key 若是有鍵值存在則全部值都不會被設置,返回0 get 獲取key對應的string值,若是key不存在則返回nil getset 設置key的值,並返回key的舊值 getrange 獲取key的value值的子字符串 redis 127.0.0.1:6379> getrange name 0 5 0表示起始位置 5表示結束字符位置 就是截取0-5 的字符 mget 一次獲取多個key的值,若是對應key不存在,則對應返回nil incr 對key的值作++操做,並返回新的值 incrby 同incr相似,加指定值,key不存在的時候會設置key,並認爲原來的value是0 redis 127.0.0.1:6379> incrby key4 3 key4+3 redis 127.0.0.1:6379> incrby key4 -2 key4-2 decr 對key的值作--操做 decrby 同decr相似,減指定值 append 給指定key的字符串追加value,返回新字符串值的長度 redis 127.0.0.1:6379> append name @lijie.me strlen 取指定key的value值的長度 del 刪除指定key的值 redis 127.0.0.1:6379> del name (integer) 1 hashes類型 hashes類型及操做 Redis hash 是一個string類型的field和value的映射表 它的添加,刪除操做都是0(1)(平均) hash特別適合用於存儲對象 相較於將對象的每一個字段存成單個string類型, 將一個對象存儲在hash類型中會佔用更少的內存 而且能夠更方便的存取整個對象 hashes類型 hset 設置hash field 爲指定值,若是key不存在,則先建立 redis 127.0.0.1:6379> hset myhash field1 hello hsetnx 設置hash field 爲指定值,若是key不存在,則先建立,若是存在則返回0 hmset 同時設置hash的多個field hget 獲取指定的hash field hget myhash field1 hmget 獲取所有指定的hash field hincrby 指定的hash field 加上給定的值 hexists 測試指定field是否存在 hlen 返回指定hash的field數量 hdel 刪除指定hash的field redis 127.0.0.1:6379> hdel myhash age hkeys 返回hash的全部field redis 127.0.0.1:6379> hkeys myhash hvals 返回hash的全部value hgetall 獲取某個hash中所有的field以及value redis 127.0.0.1:6379> hgetall myhash lists類型 lists類型及操做 list是一個鏈表結構,主要功能是push,pop,獲取一個範圍的全部值等等 操做中key理解爲鏈表的名字 redis的list類型起始就是一個每一個子元素都是string類型的雙向鏈表 能夠經過push,pop操做從鏈表的頭部或者尾部添加刪除元素 這樣list既能夠作棧,又能夠做爲隊列 lists類型 lrange 獲取給定key範圍的list元素 redis 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "world" lpush 在key對應list的頭部添加字符串元素 redis 127.0.0.1:6379> lpush mylist "word" (integer) 1 redis 127.0.0.1:6379> lpush mylist "hello" (integer) 2 redis 127.0.0.1:6379> lrange mylist 0 -1 // lrange 0表示從頭部取,-1表示到尾部 1) "hello" 2) "world" rpush 在key對應list的尾部添加字符串元素 redis 127.0.0.1:6379> rpush mylist2 "world" (integer) 1 redis 127.0.0.1:6379> rpush mylist2 "hello" (integer) 2 redis 127.0.0.1:6379> lrange mylist2 0 -1 1) "world" 2) "hello" linsert 在key對應list的特定位置前或後添加字符串 redis 127.0.0.1:6379> rpush mylist3 "world" (integer) 1 redis 127.0.0.1:6379> linsert mylist3 before "world" "hello" (integer) 2 redis 127.0.0.1:6379>lrange mylist3 0 -1 1) "hello" 2) "world" Lset 設置list中指定下標的元素值 redis 127.0.0.1:6379> rpush mylist4 "hello" (integer) 1 redis 127.0.0.1:6379> lset mylist4 0 "world" ok redis 127.0.0.1:6379> lrange mylist4 0 -1 1) "world" lrem 從key對應list中刪除n個和value相同的元素 n<0 從尾刪除 n=0 所有刪除 redis 127.0.0.1:6379> rpush mylist5 "hello" (integer) 1 redis 127.0.0.1:6379> rpush mylist5 "hello" (integer) 2 redis 127.0.0.1:6379> lrem mylist5 1 "hello" (integer) 1 ltrim 保留指定key的值範圍內的數據 redis 127.0.0.1:6379> rpush mylist8 "one" (integer) 1 redis 127.0.0.1:6379> rpush mylist8 "two" (integer) 2 redis 127.0.0.1:6379> ltrim mylist8 1 -1 (integer) 1 redis 127.0.0.1:6379> lrange mylist8 0 -1 1) "two" lpop 從list的頭部刪除元素,並返回刪除元素 redis 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "world" redis 127.0.0.1:6379> lpop mylist "hello" redis 127.0.0.1:6379> lrange mylist 0 -1 1) "world" rpop 從list的尾部刪除元素,並返回刪除元素 redis 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "world" redis 127.0.0.1:6379> rpop mylist "world" redis 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" rpoplpush 從第一個list的尾部移除元素並添加到第二個list的頭部 redis 127.0.0.1:6379> lrange mylist5 0 -1 1) "three" 2) "hello" redis 127.0.0.1:6379> lrange mylist6 0 -1 1) "hello" 2) "foo" redis 127.0.0.1:6379> rpoplpush mylist5 mylist6 "hello" redis 127.0.0.1:6379> lrange mylist5 0 -1 1) "three" redis 127.0.0.1:6379> lrange mylist6 0 -1 1) "hello" 2) "hello" 3) "foo" lindex 返回名稱爲key的list中index位置的元素 redis 127.0.0.1:6379> lrange mylist5 0 -1 1) "three" 2) "foo" redis 127.0.0.1:6379> lindex mylist5 0 "three" redis 127.0.0.1:6379> lindex mylist5 1 "foo" llen 返回key對應list的長度 redis 127.0.0.1:6379> llen mylist5 (integer) 2 Sets類型 sets類型及操做 set是集合,它是string類型的無序集合 set是經過hash table實現的, 添加、刪除和查找的複雜度都是0(1) 對集合咱們能夠取交集、並集、差集 經過這些操做咱們能夠實現SNS中的好友推薦和blog的tag功能 sadd 向名稱爲key的set中添加元素 redis 127.0.0.1:6379> sadd myset "hello" (integer) 1 redis 127.0.0.1:6379> sadd myset "world" (integer) 1 redis 127.0.0.1:6379> sadd myset "world" (integer) 0 redis 127.0.0.1:6379> smembers myset 1) "world" 2) "hello" smembers 獲取名稱爲key的set中全部元素 redis 127.0.0.1:6379> smembers myset 1) "hello" 1) "world" srem 刪除名稱爲key的set中的元素 redis 127.0.0.1:6379> sadd myset2 "one" (integer) 1 redis 127.0.0.1:6379> sadd myset2 "two" (integer) 1 redis 127.0.0.1:6379> srem myset2 "one" (integer) 1 spop 隨機返回並刪除名稱爲key的set中一個元素 redis 127.0.0.1:6379> sadd myset3 "one" (integer) 1 redis 127.0.0.1:6379> sadd myset3 "two" (integer) 1 redis 127.0.0.1:6379> spop myset3 "two" sdiff 返回全部給定key與第一個key的差集 redis 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" redis 127.0.0.1:6379> smembers myset3 1) "two" 2) "one" redis 127.0.0.1:6379> sdiff myset2 myset3 1) "three" sdiffstore 返回全部給定key與第一個key的差集,並將結果存爲另外一個key redis 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" redis 127.0.0.1:6379> smembers myset3 1) "two" 2) "one" redis 127.0.0.1:6379> sdiffstore myset4 myset2 myset3 (integer) 1 redis 127.0.0.1:6379> smembers myset4 1) "three" sinter 返回全部給定key的交集 redis 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" redis 127.0.0.1:6379> smembers myset3 1) "two" 2) "one" redis 127.0.0.1:6379> sinter myset2 myset3 1) "two" sinterstore 返回全部給定key的交集,並將結果存爲另外一個key redis 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" redis 127.0.0.1:6379> smembers myset3 1) "two" 2) "one" redis 127.0.0.1:6379> sinterstore myset4 myset2 myset3 (integer) 1 redis 127.0.0.1:6379> smembers myset4 1) "two" sunion 返回全部給定key的並集 redis 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" redis 127.0.0.1:6379> smembers myset3 1) "two" 2) "one" redis 127.0.0.1:6379> sunion myset2 myset3 1) "three" 2) "one" 3) "two" sunionstore 返回全部給定key的並集 redis 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" redis 127.0.0.1:6379> smembers myset3 1) "two" 2) "one" redis 127.0.0.1:6379> sunionstore myset 4 myset2 myset3 (integer) 3 redis 127.0.0.1:6379> smembers myset4 1) "three" 2) "one" 3) "two" smove 從第一個key對應的set中移除member並添加到第二個對應的set中 redis 127.0.0.1:6379> smembers myset2 1) "three" 2) "two" redis 127.0.0.1:6379> smembers myset3 1) "three" 2) "one" redis 127.0.0.1:6379> smove myset2 myset7 three (integer) 1 redis 127.0.0.1:6379> smembers myset2 1) "two" redis 127.0.0.1:6379> smembers myset7 1) "three" scard 返回名稱爲key的set的元素個數 redis 127.0.0.1:6379> scard myset2 (integer) 1 sismember 測試member是不是名稱爲key的set的元素 redis 127.0.0.1:6379> smembers myset2 1) "two" redis 127.0.0.1:6379> sismember myset2 two (integer) 1 redis 127.0.0.1:6379> sismember myset2 one (integer) 0 srandmember 隨機返回名稱爲key的set的一個元素,但不刪除元素 redis 127.0.0.1:6379> smembers myset3 1) "two" 2) "one" redis 127.0.0.1:6379> srandmember myset3 "two" redis 127.0.0.1:6379> srandmember myset3 "one" sorted sets 類型及操做 sorted set 是set的一個升級版本,它在set的基礎上增長了一個順序屬性 這一屬性在添加修改元素的時候能夠指定 每次指定後,zset會自動從新按新的值調整順序 能夠理解爲有兩列的MySQL表,一列存value,一列存順序,操做中key理解爲zset的名字 zadd 向名稱爲key的zset中添加元素member,score用於排序,若是該元素存在,則更新其順序 redis 127.0.0.1:6379> zadd myzset 1 "one" (integer) 1 redis 127.0.0.1:6379> zadd myzset 2 "two" (integer) 1 redis 127.0.0.1:6379> zadd myzset 3 "two" // 添加未成功,可是順序號更新 (integer) 0 redis 127.0.0.1:6379> zrange myzset 0 -1 withscores // withscores 輸出順序號 1) "one" 2) "1" 3) "two" 4) "3" zrem 刪除名稱爲key的zset中的元素member redis 127.0.0.1:6379> zrange myzset 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "3" redis 127.0.0.1:6379> zrem myzset two (integer) 1 redis 127.0.0.1:6379> zrange myzset 0 -1 withscores 1) "one" 2) "1" zincrby 若是再名稱爲key的zset中已經存在元素member,則該元素的score增長increment 不然向該集合中添加該元素,其score的值爲increment redis 127.0.0.1:6379> zadd myzset2 1 "one" (integer) 1 redis 127.0.0.1:6379> zadd myzset2 2 "two" (integer) 1 redis 127.0.0.1:6379> zincrby myzset2 2 "one" "3" redis 127.0.0.1:6379> zrange myzset2 0 -1 withscores 1) "two" 2) "2" 3) "one" 4) "3" zrank 返回名稱爲key的zset中member元素的排名(按score從小到大排序)即下標 redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "five" 8) "5" redis 127.0.0.1:6379> zrank myzset3 two (integer) 1 zrevrank 返回名稱爲key的zset中member元素的排名(按score從大到小排序)即下標 redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "five" 8) "5" redis 127.0.0.1:6379> zrevrank myzset3 two (integer) 2 zrevrange 返回名稱爲key的zset(按score從大到小順序)中的index從start到end的全部元素 redis 127.0.0.1:6379> zrevrange myzset3 0 -1 withscores 1) "five" 2) "5" 3) "three" 4) "3" 5) "two" 6) "2" 7) "one" 8) "1" zrangebyscore 返回集合中score在給定區間的元素 redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" redis 127.0.0.1:6379> zrangebyscore myzset3 2 3 withscores 1) "two" 2) "2" 3) "three" 4) "3" zcount 返回集合中score在給定區間的數量 redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" 7) "five" 8) "5" redis 127.0.0.1:6379> zcount myzset3 2 3 (integer) 2 zcard 返回全部元素個數 redis 127.0.0.1:6379> zcard myzset3 (integer) 4 zremrangebyrank 刪除集合中排名在給定區間的元素 redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" redis 127.0.0.1:6379> zremrangebyrank myzset3 1 1  (integer) 1 redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" zremrangebyscore 刪除集合中score在給定區間的元素 redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" redis 127.0.0.1:6379> zremrangebyscore myzset3 1 2 (integer) 2 redis 127.0.0.1:6379> zrange myzset3 0 -1 withscores 1) "three" 2) "3" redis經常使用命令 1.鍵值相關命令 keys 返回知足給定pattern的全部key 表達式* 表明取出全部的key  redis 127.0.0.1:6379> keys * 1) "myzset2" 2) "myzset3" 3) "mylist" 4) "myset2" 5) "myset3" 6) "myset4" 7) "k_zs_1" exists 確認一個key是否存在 存在返回1 不存在返回0 redis 127.0.0.1:6379> exists name (integer) 0  redis 127.0.0.1:6379> exists age (integer) 1 del 刪除一個key redis 127.0.0.1:6379> del age (integer) 1 redis 127.0.0.1:6379> exists age (integer) 0 expire 設置一個key的過時時間 在本例中,咱們設置addr這個key的過時時間是10秒 而後咱們不斷的用ttl來獲取這個key的有效時長,直至爲-1 說明此值已過時 redis 127.0.0.1:6379> expire addr 10 (integer) 1 redis 127.0.0.1:6379> ttl addr (integer) 8 redis 127.0.0.1:6379> ttl addr (integer) 1 redis 127.0.0.1:6379> ttl addr (integer) -1 move 將當前數據庫中的key轉移到其它數據庫中 數據庫有16個,從0-15 select 0 表示選擇第0個數據庫,默認的就是第0個數據庫 redis 127.0.0.1:6379> select 0 redis 127.0.0.1:6379> set age 20 redis 127.0.0.1:6379> get age 1) "20" redis 127.0.0.1:6379> move age 1 redis 127.0.0.1:6379> get age (nil) redis 127.0.0.1:6379> select 1 redis 127.0.0.1:6379> get age 1) "20" redis 127.0.0.1:6379> select 0 persist 移除給定key的過時時間 結果中的-1表明取消過時時間,而不是已通過期 redis 127.0.0.1:6379> expire age 300 (integer) 1 redis 127.0.0.1:6379> ttl age (integer) 294 redis 127.0.0.1:6379> persist age (integer) 1 redis 127.0.0.1:6379> ttl age (integer) -1 randomkey 隨機返回key空間的一個key redis 127.0.0.1:6379> randomkey "mylist7" redis 127.0.0.1:6379> randomkey "mylist5" rename 重命名key redis 127.0.0.1:6379> keys * 1) "age" redis 127.0.0.1:6379> rename age age_new OK redis 127.0.0.1:6379> keys * 1) "age_new" type 返回值的類型 redis 127.0.0.1:6379> type addr string redis 127.0.0.1:6379> type myzset2 zset redis 127.0.0.1:6379> type mylist list 2.服務器相關命令 ping 測試鏈接是否存活 該案例 第一個ping時,說明此鏈接正常 第二個ping以前,將redis服務器中止,那麼ping是失敗的 第三個ping以前,將redis服務器啓動,那麼ping是成功的 redis 127.0.0.1:6379> ping PONG redis 127.0.0.1:6379> ping Could not connect to Redis at 127.0.0.1:6379:Connect refused not connected>ping PONG redis 127.0.0.1:6379>  echo 在命令行打印一些內容 redis 127.0.0.1:6379> echo lijie "lijie" select 選擇數據庫 redis數據庫編號從0-15 咱們能夠選擇任意一個數據庫來進行數據的存取 redis 127.0.0.1:6379> select 1 ok redis 127.0.0.1:6379[1]> select 16 (error) ERR invalid DB index redis 127.0.0.1:6379[16]> 當選擇16時,報錯,說明沒有編號爲16的這個數據庫 quit 退出鏈接 redis 127.0.0.1:6379> quit [root@localhost redis-2.2.12]# dbsize 返回當前數據庫中key的數目 redis 127.0.0.1:6379> dbsize (integer) 18 結果說明此庫中有18個key info 獲取服務器的信息和統計 config get 實時傳儲收到的請求 redis 127.0.0.1:6379> config get addr 1) "dir" 2) "/root/4setup/redis-2.2.12" 本例中咱們獲取了dir這個參數配置的值 若是想獲取所有參數的配置值,只須要執行 config get *,便可將所有的值都顯示出來 flushdb 刪除當前選擇數據庫中的全部key redis 127.0.0.1:6379> dbsize (integer) 18 redis 127.0.0.1:6379> flushdb ok redis 127.0.0.1:6379> dbsize (integer) 0 在本例中咱們將0號數據庫中的key都清除了 flushall 刪除全部數據庫中的全部key 在本例中先查看了一個1號數據庫中有一個key 而後切換到0號數據庫執行flushall命令 結果1號庫中的key也清除了 redis 127.0.0.1:6379[1]> dbsize (integer) 1 redis 127.0.0.1:6379[1]> select 0 ok redis 127.0.0.1:6379> flushall ok redis 127.0.0.1:6379> dbsize (integer) 0 redis 127.0.0.1:6379> select 1 ok redis 127.0.0.1:6379[1]> dbsize (integer) 0 Redis 高級實用特性 1.安全性 設置客戶端鏈接後進行任何其餘指定前須要使用的密碼 警告:由於redis速度至關快,因此在一臺比較好的服務器下,一個外部的用戶能夠在一秒鐘進行150K次的密碼嘗試 這意味着你須要指定很是很是強大的密碼來防止暴力破解 修改密碼: 在redis-conf配置文件中修改 # requirepass foobared requirepass beijing 修改密碼後須要重啓redis 關閉redis pkill redis-server 啓動一個客戶端 [root@localhost redis-2.2.12]# src/redis-cli redis 127.0.0.1:6379> keys * (error) ERR operation not permitted 這裏顯示權限被禁止,咱們來設置一下權限 redis 127.0.0.1:6379> auth beijing ok redis 127.0.0.1:6379> keys * 1) "name" 若是不想每次執行命令的時候都輸入受權信息 在登錄的時候就指定受權信息 [root@localhost redis-2.2.12]# src/redis-cli -a beijing redis 127.0.0.1:6379> keys * 1) "name" 2.主從複製 Redis 主從複製配置和使用都很是簡單 經過主從複製能夠容許多個slave server 擁有和 master server 相同的數據庫副本 Redis主從複製特色: 1)master能夠擁有多個slave 2)多個slave能夠鏈接同一個master外,還能夠鏈接到其餘slave 3)主從複製不會阻塞master,在同步數據時,master能夠繼續處理client請求 4)提升系統的伸縮性 redis主從複製過程: 1)slave與master創建鏈接,發送sync同步命令 2)master會啓動一個後臺進程,將數據庫快照保存到文件中,同時master主進程會開始收集新的寫命令並緩存 3)後臺完成保存後,就將此文件發送給slave 4)slave將此文件保存到硬盤上 配置主從服務器: 配置slave服務器很簡單,只須要在slave的配置文件中加入以下配置: slaveof 192.168.1.1 6379 # 指定master的ip和端口 masterauth lamp # 這是主機的密碼 如何判斷哪一個是master哪一個是slave 只須要調用info就能夠獲得主從的信息 在從庫執行info redis 127.0.0.1:6379> info role:slave master_host:localhost master_port:6379 master_link_status:up master_last_io_seconds_ago:10 master_sync_in_progress:0 db0:keys=1,expires=0 主服務器上執行info role:master 3.事務處理 redis對事務的支持目前還比較簡單,redis只能保證一個client發起的事務中的命令能夠連續的執行 而中間不會插入其餘client的命令 當一個client在一個鏈接中發出multi命令時,這個鏈接會進入一個事務上下文 該鏈接後續的命令不會當即執行 而是先放到一個隊列中,當執行exec命令時,redis會順序的執行隊列中的全部命令 簡單事務處理 redis 127.0.0.1:6379> get age "33" redis 127.0.0.1:6379> multi ok redis 127.0.0.1:6379> set age 10 QUEUED redis 127.0.0.1:6379> set age 20 QUEUED redis 127.0.0.1:6379> exec 1) ok 2) ok redis 127.0.0.1:6379> get age "20" 如何取消一個事務 該案例能夠發現此次2個 set age 命令都沒有被執行 discard命令其實就是清空事務的命令隊列並退出事務上下文 也就是咱們常說的事務回滾 redis 127.0.0.1:6379> get age "20" redis 127.0.0.1:6379> multi ok redis 127.0.0.1:6379> set age 33 QUEUED redis 127.0.0.1:6379> set age 10 QUEUED redis 127.0.0.1:6379> discard ok redis 127.0.0.1:6379> get age  "20" redis的事務,若是事務中某個命令出現錯誤不會回滾 樂觀鎖復瑣事務控制 樂觀鎖:大多數是基於數據版本(version)的記錄機制實現的 即爲數據增長一個版本標識,在基於數據庫表的版本解決方案中, 通常是經過爲數據庫表增長一個version字段來實現讀取出數據時, 將此版本號一同讀出,以後更新時,對此版本號加1 此時,將提交數據的版本號與數據庫表對應記錄的當前版本號進行比對 若是提交的數據版本號大於數據庫當前版本號,則予以更新,不然認爲是過時數據 redis樂觀鎖實例: 假設有一個age的key,咱們開2個session來對age進行賦值操做,咱們來看一下結果如何 (1) 第1步 session1 redis 127.0.0.1:6379> get age "10" redis 127.0.0.1:6379> watch age # 表明對age進行監控 ok redis 127.0.0.1:6379> multi ok (2) 第2步 session2 redis 127.0.0.1:6379> set age 30 ok redis 127.0.0.1:6379> get age "30" (3) 第3步 session1 redis 127.0.0.1:6379> set age 20 QUEUED redis 127.0.0.1:6379> exec (nil) redis 127.0.0.1:6379> get age  "30" watch命令會監視給定的key,當exec時候,若是監視的key從調用watch後發生過變化 則整個事務會失敗 也能夠調用watch屢次監視多個key,這樣就能夠對指定的key加樂觀鎖了 注意:watch的key 是對整個鏈接有效的,事務也同樣 若是鏈接斷開,監視和事務都會被自動清除 固然了exec,discard,unwatch命令都會清除鏈接中的全部監視 事務回滾 redis的事務實現是如此簡單,固然會存在一些問題 第一個問題是redis只能保證事務的每一個命令連續執行 可是若是事務中的一個命令失敗了,並不回滾其餘命令 好比使用的命令類型不匹配 4.持久化機制 redis是一個支持持久化的內存數據庫,也就是說redis須要常常將內存中的數據同步到硬盤來保證持久化 redis支持2種持久化方式: 1)snapshotting(快照)也是默認方式 2)Append-only file (縮寫aof)的方式 Snapshotting方式 快照是默認的持久化方式 這種方式是將內存中數據以快照的方式寫入到二進制文件中 默認的文件名爲dump.rdb 能夠經過配置設置自動作快照持久化的方式 咱們能夠配置redis在n秒內若是超過m個key被修改就自動作快照 save 900 1 # 900秒內若是超過1個key被修改,則發起快照保存 save 300 10 # 300秒內若是超過10個key被修改,則發起快照保存 save 60 10000 aof方式 因爲快照方式是在必定間隔時間作一次的,因此若是redis意外down掉的話,就會丟失最後一次快照後的全部修改 aof比快照方式有更好的持久化性, 是因爲在使用aof時,redis會將每個收到的寫命令都經過write函數追加到文件中 當redis重啓時會經過從新執行文件中保存的寫命令來在內存中重建整個數據庫的內容 固然,因爲os會在內核中緩存write作的修改, 因此可能不是當即寫到磁盤上,這樣aof方式的持久化也仍是有可能會丟失部分修改 能夠經過配置文件告訴redis咱們想要經過fsync函數強制os寫入到磁盤的時機 appendonly yes // 啓用aof持久化方式 # appendfsync always // 收到寫命令就當即寫入磁盤,最慢,可是保證徹底的持久化 appendfsync everysec // 每秒鐘寫入磁盤一次,在性能和持久化方面作了很好的折中 # appendfsync no // 徹底依賴os,性能最好,持久化沒保證 5.發佈訂閱消息 發佈訂閱(pub/sub)是一種消息通訊模式,主要的目的是解除消息發佈者和消息訂閱者之間的耦合 redis做爲一個pub/sub的server,在訂閱者和發佈者之間起到了消息路由的功能 訂閱者能夠經過subscribe和psubscribe命令向redis server 訂閱本身感興趣的消息類型 redis將消息類型稱爲通道(channel) 當發佈者經過publish命令向redis server發送特定類型的信息時 訂閱該信息類型的所有client都會收到此消息 6.虛擬內存的使用 redis的虛擬內存與操做系統的虛擬內存不是一回事 可是思路和目的都是相同的 就是暫時把不常常訪問的數據從內存交換到磁盤中,從而騰出寶貴的內存空間用於其餘須要訪問的數據 尤爲是對於redis這樣的內存數據庫,內存老是不夠用的 除了能夠將數據分割到多個redis server外 另外可以提升數據庫容量的辦法就是使用虛擬內存把那些不常常訪問的數據交換到磁盤上 虛擬內存配置 下面是vm相關配置 vm-enabled yes # 開啓vm功能 really-use-vm yes vm-swap-file /tmp/redis.swap # 交換出來的value保存的文件路徑 vm-max-memory 1000000 # redis使用的最大內存上線 vm-page-size 32 # 每一個頁面的大小32字節 vm-pages 134217728 # 最多使用多少頁面 vm-max-threads 4 # 用於執行value對象換入緩存的工做線程數量 php支持redis 首先下載phpredis源碼包 解壓縮 tar zxvf phpredis.tar.gz 進入phpredis文件夾 給phpredis準備一個編譯環境 /usr/local/php/bin/phpize 若是出現錯誤: 編譯安裝 ./configure --with-php-config=/usr/local/php/bin/php-config make /usr/local/php/include/php/Zend/../TSRM/TSRM.h:165:26: error: redefinition of pa                                                                                        rameter ‘tsrm_ls’ 遇到這個錯誤 沒解決,好惆悵 :-( make install cd /usr/local/php//lib/php/extensions/no-debug-zts-20121212/ 找到 redis.so 打開php.ini 加上 extension=redis.so 保存退出,重啓
相關文章
相關標籤/搜索