Redis特性
- 速度快
內(nèi)存洲胖、c語言瘫俊、單線程 - 持久化
所有數(shù)據(jù)保持在內(nèi)存中鹊杖,對數(shù)據(jù)的更新將異步保存到磁盤上 - 多種數(shù)據(jù)結(jié)構(gòu)
- 支持多種客戶端語言
- 功能豐富
發(fā)布訂閱悴灵、事務(wù)、Lua腳本骂蓖、pipeline - 簡單
23000行代碼积瞒、不依賴外部庫、單線程模型 - 主從復(fù)制
- 高可用登下、分布式
Redis典型應(yīng)用場景
- 緩存系統(tǒng)
- 計(jì)數(shù)器
- 消息隊(duì)列系統(tǒng)
- 排行榜
- 社交網(wǎng)絡(luò)
- 實(shí)時(shí)系統(tǒng)
Redis安裝
wget http://download.redis.io/releases/redis-3.0.7.tar.gz
解壓并轉(zhuǎn)到解壓目錄
ln -s redis-3.0.7 redis //創(chuàng)建軟鏈接
make&&make install
Redis啟動(dòng)
- 簡單啟動(dòng)
src/redis-server:開啟redis服務(wù)端
src/redis-cli -h 127.0.0.1 -p 6379 客戶端連接- 配置文件啟動(dòng)
src/redis-server config.conf
Redis API
通用命令
- keys(一般不在生產(chǎn)環(huán)境中使用茫孔,時(shí)間復(fù)雜度:O(n))
keys *
遍歷所有的key
keys [pattern]
遍歷符合正則的key - dbsize
dbsize
計(jì)算key的總數(shù) - exists
exists key
檢查key是否存在(1:0) - del
del key1 key2
刪除指定的key-value - expire
expire key seconds
設(shè)置key在seconds秒后過期 - ttl
ttl key
查看key剩余的過期時(shí)間 - persist
persist key
去掉key的過期時(shí)間(-2代表key已經(jīng)不存在;-1代表key存在且沒有過期時(shí)間) - type
type key
返回key的類型
字符串
- 場景
緩存被芳、計(jì)數(shù)器缰贝、分布式鎖等 - api
get、set畔濒、del
setnx key value
key不存在才設(shè)置
set key value xx
key 存在才設(shè)置
incr key
key自增1剩晴,如果key不存在,自增后get(key)=1
decr key
key自減1侵状,如果key不存在赞弥,自減后get(key)=-1
incrby key k
key自增1,如果key不存在趣兄,自增后get(key)=k
decrby key k
key自減k绽左,如果key不存在,自減后get(key)=-k
mget key1 key2 key3
批量獲取key
mset key1 value1 key2 value2
批量設(shè)置key-value
getset key newvalue
設(shè)置newvalue并返回舊的value
append key value
將value追加到舊的value
strlen key
返回字符串的長度(注意中文)
incrbyfloat key 3.5
增加key對應(yīng)的值3.5
getrange key start end
獲取字符串指定下標(biāo)的所有值
setrange key index value
設(shè)置指定下標(biāo)對應(yīng)的值
哈希
- 哈希鍵值結(jié)構(gòu)
key-->{field:value} field不能相同 - API
hget key field
獲取hash對應(yīng)key對應(yīng)field的value
hgetall key
獲取hash對應(yīng)key的所有field和value
hset key field value
設(shè)置hash對應(yīng)key對應(yīng)field的value
hdel key field
刪除hash對應(yīng)key對應(yīng)field的value
hexists key field
判斷hash key是否有field
hlen key
獲取hash key field的數(shù)量
hmget key field1 field2 field3
批量獲取hash key對應(yīng)的一批field對應(yīng)的值
hmget key field1 value1 field2 value2
批量設(shè)置hash key的一批field value
hincrby key field count
增加整數(shù)艇潭,可填負(fù)數(shù)
hincrbyfloat key field count
增加浮點(diǎn)數(shù)拼窥,可填負(fù)數(shù)
hvals key
返回hash key對應(yīng)的所有field對應(yīng)的value
hkeys key
返回hash key對應(yīng)的所有field
hsetnx key field value
field不存在才設(shè)置
列表
- 特點(diǎn)
有序、可重復(fù)蹋凝、左右兩邊插入彈出 - API
rpush key value1 value2
從列表右端插入值
lpush key value1 value2
從列表左端插入值
linsert key before|after value newvalue
在list指定值得前后插入newvalue
lpop key
從list左側(cè)彈出item
lrem key count value
根據(jù)value的值鲁纠,從列表中刪除所有與value相等的項(xiàng)
count>0從左到右;count<0從右到左仙粱;count=0刪除所有
ltrim key start end
按照索引范圍修建列表
lrange key start end
獲取列表指定索引范圍所有item
lindex key index
獲取列表指定索引的item
llen key
計(jì)算列表的長度
lset key index newvalue
設(shè)置列表指定索引值為newvalue
Jedis
- Jedis(String host, int port, int connectionTimeout, int soTimeout)
(節(jié)點(diǎn)IP, 節(jié)點(diǎn)端口, 客戶端連接超時(shí), 客戶端讀寫超時(shí))
Jedis jedis = new Jedis("192.168.186.100",6380)
- String
jedis.set("hello","world");
jedis.get("hello");
jedis.incr("x");
- Hash
jedis.hset("user:1:info","address","廣州");
jedis.hget("user:1:info","address");
jedis.hgetAll("user:1:info");
- List
jedis.rpush("list","4","5","8");
jedis.lpop("list");
jedis.lrange("list",0,-1);
- Set
jedis.sadd("set","a");
jedis.sadd("set","b","a");
jedis.sadd("set","a");
jedis.srem("set","a","b");
jedis.smembers("set");
- zset
jedis.zadd("myzset",80,"tom");
jedis.zadd("myzset",80,"jack");
jedis.zadd("myzset",90,"lili");
System.out.println(jedis.zrangeWithScores("myzset", 0, -1));
System.out.println(jedis.zrange("myzset", 0, -1));
`System.out.println(jedis.zcard("myzset"));`
慢查詢
- 客戶端請求redis生命周期
發(fā)送命令-->排隊(duì)-->執(zhí)行命令-->返回結(jié)果
慢查詢發(fā)生在執(zhí)行命令階段
客戶端超時(shí)不一定是慢查詢,但慢查詢是客戶端超時(shí)的一個(gè)因素 - 特點(diǎn)
先進(jìn)先出隊(duì)列
固定長度
保存在內(nèi)存中 - 參數(shù)
慢查詢閾值(微秒):slowlog-log-slower-than
(0:記錄所有彻舰;1:不記錄)
最大長度:slowlog-max-len
config get 參數(shù)名
- 修改配置文件重啟(不建議)
- 動(dòng)態(tài)配置
config set 參數(shù)名
- 常用命令
slowlog get [n]
獲取慢查詢隊(duì)列
隊(duì)列信息
slowlog len
獲取慢查詢隊(duì)列長度
slowlog reset
清空慢查詢隊(duì)列 - tips
slowlog-log-slower-than不要設(shè)置過大伐割,通常設(shè)置1ms
slowlog-max-len不要設(shè)置過小,設(shè)置1000左右
理解命令生命周期
定期持久化
pipeline流水線
package com.test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
public class TestPipeline {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.186.100",6380);
long start = System.currentTimeMillis();
// for (int i=0;i<10000;i++){
// jedis.hset("key","field"+i,"value"+i);//2260
// }
for (int i=0;i<=10;i++){
Pipeline pipeline = jedis.pipelined();
for (int j=i*1000;j<=(i+1)*100;j++){
pipeline.hset("key1","field"+j,"value"+j);//47
}
pipeline.syncAndReturnAll();
}
long end = System.currentTimeMillis();
System.out.println(end-start);
}
}
-對比原生的M命令
pipeline命令是非原子性的
- 注意事項(xiàng)
1刃唤、注意pipeline每次攜帶的數(shù)據(jù)量
2隔心、pipeline每次只能作用在一個(gè)redis節(jié)點(diǎn)上
發(fā)布訂閱
- 發(fā)布命令
publish channel message
返回訂閱者個(gè)數(shù)` - 訂閱命令
subscribe [channel]//一個(gè)或多個(gè)
psubscribe [pattern]//根據(jù)模式訂閱
punsubscribe [pattern]//根據(jù)模式退訂
pubsub channels//列出至少有1個(gè)訂閱者的頻道
pubsub numsub [channel..]//列出指定頻道訂閱者的數(shù)量