Redis 入門

Redis 概述

Redis 是一個(gè)開源的內(nèi)存數(shù)據(jù)結(jié)構(gòu)存儲(chǔ)器, 用作數(shù)據(jù)庫(kù), 緩存和消息代理.

它支持的數(shù)據(jù)結(jié)構(gòu)類型有

  • 字符串string,
  • 哈希 heshes,
  • 列表 lists, 集合 sets,
  • 帶有范圍查詢的順序集合 sorted set,
  • 位圖 bitmap,
  • 超級(jí)日志hyperloglogs,
  • 帶有半徑查詢的地理空間索引 geospatial indexes

Redis 內(nèi)置了復(fù)制, Lua腳本, LRU 回收, 事務(wù)和不同級(jí)別的持久化, 通過 Redis sentinel 和 Redis cluster 自動(dòng)分區(qū) 提供了高可靠性

最高值

  • 讀 110000 次/s
  • 寫 81000 次/s

一般推薦 QPS 30000, 如果QPS 太高的話, 比如 60000 次/s, CPU過于繁忙, 軟中斷過多, 性能反而下降

Redis 快速上手

安裝

step1. brew install redis

$ find /usr/local/Cellar/redis/3.0.4/
./bin
./bin/redis-benchmark # redis performance benchmark tool
./bin/redis-check-aof # aof file repair tool
./bin/redis-check-dump # rdb file check tool
./bin/redis-cli # redis client
./bin/redis-sentinel
./bin/redis-server # redis server
./COPYING
./homebrew.mxcl.redis.plist
./INSTALL_RECEIPT.json
./README

或者通過源碼安裝

wget https://github.com/antirez/redis/archive/3.2.10.tar.gz
make
copy redis.conf redis-server /opt/redis 

