天天看點

Redis 學習筆記

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

Redis 學習筆記

當有新消息通過PUBLISH發送給channel1時,這時候channel1就會把消息同時釋出給訂閱者

Redis 學習筆記

建立訂閱頻道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"      

熬夜不易,點選請老王喝杯烈酒!!!!!!!