Redis-用思惟導圖二天搞定Redis用法。

Redis總體面貌

Redis基本數據結構

1、String 1.1 數據結構 long len byte數組長度 long free 可用數組長度 char buff[] 數據內容 1.2 命令 鍵值:設置值經過字符串名 set:設置鍵值 setnx(set not exist):設置鍵值|若鍵不存在則能夠存,不然返回0. setex(set expire):設置鍵值(含過時時間),set key seconeds value setrange:設置指定位置key的鍵值 例如setrange name diaodiao 2 haha-->dihahaao 從第二個位置開始替換 mset:設置多個鍵值 msetnx:設置多個不存在的鍵值 get:經過鍵得到值 getset:先經過鍵得到值,再設置值。 getrange(0~-1):獲取指定範圍的字符。範圍|從左往右數從0開始  從右往左數-1開始。例如hello(0~4|-5~-1) mget:得到多個鍵的值。 數字類型相關操做 set age 10(如下操做都是針對10操做) incr 遞增1 incr age-->11 incrby 遞增指定數字-->incr age 5->16 decr 遞減1 decrby 遞減指定值 字符屬性操做 set name "hello" append:在尾部追加字符串 append name "Diaodiao"->helloDiaodiao strlen: 得到字符串長度 strlen name ->5

2、hashes(存儲鍵值對,相似於hashmap) 2.1 配置(redis.conf配置文件中) 默認:hash-max-zipmap-entries 配置字段最多64個(key的個數) hash-max-zipmap-value 配置value最大爲512字節 2.2 命令(參考String) hset key field value hset:若key不存在就建立,不然覆蓋。 hsetnx:設置 hash field 爲指定值,若是 key 不存在,則先建立。若是 field 已經存在,返回 0,nx 是not exist 的意思。 hmset:同時設置hash多個field hget:獲取指定的hash field hmget:獲取所有指定的hash field hexists:測試指定field是否存在 hlen:返回指定的field的個數 hdel:刪除指定field。 hkeys:查詢指定key的全部field hvals:獲取指定key的全部value hgetall:得到指定key的全部field以及值 3、lists 3.1 簡介 list是基於雙向鏈表的數據結構,操做就是入棧(push)、出棧(pop),包括左(頭)入出棧、右(尾)入出棧,也含有超時阻塞的功能。 3.2 命令 lpush:在key對應的list的頭部添加元素。 lrange:得到list範圍的值。 lrange mylist start(0) stop(2)(獲取0 1 2索引的值) rpush:在key對應的list的尾部添加元素 linsert:在key對應的特定位置以前或者以後添加字符串元素 linsert mylist before 「world」 「hello」 lset:設置list指定下表的元素(從0開始) lrem:從key對應的list裏,刪除count個value相同的元素。 ltrim:保留指定key的值範圍內的數據。 lpop:從list的頭部刪除元素,而且返回刪除元素 rpop:從list的尾部刪除元素,而且返回刪除元素 rpoplpush:第一個list的尾部移除元素而且添加到第二個list的頭部 lindex:返回名稱爲key的list中index位置的元素 llen:返回key對應list的長度 4、sets 4.1 簡介 sets是無序集合,是經過hashtable實現的。額外功能有並集、交集、差集。 4.2 命令 sadd:向名稱爲key的set當中添加元素 srem:刪除名稱爲key的元素 spop:隨機返回而且刪除set中某key元素 sdiff:兩個set的差集 sdiffstore:假設有set三、set一、set2-->set1與set2差集返回的元素,添加到set3中 sinter:兩個set的交集 sinterstore:假設有set三、set一、set2-->set1與set2交集返回的元素,添加到set3中 sunion:兩個set的並集 sunionstore:假設有set三、set一、set2-->set1與set2交集返回的元素,添加到set3中 smove:假設有set一、set2-->刪除set1的某個key值,而且添加到set2 scard:返回set的元素個數 sismember:測試set中是否存在某member(元素)。 srandmember:隨機返回一個元素,可是不刪除 5、sorted set 5.1 簡介 sorted set(skip list|雙向鏈表和hashtable的結合體)是set的一個升級版本,升級版本的sets,有兩個緯度,一個緯度用來存順序,一個緯度用於存value。 5.2 命令 zadd:向名稱爲key的zset中添加元素member、score用於排序。若是該元素存在,則根據score更新該元素的順序 zrem:刪除名爲key的zset的元素member zincrby:若是在名稱爲 key 的 zset 中已經存在元素 member,則該元素的 score 增長 increment;不然向集合中添加該元素,其 score 的值爲 increment zrank:返回名稱爲 key 的 zset 中 member 元素的排名(按 score 從小到大排序)即下標 zrevrank:返回名稱爲 key 的 zset 中 member 元素的排名(按 score 從大到小排序)即下標 zrange:返回名稱爲 key 的 zset(按 score 從小到大排序)中的 index 從 start 到 end 的全部元素 zrevrange:返回名稱爲 key 的 zset(按 score 從大到小排序)中的 index 從 start 到 end 的全部元素 zrangebyscore:返回集合中 score 在給定區間的元素 zcount:返回集合中 score 在給定區間的數量 zcard:返回集合中元素個數 zscore:返回給定元素對應的 score zremrangebyrank:刪除集合中排名在給定區間的元素 zremrangebytscore:刪除集合中 score 在給定區間的元素

