Redis是用C語言實現的,通常來講C語言實現的程序「距離」操做系統更近,執行速度相對會更快。css
Redis使用了單線程架構,預防了多線程可能產生的競爭問題。nginx
做者對於Redis源代碼能夠說是精打細磨,曾經有人評價Redis是少有的集性能和優雅於一身的開源代碼。redis
本文比較詳細且全面的梳理了Redis使用過程當中涉及的所有增刪改查!sql
1.設置鍵shell
set key value [ex seconds] [px milliseconds] [nx|xx] setex key seconds value setnx key value
2.批量設置值數據庫
mset key value [key value ...]
3.批量獲取值swift
mget key [key ...]
4.計數安全
incr key
decr(自減)、incrby(自增指定數字)、
decrby(自減指定數字)、incrbyfloat(自增浮點數)bash
4.追加值服務器
append key value
5.字符串長度
strlen key
6.設置並返回原值
getset key value
7.設置指定位置的字符
setrange key offeset value
8.獲取部分字符串
getrange key start end
1.設置值
hset key field value
2.獲取值
hget key field
3.刪除filed
hdel key field [field ...]
4.計算field個數
hlen key
5.批量設置或獲取field-value
hmget key field [field ...] hmset key field value [field value ...]
6.判斷field是否存在
hexists key field
7.獲取全部field
hkeys key
8.獲取全部value
hvals key
9.獲取全部的field-value
hgetall key
10.hincrby hincrbyfloat
hincrby key field hincrbyfloat key field
11.計算value的字符串長度
hstrlen key field
1)添加
left/right
1.從右邊插入元素
rpush key value [value ...]
lrange listkey 0 -1 能夠從左到右獲取列表的全部元素
2.從左邊插入元素
lpush key value [value ...]
3.向某個元素前或者後插入元素
linsert key before|after pivot value
2)查找
1.獲取指定範圍內的元素列表
lrange key start end
2.獲取列表指定索引下標的元素
lindex key index
3.獲取列表長度
llen key
3)刪除
1.從列表左側彈出元素
lpop key
2.從列表右側彈出
rpop key
3.刪除指定元素
lrem key count value
4.按照索引範圍修剪列表
ltrim key start end
4)修改
修改指定索引下標的元素
lset key index newValue
5)阻塞操做
blpop key [key ...] timeout brpop key [key ...] timeout
開發技巧
集合(set)類型也是用來保存多個的字符串元素,但和列表類型不同的是,集合中不容許有重複元素,而且集合中的元素是無序的,不能經過索引下標獲取元素。
1.添加元素
sadd key element [element ...]
2.刪除元素
srem key element [element ...]
3.計算元素個數
scard key
4.判斷元素是否在集合中
sismember key element
5.隨機從集合返回指定個數元素
srandmember key [count]
6.從集合隨機彈出元素
spop key
7.獲取全部元素
smembers key
8.求多個集合的交集
sinter key [key ...]
9.求多個集合的並集
suinon key [key ...]
10.求多個集合的差集
sdiff key [key ...]
11.將交集、並集、差集的結果保存
sinterstore destination key [key ...] suionstore destination key [key ...] sdiffstore destination key [key ...]
三個命令(原命令+store)將集合間交集、並集、差集的結果保存在destination中
1.添加成員
zadd key score member [score member ...]
Redis3.2爲zadd命令添加了nx、xx、ch、incr四個選項:
2.計算成員個數
zcard key
3.計算某個成員的分數
zscore key member
4.計算成員的排名
zrank key member zrevrank key member
5.刪除成員
zrem key member [member ...]
6.增長成員的分數
zincrby key increment member zincrby user:ranking 9 tom
7.返回指定排名範圍的成員
zrange key start end [withscores] zrevrange key start end [withscores]
zrange是從低到高返回,zrevrange反之。
8.返回指定分數範圍的成員
zrangebyscore key min max [withscores] [limit offset count] zrevrangebyscore key max min [withscores] [limit offset count]
其中zrangebyscore按照分數從低到高返回,zrevrangebyscore反之。
同時min和max還支持開區間(小括號)和閉區間(中括號),-inf和+inf分別表明無限小和無限大。
9.返回指定分數範圍成員個數
zcount key min max
10.刪除指定排名內的升序元素
zremrangebyrank key start end
11.刪除指定分數範圍的成員
zremrangebyscore key min max
12.交集
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max]
zinterstore user:ranking:1_inter_2 2 user:ranking:1 user:ranking:2 weights 1 0.5 aggregate max
13.並集
zunionstore destination numkeys key [key ...] [weights weight [weight ...]][aggregate sum|min|max]
鍵重命名
rename key newkey
隨機返回一個鍵
randomkey
set hello world expire hello 10 ttl hello
經過ttl觀察它的過時剩餘時間(s),返回結果爲-2時,表明已被刪除。
ttl 和 ptll均可以查詢鍵的剩餘時間,可是pttl的精度能夠達到毫秒級別,有3種返回值:
expireat命令能夠設置鍵的秒級過時時間戳,例如若是須要將鍵hello在2016-08-0100:00:00(秒級時間戳爲1469980800)過時,能夠執行以下操做:
expireat hello 1469980800
除此以外,Redis2.6版本後提供了毫秒級的過時方案:
但不管是使用過時時間仍是時間戳,秒級仍是毫秒級,在Redis內部最終使用的都是pexpireat。
persist hello
1)move key db
僅限於內部數據庫的遷移
2)dump+restore
dump key
restore key ttl value
分爲兩步:
1.在源Redis上,dump命令會將鍵值序列化,格式採用的是RDB格式。
2.在目標Redis上,restore命令將上面序列化的值進行復原,其中ttl參數表明過時時間,若是ttl=0表明沒有過時時間。
示例:
1在源Redis上執行dump:
127.0.0.1:6379> set hello world OK 127.0.0.1:6379> dump hello "\x00\x05world\b\x00\xa0\xfc\xd0;y\xb0\xf8\xfa"
2在目標Redis上執行restore
127.0.0.1:6379> get hello (nil) 127.0.0.1:6379> restore hello 0 "\x00\x05world\b\x00\xa0\xfc\xd0;y\xb0\xf8\xfa" OK 127.0.0.1:6379> get hello "world"
上面兩步對應的僞代碼爲
Redis sourceRedis = new Redis("sourceMachine", 6379); Redis targetRedis = new Redis("targetMachine", 6379); targetRedis.restore("hello", 0, sourceRedis.dump(key));
3)migrate(推薦)
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key]]
下面對migrate的參數進行逐個說明:
第一,整個過程是原子執行的,不須要在多個Redis實例上開啓客戶端的,只須要在源Redis上執行migrate命令便可。
第二,migrate命令的數據傳輸直接在源Redis和目標Redis上完成的。
第三,目標Redis完成restore後會發送OK給源Redis,源Redis接收後會根據migrate對應的選項來決定是否在源Redis上刪除對應的鍵。
示例:
1源Redis有,目標沒有
migrate 127.0.0.1 6380 hello 0 1000
2源Redis和目標Redis都有鍵hello
migrate 127.0.0.1 6379 hello 0 1000 replace
源Redis批量添加多個鍵
mset key1 value1 key2 value2 key3 value3
源Redis執行以下命令完成多個鍵的遷移
migrate 127.0.0.1 6380 "" 0 5000 keys key1 key2 key3
1)全量遍歷鍵
keys pattern
示例:
keys *
若是Redis包含了大量的鍵,執行keys命令極可能會形成Redis阻塞,因此通常建議不要在生產環境下使用keys命令。
2)漸進式遍歷
每次執行scan,能夠想象成只掃描一個字典中的一部分鍵,直到將字典中的全部鍵遍歷完畢。
scan cursor [match pattern] [count number]
cursor是必需參數,實際上cursor是一個遊標,第一次遍歷從0開始,每次scan遍歷完都會返回當前遊標的值,直到遊標值爲0,表示遍歷結束。
match pattern是可選參數,它的做用的是作模式的匹配,這點和keys的模式匹配很像。
count number是可選參數,它的做用是代表每次要遍歷的鍵個數,默認值是10,此參數能夠適當增大。
1.切換數據庫
select dbIndex
默認有16個
2.flushdb/flushall
flushdb只清除當前數據庫,flushall會清除全部數據庫。
所謂慢查詢日誌就是系統在命令執行先後計算每條命令的執行時間,當超過預設閥值,就將這條命令的相關信息(例如:發生時間,耗時,命令的詳細信息)記錄下來。慢查詢功能能夠有效地幫助咱們找到Redis可能存在的瓶頸.
Pipeline(流水線)機制它能將一組Redis命令進行組裝,經過一次RTT傳輸給Redis,再將這組Redis命令的執行結果按順序返回給客戶端。
熟悉關係型數據庫的讀者應該對事務比較瞭解,簡單地說,事務表示一組動做,要麼所有執行,要麼所有不執行。
Redis提供了簡單的事務功能,將一組須要一塊兒執行的命令放到multi和exec兩個命令之間。若是要中止事務的執行,可使用discard命令代替exec命令便可。
shutdown
Redis關閉的過程:斷開與客戶端的鏈接、持久化文件生成,是一種相對優雅的關閉方式。
也能夠kill掉,但不要kill -9,shutdown參數有nosave|save
設置密碼("":無)
config set requirepass "password"
登陸
auth "password"
獲取密碼
config get requirepass
全部的數據都存在內存中,從內存當中同步到硬盤上,這個過程叫作持久化過程。
持久化操做,兩種方式:rdb方式、aof方式,能夠單獨使用或者結合使用。
RDB持久化方式可以在指定的時間間隔能對你的數據進行快照存儲.
AOF持久化方式記錄每次對服務器寫的操做,當服務器重啓的時候會從新執行這些命令來恢復原始的數據,AOF命令以redis協議追加保存每次寫的操做到文件末尾。Redis還能對AOF文件進行後臺重寫,使得AOF文件的體積不至於過大。
RDB配置
在redis.conf中的配置
save 900 1 save 300 10 save 60 10000 dbfilename dump.rdb dir ./
意思是在900秒內有1個key發生變化,就寫一次硬盤。
Linux保存在 redis.conf 同級目錄
AOF配置
# 默認不開啓AOF appendonly no #使用改爲yes # 同步策略 # appendfsync always #修改一次 (推薦) appendfsync everysec #每秒同步 # appendfsync no #不一樣步
配置完記得重啓!