step2. ln -sfv /usr/local/opt/redis/*.plist ~/Library/LaunchAgents

卸載

$ brew uninstall redis
$ rm ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

使用

  • 默認(rèn)端口是6379
  • 啟動(dòng)
## 指定端口啟動(dòng)
redis-server --port 6666

## 指定配置文件啟動(dòng)
redis-server /usr/local/etc/redis.conf

## 使用 launchctl 啟動(dòng)
launchctl load ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

停止

redis-cli shutdown

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.redis.plist

配置文件

redis-server
redis.conf

  • bind $IPAddress
  • protected-mode
  • requirepass
  • daemonize yes
  • port 6666 # default poort is 6379
  • pidfile redis_6666.pid

redis-cli -h $host -p $port

auth $pass
config get ...
config set ...

文件格式

  • rdb 數(shù)據(jù)文件
  • aof 更新日志

命令行工具

  • redis-cli -h 127.0.0.1 -p 6379

  • redis-cli ping

  • redis-cli

部署模式

  • one node
  • master-slave

基本命令

  • 賦值 set key value

  • 取值 get key

  • 遞增 inc key

  • 遞增指定整數(shù) incby key increment

  • 遞增指定浮點(diǎn)數(shù) incbyfloat key increment

  • 遞減 decr key

  • 追加值 append key value

    127.0.0.1:6379> set greeting good
    OK
    127.0.0.1:6379> append greeting " morning"
    (integer) 12
    127.0.0.1:6379> get greeting
    "good morning"

  • 獲取字串長(zhǎng)度 strlen key

  • 同時(shí)設(shè)置和獲取多值
    mset key1 val1 key2 val2
    mget key1 key2

  • 位操作
    getit key offset
    setbit key offset value
    bitcount key [start] [end]

復(fù)合類型

哈希

就象一個(gè) map<string, string>

hset key field value
hget key
hmset key fieldname1, fieldvalue1
hmget key fieldname1, fieldname2
hgetall key
hkeys
hvals
hdel

列表

  • 添加元素
    從左首添加 lpush key values

lpush booklist posa1, posa2, posa2, gof
lrange booklist

從右首添加 rpush key values

  • 彈出元素

從左首刪除 lpop key
從右首刪除 rpop key

  • 列表個(gè)數(shù)
    llen key

  • 列表子集
    lrange key start stop

lrange booklist 0, 2

  • 列表元素
    lindex key index
    lset key index value

集合

  • 添加元素
    sadd key members

  • 刪除元素
    srem key members

  • 列表元素
    smembers key

  • 查詢?cè)厥欠翊嬖?br> smember key member

  • 集合間運(yùn)算
    sdiff keys
    sinter keys
    sunion keys

有序集合

高級(jí)功能

事務(wù)

要么都執(zhí)行, 要么都不執(zhí)行

multi
commands...
exec

Watch

Sort

TTL

隊(duì)列Queue

生產(chǎn)者使用 rpush 來生產(chǎn)數(shù)據(jù)
消費(fèi)者使用 lpop 來消費(fèi)數(shù)據(jù)

  • Producer lpush
  • Cusumer roop

優(yōu)先級(jí)隊(duì)列

blpop
lpush

發(fā)布/訂閱 Pub/Sub

發(fā)布及訂閱一個(gè)頻道, 只是消息的一個(gè)分派, 如果無(wú)人訂閱這個(gè)頻道, 這條數(shù)據(jù)也不會(huì)保存

publish channel message
subscribe channels
unsubscribe channels

Redis 事務(wù)

事務(wù)開始 multi
后續(xù)操作都會(huì)入隊(duì)
執(zhí)行事務(wù) exec
取消/回滾事務(wù) discard

持久化

RDB 方式

根據(jù)時(shí)間和改動(dòng)的次數(shù)存儲(chǔ)內(nèi)存中的快照到磁盤中去

AOF 方式

AOF - Append Only File

appendonly yes

復(fù)制

主從方式 master-slave, 通過 TCP 連接將數(shù)據(jù)從master同步到slave

  • master 可讀可寫, 自動(dòng)將數(shù)據(jù)變化同步給slave
  • slave 只讀, 接收master 同步過來的數(shù)據(jù)

![Uploading image_933626.png . . .]

配置方式

vi redis.conf

slaveof master_ip_port

安全

requirepass xxx

通信協(xié)議

統(tǒng)一請(qǐng)求協(xié)議 unified request protocol

簡(jiǎn)單協(xié)議

Redis Cluster

工具

  • phpRedisAdmin
    類似于phpMyAdmin

客戶端庫(kù)

列舉一些我懂的語(yǔ)言寫的客戶端庫(kù) C/C++, Java, PHP and Node,

Ruby 和 Go 準(zhǔn)備今年先入個(gè)門

Language Library
C hiredis
java Jedis
Node node_redis
Python redis-py
PHP phpredis
Ruby redis-rb
Go Radix

附錄

Java Client Jedis 使用

  • maven configuration
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.8.0</version>
    <type>jar</type>
    <scope>compile</scope>
</dependency>    
  • 代碼片斷
Jedis jedis = null;
try {
  jedis = pool.getResource();
  /// ... do stuff here ... for example
  jedis.set("foo", "bar");
  String foobar = jedis.get("foo");
  jedis.zadd("sose", 0, "car"); jedis.zadd("sose", 0, "bike"); 
  Set<String> sose = jedis.zrange("sose", 0, -1);
} finally {
  if (jedis != null) {
    jedis.close();
  }
}
/// ... when closing your application:
pool.destroy();

Java 代碼 BasicRedisClient

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

public class BasicRedisClient {
    protected final Logger LOG = LoggerFactory.getLogger(getClass());
    private final JedisPool jedisPool;

    public BasicRedisClient(JedisPool jPool) {
        this.jedisPool = jPool;
    }

    public void setValue(String key, String value, int ttl) {
        Jedis jedis = jedisPool.getResource();
        try {
            jedis.set(key, value);
            jedis.expire(key, ttl);
        } catch (Exception e) {
            LOG.warn("Failed to set value in redis: ", e.getStackTrace()[0]);
        } finally {
            jedisPool.returnResource(jedis);
        }

    }

    public String getValue(String key) {
        String rValue = null;
        Jedis jedis = jedisPool.getResource();
        try {
            rValue = jedis.get(key);
        } catch (Exception e) {
            LOG.warn("Failed to get value in redis: ", e.getStackTrace()[0]);
        } finally {
            jedisPool.returnResource(jedis);
        }
        return rValue;
    }

    public boolean removeValue(String key) {
        boolean rValue = false;
        Jedis jedis = jedisPool.getResource();
        try {
            rValue = (jedis.del(key) > 0);
        } catch (Exception e) {
            LOG.warn("Failed to remove value in redis: ", e.getStackTrace()[0]);
        } finally {
            jedisPool.returnResource(jedis);
        }
        return rValue;
    }
}

參考資料

書籍

還有兩本沒看

鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末斩熊,一起剝皮案震驚了整個(gè)濱河市沈贝,隨后出現(xiàn)的幾起案子摇肌,更是在濱河造成了極大的恐慌罩句,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件智政,死亡現(xiàn)場(chǎng)離奇詭異只磷,居然都是意外死亡简软,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門碟摆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晃财,“玉大人,你說我怎么就攤上這事典蜕《鲜ⅲ” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵愉舔,是天一觀的道長(zhǎng)钢猛。 經(jīng)常有香客問我,道長(zhǎng)轩缤,這世上最難降的妖魔是什么命迈? 我笑而不...
    開封第一講書人閱讀 59,854評(píng)論 1 299
  • 正文 為了忘掉前任贩绕,我火速辦了婚禮,結(jié)果婚禮上壶愤,老公的妹妹穿的比我還像新娘丧叽。我一直安慰自己,他們只是感情好公你,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,871評(píng)論 6 398
  • 文/花漫 我一把揭開白布踊淳。 她就那樣靜靜地躺著,像睡著了一般陕靠。 火紅的嫁衣襯著肌膚如雪迂尝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評(píng)論 1 311
  • 那天剪芥,我揣著相機(jī)與錄音垄开,去河邊找鬼。 笑死税肪,一個(gè)胖子當(dāng)著我的面吹牛溉躲,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播益兄,決...
    沈念sama閱讀 40,999評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼锻梳,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了净捅?” 一聲冷哼從身側(cè)響起疑枯,我...
    開封第一講書人閱讀 39,914評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蛔六,沒想到半個(gè)月后荆永,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡国章,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,543評(píng)論 3 342
  • 正文 我和宋清朗相戀三年具钥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片液兽。...
    茶點(diǎn)故事閱讀 40,675評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡骂删,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出抵碟,到底是詐尸還是另有隱情桃漾,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評(píng)論 5 351
  • 正文 年R本政府宣布拟逮,位于F島的核電站撬统,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏敦迄。R本人自食惡果不足惜恋追,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,029評(píng)論 3 335
  • 文/蒙蒙 一凭迹、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧苦囱,春花似錦嗅绸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至羹铅,卻和暖如春蚀狰,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背职员。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工麻蹋, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人焊切。 一個(gè)月前我還...
    沈念sama閱讀 49,091評(píng)論 3 378
  • 正文 我出身青樓扮授,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親专肪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子刹勃,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,685評(píng)論 2 360

推薦閱讀更多精彩內(nèi)容