Redis經常使用命令

  1、鍵值相關命令 keys *|key*|key??? exists key:確認一個 key 是否存在 del key:刪除一個 key expire key seconeds:設置一個 key 的過時時間(單位:秒) move:將當前數據庫中的 key 轉移到其它數據庫中。 persist:移除給定 key 的過時時間 ttl:查看過時還須要多長時間 randomkey:隨機返回命名空間的一個key renamekey:重命名key type:返回值類型 2、元務器相關命令 ping:測試鏈接是否存活 echo:在命令行打印一些內容 select:選擇數據庫。Redis 數據庫編號從 0~15,咱們能夠選擇任意一個數據庫來進行數據的存取。 quit:退出鏈接。 dbsize:返回當前數據庫中 key 的數目。 info:獲取服務器的信息和統計。 monitor:實時轉儲收到的請求。 config:獲取服務器配置信息。 flushdb:刪除當前選擇數據庫中的全部 key。 flushall:刪除全部數據庫中的全部 key。

Redis高級使用屬性

一、安全性:設置每次命令以前都要確認密碼|在redis.conf配置文件中修改 requirepass 二、主從複製 2.1 特色 (1)master能夠擁有多個slave (2)多個slave能夠鏈接同一個master外,還能夠鏈接其餘slave (3)主從複製不會阻塞master,同步數據,master能夠繼續處理client。 (4)提升系統的伸縮性 2.2、搭建過程 參考:http://www.cnblogs.com/qiuyong/p/6705689.html
3、事務控制 3.1 簡單事務控制 multi-->事務begin exec-->退出提交 3.2 事務回滾 muliti-->事務begin discard-->事務回滾 四、持久化 4.1 snapshotting(默認)-快照方式 將數據以快照的方式寫入到二進制文件中,也是dump.rpb。執行save、bgsave的時候會對dump.rpb 保存方式 save:手動存儲、阻塞當前線程,把內存數據存到dump.rpb中。 bgsave:開啓子線程、調用fork操做,後臺將內存數據存到dump.rpb中。 redis.conf中默認設置爲自動bgsave。 缺陷: 假設有client一、client2. client1執行flushall、把內存數據所有清除。 client2執行的時候,由於以前數據在未知狀況下被清除,這樣就會形成很大的麻煩。 一般狀況下,咱們先把save以前,把相應dump.rpb轉移到其餘目錄下進行保存,利於數據恢復。 4.2 aof(append-only file)-->若是應用要求不能丟失任何修改的話,能夠採用 aof 持久化方式 機制:默認每隔一秒,redis會收到寫命令,把內容追加到appendonnly.aof文件中。 配置redis.conf appendonly yes //啓用 aof 持久化方式
            # appendfsync always //收到寫命令就當即寫入磁盤,最慢,可是保證徹底的持久化
            appendfsync everysec //每秒鐘寫入磁盤一次,在性能和持久化方面作了很好的折中
            # appendfsync no //徹底依賴 os,性能最好,持久化沒保證
5、發佈及訂閱消息 5.1 訂閱者 subscribe 通道(頻道)例如tv1/tv2/tv3  psubscribe tv*例如tv開頭的消息都能收到 5.2 發送者 publish tv1 message 5.3 退出訂閱模式:unsubscribe、unpsubscribe 6、Pipeline 批量發送請求 1、普通方式 基於tcp的鏈接方式,每次都要等着回覆才能執行 2、Pipeline方式 多個命令執行完之後,而後把執行結構返回給客戶端。 7、虛擬內存相關配置 vm-enabled yes #開啓 vm 功能 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 對象換入換出的工做線程數量

Redis 持久化磁盤 IO 方式及其帶來的問題

  有 Redis 線上運維經驗的人會發現 Redis 在物理內存使用比較多,但尚未超過實際物理內存總容量時就會發生不穩定甚至崩潰的問題,有人認爲是基於快照方式持久化的 fork 系統調用形成內存佔用加倍而致使的,這種觀點是不許確的,由於 fork 調用的 copy-on-write 機制是基於操做系統頁這個單位的,也就是隻有有寫入的髒頁會被複制,可是通常你的系統不會在短期內全部的頁都發生了寫入而致使複製,那麼是什麼緣由致使 Redis 崩潰的呢?
 
  答案是 Redis 的持久化使用了 Buffer IO 形成的,所謂 Buffer IO 是指 Redis 對持久化文件的寫入和讀取操做都會使用物理內存的 Page Cache,而大多數數據庫系統會使用 Direct IO 來繞過這層 Page Cache 並自行維護一個數據的 Cache,而當 Redis 的持久化文件過大(尤爲是快照文件),並對其進行讀寫時,磁盤文件中的數據都會被加載到物理內 存中做爲操做系統對該文件的一層 Cache,而這層 Cache 的數據與 Redis 內存中管理的數據實際是重複存儲的,雖然內核在物理內存緊張時會作 Page Cache 的剔除工做,但內核極可能認爲某塊 Page Cache 更重要,而讓你的進程開始 Swap,這時你的系統就會開始出現不穩定或者崩潰了。咱們的經驗是當你的 Redis 物理內存使用超過內存總容量的3/5時就會開始比較危險了。
  
  總結:
  1. 根據業務須要選擇合適的數據類型,併爲不一樣的應用場景設置相應的緊湊存儲參數。
  2. 當業務場景不須要數據持久化時,關閉全部的持久化方式能夠得到最佳的性能以及最大的內存使用量。
  3. 若是須要使用持久化,根據是否能夠容忍重啓丟失部分數據在快照方式與語句追加方式之間選擇其一,不要使用虛擬內存以及 diskstore 方式。
  4. 不要讓你的 Redis 所在機器物理內存使用超過實際內存總量的3/5。
相關文章
相關標籤/搜索