原文地址:http://www.cnblogs.com/kaituorensheng/p/5244347.htmlhtml
閱讀目錄java
回到頂部python
Redis是一個開源的使用C語言編寫、開源、支持網絡、可基於內存亦可持久化的日誌型、高性能的Key-Value數據庫,並提供多種語言的API。c++
它一般被稱爲數據結構服務器,由於值(value)能夠是 字符串(String)、哈希(Map)、 列表(list)、集合(sets) 和 有序集合(sorted sets)等類型。redis
Redis 與其餘 key - value 緩存產品有如下三個特色:算法
Redis優點mongodb
回到頂部數據庫
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
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 timestamp EXPIREAT 的做用和 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 所儲存的值的類型。 |
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
4.1 String(字符串)
例子
127.0.0.1:6379> set var "String type" OK 127.0.0.1:6379> get var "String type"
說明:利用set給變量var賦值「String type」;利用get得到變量var的值
4.2 Hash(哈希)
hset,hget例子
127.0.0.1:6379> hget set1 name "jihite" 127.0.0.1:6379> hget set1 score "100" 127.0.0.1:6379> hset set2 name jihite2 (integer) 1 127.0.0.1:6379> hset set2 score 110 (integer) 1 127.0.0.1:6379> hget set1 name "jihite"
hset&hget一次只能往哈希結構裏面插入一個鍵值對,若是插入多個能夠用hmset&hmget
hmset, hmget例子
127.0.0.1:6379> HMSET var:1 name jihite school pku OK 127.0.0.1:6379> HGETALL var:1 1) "name" 2) "jihite" 3) "school" 4) "pku"
說明
var:1是鍵值,每一個 hash 能夠存儲 232 - 1 鍵值對(40多億)
HMSET用於創建hash對象,HGETALL用於獲取hash對象
hset v.s. hmset操做對比
127.0.0.1:6379> hset set5 name1 jihite1 name2 jihite2 name3 jihite3 (error) ERR wrong number of arguments for 'hset' command 127.0.0.1:6379> hmset set5 name1 jihite1 name2 jihite2 name3 jihite3 OK 127.0.0.1:6379> hget set5 name1 "jihite1" 127.0.0.1:6379> hmget set5 name1 1) "jihite1" 127.0.0.1:6379> hmget set5 name1 name2 1) "jihite1" 2) "jihite2" 127.0.0.1:6379> hget set5 name1 name2 (error) ERR wrong number of arguments for 'hget' command
4.3 LIST(列表)
例子
127.0.0.1:6379> lpush lvar 1 (integer) 1 127.0.0.1:6379> lpush lvar a (integer) 2 127.0.0.1:6379> lpush lvar ab (integer) 3 127.0.0.1:6379> lrange lvar 0 1 1) "ab" 2) "a" 127.0.0.1:6379> lrange lvar 0 10 1) "ab" 2) "a" 3) "1" 127.0.0.1:6379> lrange lvar 2 2 1) "1"
說明
lpush往列表的前邊插入;lrange後面的數字是範圍(閉區間)
列表最多可存儲 232 - 1 元素 (4294967295, 每一個列表可存儲40多億)。
4.4 Set(集合)
Redis的Set是string類型的無序集合。
集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)
例子
127.0.0.1:6379> sadd setvar redis (integer) 1 127.0.0.1:6379> sadd setvar mongodb (integer) 1 127.0.0.1:6379> sadd setvar mongodb (integer) 0 127.0.0.1:6379> sadd setvar rabbitmq (integer) 1 127.0.0.1:6379> smembers setvar 1) "rabbitmq" 2) "redis" 3) "mongodb"
說明
set往集合中插入元素,smembers列舉出集合中的元素
成功插入返回1;錯誤插入返回0,例子中mongodb第二次插入時,因已經存在,故插入失敗。
4.5 zset(sorted sete:有序集合)
zset和set同樣也是String類型的集合,且不容許元素重複
zset和set不一樣的地方在於zset關聯一個double類型的分數,redis經過分數對集合中的元素排序
zset的元素是惟一的,可是分數是能夠重複的
例子
127.0.0.1:6379> zadd zvar 1 redis (integer) 1 127.0.0.1:6379> zadd zvar 1 redis (integer) 0 127.0.0.1:6379> zadd zvar 2 redis (integer) 0 127.0.0.1:6379> 127.0.0.1:6379> zadd zvar 2 mongo (integer) 1 127.0.0.1:6379> zadd zvar 0 rabbitmq (integer) 1 127.0.0.1:6379> 127.0.0.1:6379> ZRANGEBYSCORE zvar 0 1000 1) "rabbitmq" 2) "mongo" 3) "redis" 127.0.0.1:6379> 127.0.0.1:6379> 127.0.0.1:6379> zadd zvar -2 celery (integer) 1 127.0.0.1:6379> ZRANGEBYSCORE zvar 0 1000 1) "rabbitmq" 2) "mongo" 3) "redis" 127.0.0.1:6379> ZRANGEBYSCORE zvar -3 1000 1) "celery" 2) "rabbitmq" 3) "mongo" 4) "redis"
說明
成功插入返回1,不然返回0。插入已存在元素失敗--返回0
分數爲float(可正、負、0)
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
說明:
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"
事務是一個單獨的操做集合,事務中的命令有順序,是一個原子操做(事務中的命令要麼所有執行,要麼所有不執行),執行一個事務中的命令時不會被其餘命令打斷。
一個事務從開始到結束通過如下三個階段:
例子
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結束
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"
數據備份
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的安裝目錄便可。
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"