1 Redis優勢
- 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
- 豐富的資料類型 – Redis支援二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 資料類型操作。
- 原子 – Redis的所有操作都是原子性的,同時Redis還支援對幾個操作全并後的原子性執行。
- 豐富的特性 – Redis還支援 publish/subscribe, 通知, key 過期等等特性。
2.1 安裝redis
下載下傳redis安裝包(如: redis-2.8.17.tar.gz )
tar -zxvf redis-2.8.17.tar.gz
cd redis-2.8.17
make
sudo make install
2.2 背景啟動服務端
nohup redis-server &
注 :redis-server預設啟動端口是6379,沒有密碼
如果不使用預設配置檔案,啟動時可以加上配置檔案
nohup redis-server ~/soft/redis-2.8.17/redis.conf &
2.3 啟動用戶端、驗證
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set var "hello world"
OK
127.0.0.1:6379> get var
"hello world"
2.4 退出
關閉redis-server
redis-cli shutdown
例子
$ps -ef | grep redis
root 23422 19813 0 10:59 pts/5 00:00:08 redis-server *:6379
$sudo redis-cli shutdown
[23422] 05 Mar 12:11:29.301 # User requested shutdown...
[23422] 05 Mar 12:11:29.301 * Saving the final RDB snapshot before exiting.
[23422] 05 Mar 12:11:29.314 * DB saved on disk
[23422] 05 Mar 12:11:29.314 # Redis is now ready to exit, bye bye...
[1]+ Done sudo redis-server (wd: ~/soft/redis-2.10.3)
(wd now: ~/soft/redis-2.8.17)
$ps -ef | grep redis
wzh94434 30563 19813 0 12:11 pts/5 00:00:00 grep redis
注 :如果設定上 密碼 後,單純的redis-cli是關不掉的,必須加上ip、port、passwd
sudo redis-cli -h host -p port -a passwd shutdown
退出用戶端
localhost:6379> QUIT
2.5 設立密碼
打開redis.conf找到requirepass,去掉預設,修改
requirepass yourpassword
驗證密碼的正确性
localhost:6379> auth jihite
OK
2.6 遠端連接配接
需要已經安裝redis,可以使用redis-cli指令
redis-cli -h host -p port -a password
2.7 檢視redis-server統計資訊
INFO
3. Reis key
Redis是key-value的資料庫,Redis的鍵用于管理Redis的鍵,基本文法是
COMMAND KEY_NAME
例子:
localhost:6379> SET var redis
OK
localhost:6379> GET var
"redis"
localhost:6379> DEL var
(integer) 1
localhost:6379> GET var
(nil)
注 :redis指令不區分大小寫,是以get var和GET var是等價的
序号 | Redis keys指令及描述 |
---|---|
1 | DEL key該指令用于在 key 存在是删除 key。 |
2 | DUMP key序列化給定 key ,并傳回被序列化的值。 |
3 | EXISTS key檢查給定 key 是否存在。 |
4 | EXPIRE key seconds為給定 key 設定過期時間。 |
5 | EXPIREAT key timestampEXPIREAT 的作用和 EXPIRE 類似,都用于為 key 設定過期時間。 不同在于 EXPIREAT 指令接受的時間參數是 UNIX 時間戳(unix timestamp)。 |
6 | PEXPIRE key milliseconds設定 key 的過期時間億以毫秒計。 |
7 | PEXPIREAT key milliseconds-timestamp設定 key 過期時間的時間戳(unix timestamp) 以毫秒計 |
8 | KEYS pattern查找所有符合給定模式( pattern)的 key 。例如keys * 傳回所有的key |
9 | MOVE key db将目前資料庫的 key 移動到給定的資料庫 db 當中。 |
10 | PERSIST key移除 key 的過期時間,key 将持久保持。 |
11 | PTTL key以毫秒為機關傳回 key 的剩餘的過期時間。 |
12 | TTL key以秒為機關,傳回給定 key 的剩餘生存時間(TTL, time to live)。 |
13 | RANDOMKEY從目前資料庫中随機傳回一個 key 。 |
14 | RENAME key newkey修改 key 的名稱 |
15 | RENAMENX key newkey僅當 newkey 不存在時,将 key 改名為 newkey 。 |
16 | TYPE key傳回 key 所儲存的值的類型。 |
4. Redis資料類型
Redis支援五種資料類型:string(字元串),hash(哈希),list(清單),set(集合)及zset(sorted set:有序集合)。
4.1 String(字元串)
- 是Redis最基本的資料類型,可以了解成與Memcached一模一樣的類型,一個key對應一個value
- 二進制安全的。意思是redis的string可以包含任何資料。比如jpg圖檔或者序列化的對象
- 一個鍵最大能存儲 512MB
set myredis 'kmonkeywyl'
get myredis
說明:利用set給變量var指派“String type”;利用get獲得變量var的值
4.2 Hash(哈希)
- 是一個鍵值對集合
- 是一個string類型的field和value的映射表,hash特别适合用于存儲對象
//建立哈希,并指派
HMSET user:001 username wylpassword 111 age 34
OK
//列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "wyl"
3) "password"
4) "111"
5) "age"
6) "34"
//更改哈希中的某一個值
HSET user:001 password 12345
(integer) 0
//再次列出哈希的内容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "wyl"
3) "password"
4) "12345"
5) "age"
6) "34"
說明
var:1是鍵值,每個 hash 可以存儲 2 32 - 1 鍵值對(40多億)
HMSET用于建立hash對象,HGETALL用于擷取hash對象
4.3 LIST(清單)
//建立一個list叫做mylist,并在清單頭部插入元素"1"
lpush mylist "1"
//在mylist右側插入元素"2"
rpush mylist "2"
//在mylist左側插入元素"0"
lpush mylist "0"
//列出mylist中從編号0到編号1的元素
lrange mylist 0 1
//列出mylist中從編号0到倒數第一個元素
lrange mylist 0 -1
lpush往清單的前邊插入;lrange後面的數字是範圍(閉區間)
redis中的lists在底層實作上并不是數組,而是連結清單.是以插入資料快,但定位性能操作較差。
lists的常用操作包括lpush、rpush、lpush,lrange等
清單最多可存儲 2 32 - 1 元素 (4294967295, 每個清單可存儲40多億)。
4.4 Set(集合)
Redis的Set是string類型的無序集合。
集合是通過哈希表實作的,是以添加,删除,查找的複雜度都是O(1)
//向集合myset中加入新元素"wyl"
sadd myset "wyl"
(integer) 1
sadd myset "kmonkey"
(integer) 1
//列出集合myset中的所有元素
smembers myset
1) "wyl"
2) "kmonkey"
//判斷元素1是否在集合myset中,傳回1表示存在
sismember myset "wyl"
(integer) 1
//判斷元素是否在集合myset中,傳回0表示不存在
sismember myset "wangyanling"
(integer) 0
//建立一個新的集合yourset
sadd yourset "1"
(integer) 1
sadd yourset "2"
(integer) 1
smembers yourset
1) "1"
2) "2"
//對兩個集合求并集
sunion myset yourset
1) "1"
2) "wyl"
3) "2"
4) "kmonkey"
set往集合中插入元素,smembers列舉出集合中的元素
成功插入傳回1;錯誤插入傳回0,例子中mongodb第二次插入時,因已經存在,故插入失敗。
4.5 zset(sorted sete:有序集合)
zset和set一樣也是String類型的集合,且不允許元素重複
zset和set不同的地方在于zset關聯一個double類型的分數,redis通過分數對集合中的元素排序
zset的元素是唯一的,但是分數是可以重複的
zadd myzset 1 baidu.com
(integer) 1
//向myzset中新增一個元素360.com,賦予它的序号是3
zadd myzset 3 360.com
(integer) 1
//向myzset中新增一個元素google.com,賦予它的序号是2
zadd myzset 2 google.com
(integer) 1
//列出myzset的所有元素,同時列出其序号,可以看出myzset已經是有序的了。
zrange myzset 0 -1 with scores
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
//隻列出myzset的元素
zrange myzset 0 -1
1) "baidu.com"
2) "google.com"
3) "360.com"
說明
成功插入傳回1,否則傳回0。插入已存在元素失敗--傳回0
分數為float(可正、負、0)
5. Redis HyperLogLog
Redis HyperLogLog是用來做基數統計的算法。優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、并且是很小的。
在 Redis 裡面,每個 HyperLogLog 鍵隻需要花費 12 KB 記憶體,就可以計算接近 2^64 個不同元素的基 數。這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比。
注 :因為HyperLogLog隻會根據輸入元素來計算基數,而不會存儲輸入元素本身,是以不會傳回輸入的各個元素。
基數是什麼? 對于["abc", "abc", "2", "3"],基數是["abc", "2", "3"],個數是3.
localhost:6379> pfadd jsh redis
(integer) 1
localhost:6379> pfadd jsh redis
(integer) 0
localhost:6379> pfadd jsh mongodb
(integer) 1
localhost:6379> pfadd jsh rabbitmq
(integer) 1
localhost:6379> pfcount jsh
(integer) 3
localhost:6379> pfadd jsh2 redis
(integer) 1
localhost:6379> pfadd jsh2 a
(integer) 1
localhost:6379> pfcount jsh2
(integer) 2
localhost:6379> pfmerge jsh jsh2
OK
localhost:6379> pfcount jsh
(integer) 4
localhost:6379> pfcount jsh2
(integer) 2
說明:
- pfadd key ele [ele2 ...]:添加指定元素到HyperLogLog中,
- pfcount key: 傳回給定HyperLogLog的基數估算值
- pfmerge destkey srckey [srckey2....]:講多個HyperLogLog合并到一個第一個HyperLogLog中
6. Redis 釋出訂閱
Redis 釋出訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis 用戶端可以訂閱任意數量的頻道。
原理:下圖展示了三個用戶端client1, client2, client5訂閱了頻道channel1

