最近學習redis,記錄一下
redis官網:redis.io
github地址:https://github.com/antirez/redis
redis和memcached相比,的獨特之處:
1: redis可以用來做存儲(storge), 而memccached是用來做緩存(cache)
這個特點主要因為其有”持久化”的功能.
2: 存儲的數據有”結構”,對于memcached來說,存儲的數據,只有1種類型--”字符串”,
而redis則可以存儲字符串,鏈表,哈希結構,集合,有序集合
1、Redis下載安裝
1:官方站點: redis.io 下載最新版或者最新stable版
2:解壓源碼并進入目錄
3: 不用configure
4: 直接make
(如果是32位機器 make 32bit)
注:易碰到的問題,時間錯誤.
原因: 源碼是官方configure過的,但官方configure時,生成的文件有時間戳信息,
Make只能發生在configure之后,
如果你的虛擬機的時間不對,比如說是2012年
解決: date -s ‘yyyy-mm-ddhh:mm:ss’?? 重寫時間
再 clock -w? 寫入cmos
5: 可選步驟: make test? 測試編譯情況
(可能出現: need tcl? >8.4這種情況, yum install tcl)
6: 安裝到指定的目錄,比如 /usr/local/redis
make?PREFIX=/usr/local/redis install
注: PREFIX要大寫
7: make install之后,得到如下幾個文件
redis-benchmark? 性能測試工具
redis-check-aof? 日志文件檢測工(比如斷電造成日志損壞,可以檢測并修復)
redis-check-dump? 快照文件檢測工具,效果類上
redis-cli?客戶端
redis-server 服務端
8: 復制配置文件
Cp /path/redis.conf /usr/local/redis
9: 啟動與連接
/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以后臺進程的形式運行
編輯conf配置文件,修改如下內容;
daemonize yes
2、redis各個類型操作命令
set key value
設置key和value
get key
獲取key對應的值
keys *
獲取當前庫的所有key
exist key
返回key是否存在
type key
返回key存儲的值的類型 有string,link,set,order set, hash
del key
刪除key
rename key newkey
重命名key
renamenx key newkey
當庫里有newkey時不做任何操作,如果沒有newkey則進行重命名
select db
切換redis數據庫
move key db
移動key到對應的庫下
expire key 整數
設置key的生命周期 整數單位是秒
ttl key
查詢key的生命周期 返回的是秒數 注:對于不存在的key返回-2,已過期的key或者不過期的key都返回-1
pexpire key 整數
設置key的生命周期 整數單位是毫秒
pttl key
查詢key的生命周期 返回的是毫秒數 注:對于不存在的key返回-2,已過期的key或者不過期的key都返回-1
persist key
把指定key設置永久有效
flushdb
清空當前庫
2.1、Redis 字符串 (Strings)
set key value [ex 秒數] / [px 毫秒數] ?[nx] /[xx]
如: set a 1 ex 10 , 10秒有效
Set a 1 px 9000 ?, 9秒有效
注: 如果ex,px同時寫,以后面的有效期為準
如 set a 1 ex 100 px 9000, 實際有效期是9000毫秒
nx: 表示key不存在時,執行操作
xx: 表示key存在時,執行操作
mset ?即multi set
一次性設置多個鍵值
mset key1 v1 key2 v2 ....
mget key1 key2 ..keyn
獲取多個key的值
setrange key offset value
把字符串的offset偏移字節,改成value
append key value
把value追加到key的原值上
getrange key start stop
是獲取字符串中 [start, stop]范圍的值 注意: 對于字符串的下標,左數從0開始,右數從-1開始
getset key newvalue
獲取并返回舊值,設置新值
incr key
指定的key的值加1,并返回加1后的值
注意:
1:不存在的key當成0,再incr操作
2: 范圍為64有符號
incrby key number
指定key的值加指定數
decr key
指定的key的值減1,并返回減1后的值
decrby key number
指定的key的值減去指定數
2.2、Redis 列表(Lists)
lpush key value
把值插入到鏈接頭部
rpush key value
把值插入到鏈接尾部
lpop key
返回并刪除鏈表頭元素
rpop key
返回并刪除鏈表尾元素
lrem key count value
從key鏈表中刪除 value值
注: 刪除count的絕對值個value后結束
Count>0 從表頭刪除
Count<0 從表尾刪除
lrange key start ?stop
返回鏈表中[start ,stop]中的元素
規律: 左數從0開始,右數從-1開始
ltrim key start stop
剪切key對應的鏈接,切[start,stop]一段,并把該段重新賦給key
lindex key index
返回index索引上的值
llen key
計算鏈接表的元素個數
linsert ?key after|before search value
作用: 在key鏈表中尋找’search’,并在search值之前|之后,.插入value
注: 一旦找到一個search后,命令就結束了,因此不會插入多個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的頭部,
并返回 該單元值
場景: task + bak 雙鏈表完成安全隊列
Task列表 ? ? ? ? ? ? ? ? ? ? ? ? ? ? bak列表
業務邏輯:
1:Rpoplpush task bak
2:接收返回值,并做業務處理
3:如果成功,rpop bak 清除任務. 如不成功,下次從bak表里取任務
例如:
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為等待超時時間
如果timeout為0,則一直等待
場景: 長輪詢Ajax,在線聊天時,能夠用到
2.3、bitmaps(位圖)
getbit key offset
獲取值的二進制表示,對應位上的值(從左,從0編號)
setbit ?key offset value
設置offset對應二進制位上的值
返回: 該位上的舊值
注意:
1:如果offset過大,則會在中間填充0,
2: offset最大大到多少
3:offset最大2^32-1,可推出最大的的字符串為512M
bitop operation destkey key1 [key2 ...]
對key1,key2..keyN作operation,并將結果保存到 destkey 上。
operation 可以是 AND 、 OR 、 NOT 、 XOR
注意: 對于NOT操作, key不能多個
2.4、Redis 集合 (Sets)
set集合的性質: 唯一性,無序性,確定性
sadd key ?value1 value2
往集合key中增加元素
smembers key
查看key中的所有元素
srem value1 value2
刪除集合中集為 value1 value2的元素
返回值: 忽略不存在的元素后,真正刪除掉的元素的個數
spop key
返回并刪除集合中key中1個隨機元素
srandmember key
返回集合key中一個隨機數
sismember key value
判斷元素是否在集合key中存在,存在:1,不存在:0
scard key
查看key中元素個數
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 三個集合中的交集,并返回
例如:
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 三個集合中的交集,并賦給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三個集合的并集
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來刪除元素,刪除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
查詢member的排名(升續 0名開始)
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
查詢 member的排名(降續 0名開始)
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]的元素
默認是升續排列
Withscores 是把score也打印出來
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
作用: 集合(升續)排序后,取score在[min,max]內的元素,
并跳過 offset個, 取出N個
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
返回元素個數
zcount key min max
返回[min,max] 區間內元素的數量
test:3>zcount age 1 5
"5"
zinterstore destination numkeys key1 [key2 ...]
[weights weight [weight ...]]
[aggregate SUM|MIN|MAX]
求key1,key2的交集,key1,key2的權重分別是 weight1,weight2
聚合方法用: sum |min|max
聚合的結果,保存在dest集合內
注意: weights ,aggregate如何理解?
答: 如果有交集, 交集元素又有socre,score怎么處理?
Aggregate sum->score相加 ? , min 求最小score, max 最大score
另: 可以通過weigth設置不同key的權重, 交集時,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域的值設為value
注:如果沒有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]
作用: 設置field1->N 個域, 對應的值是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中元素的數量
test:4>hlen user
"2"
test:4>
hexists key field
作用: 判斷key中有沒有field域
test:4>hexists user username
"1"
test:4>hexists user age
"0"
test:4>
hinrby key field value
作用: 是把key中的field域的值增長整型值value
test:4>hincrby user age 1
"21"
test:4>
hincrbyfloat ?key field value
作用: 是把key中的field域的值增長浮點值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>