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 </span>10<span style="color: #000000;">(以下操作都是針對10操作)
incr 遞增1 incr age</span>-->11<span style="color: #000000;">
incrby 遞增指定數字</span>-->incr age 5->16<span style="color: #000000;">
decr 遞減1
decrby 遞減指定值
字符屬性操作
set name </span>"hello"<span style="color: #000000;">
append:在尾部追加字符串 append name </span>"Diaodiao"-><span style="color: #000000;">helloDiaodiao
strlen: 獲得字符串長度 strlen name </span>->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:假設有set3、set1、set2-->set1與set2差集返回的元素,添加到set3中
sinter:兩個set的交集
sinterstore:假設有set3、set1、set2-->set1與set2交集返回的元素,添加到set3中
sunion:兩個set的並集
sunionstore:假設有set3、set1、set2-->set1與set2交集返回的元素,添加到set3中
smove:假設有set1、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:返回值類型 </span>2<span style="color: #000000;">、元務器相關命令
ping:測試連接是否存活
echo:在命令行打印一些內容
select:選擇數據庫。Redis 數據庫編號從 </span>0~15<span style="color: #000000;">,我們可以選擇任意一個數據庫來進行數據的存取。
quit:退出連接。
dbsize:返回當前數據庫中 key 的數目。
info:獲取服務器的信息和統計。
monitor:實時轉儲收到的請求。
config:獲取服務器配置信息。
flushdb:刪除當前選擇數據庫中的所有 key。
flushall:刪除所有數據庫中的所有 key。</span></span></pre>
Redis高級使用屬性
1、安全性:設置每次命令之前都要確認密碼|在redis.conf配置文件中修改 requirepass 2、主從復制 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、持久化 4.1 snapshotting(默認)-快照方式 將數據以快照的方式寫入到二進制文件中,也是dump.rpb。執行save、bgsave的時候會對dump.rpb 保存方式 save:手動存儲、阻塞當前線程,把內存數據存到dump.rpb中。 bgsave:開啟子線程、調用fork操作,后台將內存數據存到dump.rpb中。 redis.conf中默認設置為自動bgsave。 缺陷: 假設有client1、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 方式及其帶來的問題
1. 根據業務需要選擇合適的數據類型,並為不同的應用場景設置相應的緊湊存儲參數。
2. 當業務場景不需要數據持久化時,關閉所有的持久化方式可以獲得最佳的性能以及最大的內存使用量。
3. 如果需要使用持久化,根據是否可以容忍重啟丟失部分數據在快照方式與語句追加方式之間選擇其一,不要使用虛擬內存以及 diskstore 方式。
4. 不要讓你的 Redis 所在機器物理內存使用超過實際內存總量的3/5。