當有新消息通過PUBLISH發送給channel1時,這時候channel1就會把消息同時釋出給訂閱者
建立訂閱頻道redisChat
localhost:6379> subscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "redisChat"
3) (integer) 1
打開幾個用戶端,訂閱channel redisChat
localhost:6379> psubscribe redisChat
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "redisChat"
3) (integer) 1
然後給channel redisChat發送消息“Hello World”
localhost:6379> publish redisChat "Hello World"
(integer) 1
用戶端會收到消息
Reading messages... (press Ctrl-C to quit)
1) "pmessage"
2) "redisChat"
3) "redisChat"
4) "Hello World"
7. Redis事務
事務是一個單獨的操作集合,事務中的指令有順序,是一個原子操作(事務中的指令要麼全部執行,要麼全部不執行),執行一個事務中的指令時不會被其他指令打斷。
一個事務從開始到結束經過以下三個階段:
- 開始事務
- 指令入隊
- 執行事務
localhost:6379> MULTI
OK
localhost:6379> set name jihite
QUEUED
localhost:6379> get name
QUEUED
localhost:6379> sadd language "c++" "python" "java"
QUEUED
localhost:6379> smembers language
QUEUED
localhost:6379> exec
1) OK
2) "jihite"
3) (integer) 3
4) 1) "java"
2) "python"
3) "c++"
說明:事務以MULTI開始,以EXEC結束
8. Redis腳本
Redis 腳本使用 Lua 解釋器來執行腳本。執行腳本的常用指令為 EVAL 。基本文法
EVAL script numkeys key [key ...] arg [arg ...]
例子
localhost:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
1) "key1"
2) "key2"
3) "first"
4) "second"
9. 資料備份與恢複
資料備份
localhost:6379> save
OK
改指令會在redis的安裝目錄中建立檔案dump.rdb,并把資料儲存在該檔案中。
檢視redis的安裝目錄
localhost:6379> config get dir
1) "dir"
2) "/home/jihite/soft/redis-2.8.17"
資料恢複
隻需将備份檔案dump.rdb拷貝到redis的安裝目錄即可。
10. 資料庫操作
Redis中,一共有16個資料庫,分别是0~15,一般情況下,進入資料庫預設編号是0,如果我們要進入指定資料庫,可以用select語句
切換到編号為3的資料庫
localhost:6379> select 3
OK
localhost:6379[3]>
檢視資料庫中所有的鍵值
localhost:6379[1]> set a 1
OK
localhost:6379[1]> set b 2
OK
localhost:6379[1]> keys *
1) "b"
2) "a"
傳回目前資料庫中所有key的數目: dbsize
删除目前資料庫中的所有key: flushdb
清空所有資料庫中的所有key: flushall
把目前資料庫中的key轉移到指定資料庫:move a aim_db,例:
localhost:6379[1]> set z sss
OK
localhost:6379[1]> move z 0
(integer) 1
localhost:6379[1]> select 0
OK
localhost:6379> get z
"sss"
熬夜不易,點選請老王喝杯烈酒!!!!!!!