最近學(xué)習(xí)redis,記錄一下
redis官網(wǎng):redis.io
中文官網(wǎng):http://www.redis.net.cn
github地址:https://github.com/antirez/redis
redis和memcached相比,的獨(dú)特之處:
1: redis可以用來(lái)做存儲(chǔ)(storge), 而memccached是用來(lái)做緩存(cache)
這個(gè)特點(diǎn)主要因?yàn)槠溆小背志没钡墓δ?
2: 存儲(chǔ)的數(shù)據(jù)有”結(jié)構(gòu)”,對(duì)于memcached來(lái)說(shuō),存儲(chǔ)的數(shù)據(jù),只有1種類(lèi)型--”字符串”,
而redis則可以存儲(chǔ)字符串,鏈表,哈希結(jié)構(gòu),集合,有序集合
1、Redis下載安裝
1:官方站點(diǎn): redis.io 下載最新版或者最新stable版
2:解壓源碼并進(jìn)入目錄
3: 不用configure
4: 直接make
(如果是32位機(jī)器 make 32bit)
注:易碰到的問(wèn)題,時(shí)間錯(cuò)誤.
原因: 源碼是官方configure過(guò)的,但官方configure時(shí),生成的文件有時(shí)間戳信息,
Make只能發(fā)生在configure之后,
如果你的虛擬機(jī)的時(shí)間不對(duì),比如說(shuō)是2012年
解決: date -s ‘yyyy-mm-ddhh:mm:ss’?? 重寫(xiě)時(shí)間
再 clock -w? 寫(xiě)入cmos
5: 可選步驟: make test? 測(cè)試編譯情況
(可能出現(xiàn): need tcl? >8.4這種情況, yum install tcl)
6: 安裝到指定的目錄,比如 /usr/local/redis
make?PREFIX=/usr/local/redis install
注: PREFIX要大寫(xiě)
7: make install之后,得到如下幾個(gè)文件
redis-benchmark? 性能測(cè)試工具
redis-check-aof? 日志文件檢測(cè)工(比如斷電造成日志損壞,可以檢測(cè)并修復(fù))
redis-check-dump? 快照文件檢測(cè)工具,效果類(lèi)上
redis-cli?客戶(hù)端
redis-server 服務(wù)端
8: 復(fù)制配置文件
Cp /path/redis.conf /usr/local/redis
9: 啟動(dòng)與連接
/path/to/redis/bin/redis-server? ./path/to/conf-file
例:[root@localhostredis]# ./bin/redis-server ./redis.conf
連接: 用redis-cli
#/path/to/redis/bin/redis-cli [-h localhost-p 6379 ]
10: 讓redis以后臺(tái)進(jìn)程的形式運(yùn)行
編輯conf配置文件,修改如下內(nèi)容;
daemonize yes
2、redis各個(gè)類(lèi)型操作命令
set key value
設(shè)置key和value
get key
獲取key對(duì)應(yīng)的值
keys *
獲取當(dāng)前庫(kù)的所有key
exist key
返回key是否存在
type key
返回key存儲(chǔ)的值的類(lèi)型 有string,link,set,order set, hash
del key
刪除key
rename key newkey
重命名key
renamenx key newkey
當(dāng)庫(kù)里有newkey時(shí)不做任何操作,如果沒(méi)有newkey則進(jìn)行重命名
select db
切換redis數(shù)據(jù)庫(kù)
move key db
移動(dòng)key到對(duì)應(yīng)的庫(kù)下
expire key 整數(shù)
設(shè)置key的生命周期 整數(shù)單位是秒
ttl key
查詢(xún)key的生命周期 返回的是秒數(shù) 注:對(duì)于不存在的key返回-2,已過(guò)期的key或者不過(guò)期的key都返回-1
pexpire key 整數(shù)
設(shè)置key的生命周期 整數(shù)單位是毫秒
pttl key
查詢(xún)key的生命周期 返回的是毫秒數(shù) 注:對(duì)于不存在的key返回-2,已過(guò)期的key或者不過(guò)期的key都返回-1
persist key
把指定key設(shè)置永久有效
flushdb
清空當(dāng)前庫(kù)
2.1、Redis 字符串 (Strings)
set key value [ex 秒數(shù)] / [px 毫秒數(shù)] ?[nx] /[xx]
如: set a 1 ex 10 , 10秒有效
Set a 1 px 9000 ?, 9秒有效
注: 如果ex,px同時(shí)寫(xiě),以后面的有效期為準(zhǔn)
如 set a 1 ex 100 px 9000, 實(shí)際有效期是9000毫秒
nx: 表示key不存在時(shí),執(zhí)行操作
xx: 表示key存在時(shí),執(zhí)行操作
mset ?即multi set
一次性設(shè)置多個(gè)鍵值
mset key1 v1 key2 v2 ....
mget key1 key2 ..keyn
獲取多個(gè)key的值
setrange key offset value
把字符串的offset偏移字節(jié),改成value
append key value
把value追加到key的原值上
getrange key start stop
是獲取字符串中 [start, stop]范圍的值 注意: 對(duì)于字符串的下標(biāo),左數(shù)從0開(kāi)始,右數(shù)從-1開(kāi)始
getset key newvalue
獲取并返回舊值,設(shè)置新值
incr key
指定的key的值加1,并返回加1后的值
注意:
1:不存在的key當(dāng)成0,再incr操作
2: 范圍為64有符號(hào)
incrby key number
指定key的值加指定數(shù)
decr key
指定的key的值減1,并返回減1后的值
decrby key number
指定的key的值減去指定數(shù)
2.2、Redis 列表(Lists)
lpush key value
把值插入到鏈接頭部
rpush key value
把值插入到鏈接尾部
lpop key
返回并刪除鏈表頭元素
rpop key
返回并刪除鏈表尾元素
lrem key count value
從key鏈表中刪除 value值
注: 刪除count的絕對(duì)值個(gè)value后結(jié)束
Count>0 從表頭刪除
Count<0 從表尾刪除
lrange key start ?stop
返回鏈表中[start ,stop]中的元素
規(guī)律: 左數(shù)從0開(kāi)始,右數(shù)從-1開(kāi)始
ltrim key start stop
剪切key對(duì)應(yīng)的鏈接,切[start,stop]一段,并把該段重新賦給key
lindex key index
返回index索引上的值
llen key
計(jì)算鏈接表的元素個(gè)數(shù)
linsert ?key after|before search value
作用: 在key鏈表中尋找’search’,并在search值之前|之后,.插入value
注: 一旦找到一個(gè)search后,命令就結(jié)束了,因此不會(huì)插入多個(gè)value
例如:
test:1>lrange char 0 -1
1) ?"b"
2) ?"c"
3) ?"d"
test:1>linsert char after d h
"4"
test:1>lrange char 0 -1
1) ?"b"
2) ?"c"
3) ?"d"
4) ?"h"
test:1>
rpoplpush source dest
作用: 把source的尾部拿出,放在dest的頭部,
并返回 該單元值
場(chǎng)景: task + bak 雙鏈表完成安全隊(duì)列
Task列表 ? ? ? ? ? ? ? ? ? ? ? ? ? ? bak列表
業(yè)務(wù)邏輯:
1:Rpoplpush task bak
2:接收返回值,并做業(yè)務(wù)處理
3:如果成功,rpop bak 清除任務(wù). 如不成功,下次從bak表里取任務(wù)
例如:
test:1>lrange char 0 -1
1) ?"b"
2) ?"c"
3) ?"d"
4) ?"h"
test:1>rpoplpush char bak
"h"
test:1>lrange char 0 -1
1) ?"b"
2) ?"c"
3) ?"d"
test:1>lrange bak 0 -1
1) ?"h"
test:1>
brpop ,blpop ?key timeout
作用:等待彈出key的尾/頭元素,
Timeout為等待超時(shí)時(shí)間
如果timeout為0,則一直等待
場(chǎng)景: 長(zhǎng)輪詢(xún)Ajax,在線聊天時(shí),能夠用到
2.3、bitmaps(位圖)
getbit key offset
獲取值的二進(jìn)制表示,對(duì)應(yīng)位上的值(從左,從0編號(hào))
setbit ?key offset value
設(shè)置offset對(duì)應(yīng)二進(jìn)制位上的值
返回: 該位上的舊值
注意:
1:如果offset過(guò)大,則會(huì)在中間填充0,
2: offset最大大到多少
3:offset最大2^32-1,可推出最大的的字符串為512M
bitop operation destkey key1 [key2 ...]
對(duì)key1,key2..keyN作operation,并將結(jié)果保存到 destkey 上。
operation 可以是 AND 、 OR 、 NOT 、 XOR
注意: 對(duì)于NOT操作, key不能多個(gè)
2.4、Redis 集合 (Sets)
set集合的性質(zhì): 唯一性,無(wú)序性,確定性
sadd key ?value1 value2
往集合key中增加元素
smembers key
查看key中的所有元素
srem value1 value2
刪除集合中集為 value1 value2的元素
返回值: 忽略不存在的元素后,真正刪除掉的元素的個(gè)數(shù)
spop key
返回并刪除集合中key中1個(gè)隨機(jī)元素
srandmember key
返回集合key中一個(gè)隨機(jī)數(shù)
sismember key value
判斷元素是否在集合key中存在,存在:1,不存在:0
scard key
查看key中元素個(gè)數(shù)
smove source dest value
把source中的value刪除,并添加到dest集合中
例如:
test:2>smembers sett
1) ?"e"
2) ?"b"
3) ?"d"
4) ?"c"
5) ?"a"
test:2>scard sett
"5"
test:2>smove sett dest a
"1"
test:2>smembers dest
1) ?"a"
test:2>smembers sett
1) ?"e"
2) ?"b"
3) ?"d"
4) ?"c"
sinter ?key1 key2 key3 ...
求出key1 key2 key3 三個(gè)集合中的交集,并返回
例如:
test:2>sadd sur1 a b c d e
"5"
test:2>sadd sur2 b c e f g
"5"
test:2>sadd sur3 c e g b a
"5"
test:2>sinter sur1 sur2 sur3
1) ?"e"
2) ?"c"
3) ?"b"
test:2>
sinterstore dest key1 key2 key3
求出key1 key2 key3 三個(gè)集合中的交集,并賦給dest
例如:
test:2>sinterstore dest sur1 sur2 sur3
"3"
test:2>smembers dest
1) ?"e"
2) ?"b"
3) ?"c"
test:2>
sunion key1 key2 key3
返回key1 key2 key3三個(gè)集合的并集
test:2>sunion sur1 sur2 sur3
1) ?"e"
2) ?"f"
3) ?"b"
4) ?"d"
5) ?"g"
6) ?"a"
7) ?"c"
test:2>
sdiff key1 key2 key3
返回key1與key2 key3的差集,即key1-key2-key3
test:2>sdiff sur1 sur2 sur3
1) ?"d"
test:2>
2.5、Redis 有序集合 (Sorted sets)
zadd key score1 value1 score2 value2 ..
添加元素
test:3>zadd age 1 a 2 b 3 c 4 d
"4"
zrange key 0 -1
查看key所有元素
zrem key value1 value2 ..
刪除集合中的元素
test:3>zrem age d
"1"
test:3>zrange age 0 -1
1) ?"a"
2) ?"b"
3) ?"c"
test:3>
zremrangebyscore key min max
按照socre來(lái)刪除元素,刪除score在[min,max]之間的
test:3>zrange age 0 -1
1) ?"a"
2) ?"b"
3) ?"c"
4) ?"d"
5) ?"e"
6) ?"f"
test:3>zremrangebyscore age 2 3
"2"
test:3>zrange age 0 -1
1) ?"a"
2) ?"d"
3) ?"e"
4) ?"f"
test:3>
zremrangebyrank key start end
按排名刪除元素,刪除名次在[start,end]之間的
test:3>zrange age 0 -1
1) ?"a"
2) ?"d"
3) ?"e"
4) ?"f"
test:3>zremrangebyrank age 0 1
"2"
test:3>zrange age 0 -1
1) ?"e"
2) ?"f"
test:3>
zrank key member
查詢(xún)member的排名(升續(xù) 0名開(kāi)始)
test:3>zrange age 0 -1
1) ?"a"
2) ?"b"
3) ?"c"
4) ?"d"
5) ?"e"
6) ?"f"
test:3>zrank age d
"3"
zrevrank key memeber
查詢(xún) member的排名(降續(xù) 0名開(kāi)始)
test:3>zrange age 0 -1
1) ?"a"
2) ?"b"
3) ?"c"
4) ?"d"
5) ?"e"
6) ?"f"
test:3>zrank age d
"3"
test:3>zrevrank age e
"1"
zrange key start stop [WITHSCORES]
把集合排序后,返回名次[start,stop]的元素
默認(rèn)是升續(xù)排列
Withscores 是把score也打印出來(lái)
test:3>zrange age 2 3
1) ?"c"
2) ?"d"
test:3>zrange age 2 3 withscores
1) ?"c"
2) ?"3"
3) ?"d"
4) ?"4"
zrevrange key start stop
作用:把集合降序排列,取名字[start,stop]之間的元素
test:3>zrevrange age 1 2
1) ?"e"
2) ?"d"
test:3>zrevrange age 1 2 withscores
1) ?"e"
2) ?"5"
3) ?"d"
4) ?"4"
zrangebyscore ?key min max [withscores] limit offset N
作用: 集合(升續(xù))排序后,取score在[min,max]內(nèi)的元素,
并跳過(guò) offset個(gè), 取出N個(gè)
test:3>zrange age 0 -1
1) ?"a"
2) ?"b"
3) ?"c"
4) ?"d"
5) ?"e"
6) ?"f"
test:3>zrange age 0 -1 withscores
1) ?"a"
2) ?"1"
3) ?"b"
4) ?"2"
5) ?"c"
6) ?"3"
7) ?"d"
8) ?"4"
9) ?"e"
10) ?"5"
11) ?"f"
12) ?"6"
test:3>zrangebyscore age 1 4 limit 1 2 withscores
1) ?"b"
2) ?"2"
3) ?"c"
4) ?"3"
test:3>
zcard key
返回元素個(gè)數(shù)
zcount key min max
返回[min,max] 區(qū)間內(nèi)元素的數(shù)量
test:3>zcount age 1 5
"5"
zinterstore destination numkeys key1 [key2 ...]
[weights weight [weight ...]]
[aggregate SUM|MIN|MAX]
求key1,key2的交集,key1,key2的權(quán)重分別是 weight1,weight2
聚合方法用: sum |min|max
聚合的結(jié)果,保存在dest集合內(nèi)
注意: weights ,aggregate如何理解?
答: 如果有交集, 交集元素又有socre,score怎么處理?
Aggregate sum->score相加 ? , min 求最小score, max 最大score
另: 可以通過(guò)weigth設(shè)置不同key的權(quán)重, 交集時(shí),socre * weights
test:3>zadd s1 1 a 2 b 3 c 4 d
"4"
test:3>zadd s2 2 a 4 b 5 e 6 g
"4"
test:3>zinterstore dest 2 s1 s2
"2"
test:3>zrange dest 0 -1
1) ?"a"
2) ?"b"
test:3>zrange dest 0 -1 withscores
1) ?"a"
2) ?"3"
3) ?"b"
4) ?"6"
test:3>zinterstore dest 2 s1 s2 aggregate sum
"2"
test:3>zrange dest 0 -1 withscores
1) ?"a"
2) ?"3"
3) ?"b"
4) ?"6"
test:3>zinterstore dest 2 s1 s2 aggregate min
"2"
test:3>zrange dest 0 -1 withscores
1) ?"a"
2) ?"1"
3) ?"b"
4) ?"2"
test:3>zinterstore dest 2 s1 s2 aggregate max
"2"
test:3>zrange dest 0 -1 withscores
1) ?"a"
2) ?"2"
3) ?"b"
4) ?"4"
test:3>zinterstore dest 2 s1 s2 weights 2 1 aggregate sum
"2"
test:3>zrange dest 0 -1 withscores
1) ?"a"
2) ?"4"
3) ?"b"
4) ?"8"
2.6、Redis 哈希/散列 (Hashes)
hset key field value
作用: 把key中 filed域的值設(shè)為value
注:如果沒(méi)有field域,直接添加,如果有,則覆蓋原field域的值
test:4>hset user username lisi
"1"
test:4>hset user age 28
"1"
test:4>hset user gender male
"1"
hmset key field1 value1 [field2 value2 field3 value3 ......fieldn valuen]
作用: 設(shè)置field1->N 個(gè)域, 對(duì)應(yīng)的值是value1->N
test:4>hmset user username zhangsan age 30 gender female
"OK"
test:4>
hget key field
作用: 返回key中field域的值
test:4>hget user username
"zhangsan"
test:4>
hmget key field1 field2 fieldN
作用: 返回key中field1 field2 fieldN域的值
test:4>hmget user username age gender
1) ?"zhangsan"
2) ?"30"
3) ?"female"
test:4>
hgetall key
作用:返回key中,所有域與其值
test:4>hgetall user
1) ?"username"
2) ?"zhangsan"
3) ?"age"
4) ?"30"
5) ?"gender"
6) ?"female"
test:4>
hdel key field
作用: 刪除key中 field域
test:4>hdel user age
"1"
test:4>hgetall user
1) ?"username"
2) ?"zhangsan"
3) ?"gender"
4) ?"female"
test:4>
hlen key
作用: 返回key中元素的數(shù)量
test:4>hlen user
"2"
test:4>
hexists key field
作用: 判斷key中有沒(méi)有field域
test:4>hexists user username
"1"
test:4>hexists user age
"0"
test:4>
hinrby key field value
作用: 是把key中的field域的值增長(zhǎng)整型值value
test:4>hincrby user age 1
"21"
test:4>
hincrbyfloat ?key field value
作用: 是把key中的field域的值增長(zhǎng)浮點(diǎn)值value
test:4>hincrbyfloat user age 0.5
"21.5"
test:4>
hkeys key
作用: 返回key中所有的field
test:4>hkeys user
1) ?"username"
2) ?"gender"
3) ?"age"
test:4>
kvals key
作用: 返回key中所有的value
test:4>hvals user
1) ?"zhangsan"
2) ?"female"
3) ?"21.5"
test:4>