您好,登錄后才能下訂單哦!
這篇文章給大家分享的是有關Redis怎么使用的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
一、Redis簡介
什么是Redis?全稱:REmote DIctionary Server,是可支持網絡、可基于內存亦可持久化的日志型、Key-Value高性能數據庫,并提供多種語言的API,它通常被稱為數據結構服務器,因為值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型:
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合
是相對于關系型數據庫來說的非關系型數據庫。
二、優勢優點
Redis 與其他 key - value 緩存產品有以下三個特點:
Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
Redis支持數據的備份,即master-slave模式的數據備份。
三、Redis安裝
Redis安裝很簡單,下載地址:https://github.com/MSOpenTech/redis/releases。然后下載“Redis-x64-xx.x.xxx.zip”放入硬盤自己喜歡的位置解壓出來即可,雙擊“redis-server.exe”則按照默認配置啟動Redis服務了;雙擊“redis-cli.exe”打開客戶端控制臺可以進行命令操作Redis服務了。
也可:
打開一個 cmd 窗口 使用cd命令切換目錄到 C:\redis 運行 redis-server.exe redis.windows.conf 。
執行redis-cli.exe -h 127.0.0.1 -p 6379 進入到客戶端模式 ,
“-h” 指定Redis服務器主機
“-p” 指定Redis服務器端口
四、Redis配置
Redis 的配置文件位于 Redis 安裝目錄下,文件名為 redis.conf。
你可以通過 **“CONFIG ”**命令查看或設置配置項。
CONFIG GET 'CONFIG_SETTING_NAME' //獲取對應的參數配置 CONFIG GET * //獲取所有的參數配置
CONFIG SET "CONFIG_SETTING_NAME" "NEW_CONFIG_VALUE"//設置對應的參數值
參數說明
redis.conf 配置項說明如下:
1.Redis默認不是以守護進程的方式運行,可以通過該配置項修改,使用yes啟用守護進程
daemonize no
2.當Redis以守護進程方式運行時,Redis默認會把pid寫入/var/run/redis.pid文件,可以通過pidfile指定
pidfile /var/run/redis.pid
3.指定Redis監聽端口,默認端口為6379,作者在自己的一篇博文中解釋了為什么選用6379作為默認端口,因為6379在手機按鍵上MERZ對應的號碼,而MERZ取自意大利歌女Alessia Merz的名字
port 6379
4.綁定的主機地址
bind 127.0.0.1
5.當 客戶端閑置多長時間后關閉連接,如果指定為0,表示關閉該功能
timeout 300
6.指定日志記錄級別,Redis總共支持四個級別:debug、verbose、notice、warning,默認為verbose
loglevel verbose
7.日志記錄方式,默認為標準輸出,如果配置Redis為守護進程方式運行,而這里又配置為日志記錄方式為標準輸出,則日志將會發送給/dev/null
logfile stdout
8.設置數據庫的數量,默認數據庫為0,可以使用SELECT 命令在連接上指定數據庫id
databases 16
9.指定在多長時間內,有多少次更新操作,就將數據同步到數據文件,可以多個條件配合
save <seconds> <changes>
Redis默認配置文件中提供了三個條件:
save 900 1 save 300 10 save 60 10000
分別表示900秒(15分鐘)內有1個更改,300秒(5分鐘)內有10個更改以及60秒內有10000個更改。
10.指定存儲至本地數據庫時是否壓縮數據,默認為yes,Redis采用LZF壓縮,如果為了節省CPU時間,可以關閉該選項,但會導致數據庫文件變的巨大
rdbcompression yes
11.指定本地數據庫文件名,默認值為dump.rdb
dbfilename dump.rdb
12.指定本地數據庫存放目錄
dir ./
13.設置當本機為slav服務時,設置master服務的IP地址及端口,在Redis啟動時,它會自動從master進行數據同步
slaveof <masterip> <masterport>
14.當master服務設置了密碼保護時,slav服務連接master的密碼
masterauth <master-password>
15.設置Redis連接密碼,如果配置了連接密碼,客戶端在連接Redis時需要通過AUTH 命令提供密碼,默認關閉
requirepass foobared
16.設置同一時間最大客戶端連接數,默認無限制,Redis可以同時打開的客戶端連接數為Redis進程可以打開的最大文件描述符數,如果設置 maxclients 0,表示不作限制。當客戶端連接數到達限制時,Redis會關閉新的連接并向客戶端返回max number of clients reached錯誤信息
maxclients 128
17.指定Redis最大內存限制,Redis在啟動時會把數據加載到內存中,達到最大內存后,Redis會先嘗試清除已到期或即將到期的Key,當此方法處理 后,仍然到達最大內存設置,將無法再進行寫入操作,但仍然可以進行讀取操作。Redis新的vm機制,會把Key存放內存,Value會存放在swap區
maxmemory <bytes>
18.指定是否在每次更新操作后進行日志記錄,Redis在默認情況下是異步的把數據寫入磁盤,如果不開啟,可能會在斷電時導致一段時間內的數據丟失。因為 redis本身同步數據文件是按上面save條件來同步的,所以有的數據會在一段時間內只存在于內存中。默認為no
appendonly no
19.指定更新日志文件名,默認為appendonly.aof
appendfilename appendonly.aof
20.指定更新日志條件,共有3個可選值:
no:表示等操作系統進行數據緩存同步到磁盤(快)
always:表示每次更新操作后手動調用fsync()將數據寫到磁盤(慢,安全)
everysec:表示每秒同步一次(折衷,默認值)
appendfsync everysec
21.指定是否啟用虛擬內存機制,默認值為no,簡單的介紹一下,VM機制將數據分頁存放,由Redis將訪問量較少的頁即冷數據swap到磁盤上,訪問多的頁面由磁盤自動換出到內存中(在后面的文章我會仔細分析Redis的VM機制)
vm-enabled no
22.虛擬內存文件路徑,默認值為/tmp/redis.swap,不可多個Redis實例共享
vm-swap-file /tmp/redis.swap
23.將所有大于vm-max-memory的數據存入虛擬內存,無論vm-max-memory設置多小,所有索引數據都是內存存儲的(Redis的索引數據 就是keys),也就是說,當vm-max-memory設置為0的時候,其實是所有value都存在于磁盤。默認值為0
vm-max-memory 0
24.Redis swap文件分成了很多的page,一個對象可以保存在多個page上面,但一個page上不能被多個對象共享,vm-page-size是要根據存儲的 數據大小來設定的,作者建議如果存儲很多小對象,page大小最好設置為32或者64bytes;如果存儲很大大對象,則可以使用更大的page,如果不 確定,就使用默認值
vm-page-size 32
25.設置swap文件中的page數量,由于頁表(一種表示頁面空閑或使用的bitmap)是在放在內存中的,,在磁盤上每8個pages將消耗1byte的內存。
vm-pages 134217728
26.設置訪問swap文件的線程數,最好不要超過機器的核數,如果設置為0,那么所有對swap文件的操作都是串行的,可能會造成比較長時間的延遲。默認值為4
vm-max-threads 4
27.設置在向客戶端應答時,是否把較小的包合并為一個包發送,默認為開啟
glueoutputbuf yes
28.指定在超過一定的數量或者最大的元素超過某一臨界值時,采用一種特殊的哈希算法
hash-max-zipmap-entries 64 hash-max-zipmap-value 512
29.指定是否激活重置哈希,默認為開啟(后面在介紹Redis的哈希算法時具體介紹)
activerehashing yes
30.指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件
include /path/to/local.conf
五、Redis 數據類型
String: 字符串
Hash: 散列
List: 列表
Set: 集合
Sorted Set: 有序集合
1.String(字符串)
string是redis最基本的類型,你可以理解成與Memcached一模一樣的類型,一個key對應一個value。
string類型是二進制安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象 。
string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。
redis 127.0.0.1:6379> SET name "xlosy" OK redis 127.0.0.1:6379> GET name "xlosy"
在以上實例中我們使用了 Redis 的 SET 和 GET 命令。鍵為 name,對應的值為 xlosy。
2.Hash(哈希)
Redis hash 是一個鍵值(key=>value)對集合。
Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用于存儲對象。
redis> HMSET myhash field1 "Hello" field2 "World" "OK" redis> HGET myhash field1 "Hello" redis> HGET myhash field2 "World"
實例中我們使用了 Redis HMSET, HGET 命令,HMSET 設置了兩個 field=>value 對, HGET 獲取對應 field 對應的 value。
3.List(列表)
Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
redis 127.0.0.1:6379> lpush xlosy redis (integer) 1 redis 127.0.0.1:6379> lpush xlosy mongodb (integer) 2 redis 127.0.0.1:6379> lpush xlosy rabitmq (integer) 3 redis 127.0.0.1:6379> lrange xlosy 0 10 1) "rabitmq" 2) "mongodb" 3) "redis"
列表最多可存儲 232 - 1 元素 (4294967295, 每個列表可存儲40多億)。
4.Set(集合)
Redis的Set是string類型的無序集合。
集合是通過哈希表實現的,所以添加,刪除,查找的復雜度都是O(1)。
redis 127.0.0.1:6379> sadd xlosy redis (integer) 1 redis 127.0.0.1:6379> sadd xlosy mongodb (integer) 1 redis 127.0.0.1:6379> sadd xlosy rabitmq (integer) 1 redis 127.0.0.1:6379> sadd xlosy rabitmq (integer) 0 redis 127.0.0.1:6379> smembers xlosy 1) "redis" 2) "rabitmq" 3) "mongodb"
注意:以上實例中 rabitmq 添加了兩次,但根據集合內元素的唯一性,第二次插入的元素將被忽略。
集合中最大的成員數為 232 - 1(4294967295, 每個集合可存儲40多億個成員)。
5.zset(sorted set:有序集合)
Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復的成員。
不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。
zset的成員是唯一的,但分數(score)卻可以重復。
redis 127.0.0.1:6379> zadd xlosy 0 redis (integer) 1 redis 127.0.0.1:6379> zadd xlosy 0 mongodb (integer) 1 redis 127.0.0.1:6379> zadd xlosy 0 rabitmq (integer) 1 redis 127.0.0.1:6379> zadd xlosy 0 rabitmq (integer) 0 redis 127.0.0.1:6379> > ZRANGEBYSCORE xlosy 0 1000 1) "mongodb" 2) "rabitmq" 3) "redis"
六、Redis命令
Ping:命令驗證服務是否啟動
$redis-cli -h 127.0.0.1 -p 6379 -a "mypass"//“-h”是主機地址,“-p”是主機端口,“-a”是主機密碼 redis 127.0.0.1:6379> PING PONG
如果執行ping命令后輸出pong則表示Redis服務器運行正常。
**1).Redis對鍵(key)操作的命令 **
SET: 添加鍵值
redis 127.0.0.1:6379> SET xlosykey redis OK
DEL:刪除已經存在的鍵值
redis 127.0.0.1:6379> DEL xlosykey (integer) 1
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 。
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 所儲存的值的類型。
更多命令請參考:https://redis.io/commands
2).Redis對字符串(String)操作的命令
redis 127.0.0.1:6379> SET xlosykey redis OK redis 127.0.0.1:6379> GET xlosykey "redis"
1 SET key value
設置指定 key 的值
2 GET key
獲取指定 key 的值。
3 GETRANGE key start end
返回 key 中字符串值的子字符
4 GETSET key value
將給定 key 的值設為 value ,并返回 key 的舊值(old value)。
5 GETBIT key offset
對 key 所儲存的字符串值,獲取指定偏移量上的位(bit)。
6 MGET key1 [key2…]
獲取所有(一個或多個)給定 key 的值。
7 SETBIT key offset value
對 key 所儲存的字符串值,設置或清除指定偏移量上的位(bit)。
8 SETEX key seconds value
將值 value 關聯到 key ,并將 key 的過期時間設為 seconds (以秒為單位)。
9 SETNX key value
只有在 key 不存在時設置 key 的值。
10 SETRANGE key offset value
用 value 參數覆寫給定 key 所儲存的字符串值,從偏移量 offset 開始。
11 STRLEN key
返回 key 所儲存的字符串值的長度。
12 MSET key value [key value …]
同時設置一個或多個 key-value 對。
13 MSETNX key value [key value …]
同時設置一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
14 PSETEX key milliseconds value
這個命令和 SETEX 命令相似,但它以毫秒為單位設置 key 的生存時間,而不是像 SETEX 命令那樣,以秒為單位。
15 INCR key
將 key 中儲存的數字值增一。
16 INCRBY key increment
將 key 所儲存的值加上給定的增量值(increment) 。
17 INCRBYFLOAT key increment
將 key 所儲存的值加上給定的浮點增量值(increment) 。
18 DECR key
將 key 中儲存的數字值減一。
19 DECRBY key decrement
key 所儲存的值減去給定的減量值(decrement) 。
20 APPEND key value
如果 key 已經存在并且是一個字符串, APPEND 命令將指定的 value 追加到該 key 原來值(value)的末尾。
更多命令請參考:https://redis.io/commands
3).Redis對哈希(Hash)操作的命令
127.0.0.1:6379> HMSET xlosykey name "redis tutorial" description "redis basic commands for caching" likes 20 visitors 23000 OK 127.0.0.1:6379> HGETALL xlosykey 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000"
1 HDEL key field1 [field2]
刪除一個或多個哈希表字段
2 HEXISTS key field
查看哈希表 key 中,指定的字段是否存在。
3 HGET key field
獲取存儲在哈希表中指定字段的值。
4 HGETALL key
獲取在哈希表中指定 key 的所有字段和值
5 HINCRBY key field increment
為哈希表 key 中的指定字段的整數值加上增量 increment 。
6 HINCRBYFLOAT key field increment
為哈希表 key 中的指定字段的浮點數值加上增量 increment 。
7 HKEYS key
獲取所有哈希表中的字段
8 HLEN key
獲取哈希表中字段的數量
9 HMGET key field1 [field2]
獲取所有給定字段的值
10 HMSET key field1 value1 [field2 value2 ]
同時將多個 field-value (域-值)對設置到哈希表 key 中。
11 HSET key field value
將哈希表 key 中的字段 field 的值設為 value 。
12 HSETNX key field value
只有在字段 field 不存在時,設置哈希表字段的值。
13 HVALS key
獲取哈希表中所有值
14 HSCAN key cursor [MATCH pattern] [COUNT count]
迭代哈希表中的鍵值對。
更多命令請參考:https://redis.io/commands
4).Redis對列表(List)操作的命令
redis 127.0.0.1:6379> LPUSH xlosykey redis (integer) 1 redis 127.0.0.1:6379> LPUSH xlosykey mongodb (integer) 2 redis 127.0.0.1:6379> LPUSH xlosykey mysql (integer) 3 redis 127.0.0.1:6379> LRANGE xlosykey 0 10 1) "mysql" 2) "mongodb" 3) "redis"
1 BLPOP key1 [key2 ] timeout
移出并獲取列表的第一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
2 BRPOP key1 [key2 ] timeout
移出并獲取列表的最后一個元素, 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
3 BRPOPLPUSH source destination timeout
從列表中彈出一個值,將彈出的元素插入到另外一個列表中并返回它; 如果列表沒有元素會阻塞列表直到等待超時或發現可彈出元素為止。
4 LINDEX key index
通過索引獲取列表中的元素
5 LINSERT key BEFORE|AFTER pivot value
在列表的元素前或者后插入元素
6 LLEN key
獲取列表長度
7 LPOP key
移出并獲取列表的第一個元素
8 LPUSH key value1 [value2]
將一個或多個值插入到列表頭部
9 LPUSHX key value
將一個值插入到已存在的列表頭部
10 LRANGE key start stop
獲取列表指定范圍內的元素
11 LREM key count value
移除列表元素
12 LSET key index value
通過索引設置列表元素的值
13 LTRIM key start stop
對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間之內的元素都將被刪除。
14 RPOP key
移除并獲取列表最后一個元素
15 RPOPLPUSH source destination
移除列表的最后一個元素,并將該元素添加到另一個列表并返回
16 RPUSH key value1 [value2]
在列表中添加一個或多個值
17 RPUSHX key value
為已存在的列表添加值
5).Redis對集合(Set)操作的命令
redis 127.0.0.1:6379> SADD xlosykey redis (integer) 1 redis 127.0.0.1:6379> SADD xlosykey mongodb (integer) 1 redis 127.0.0.1:6379> SADD xlosykey mysql (integer) 1 redis 127.0.0.1:6379> SADD xlosykey mysql (integer) 0 redis 127.0.0.1:6379> SMEMBERS xlosykey 1) "mysql" 2) "mongodb" 3) "redis"
1 SADD key member1 [member2]
向集合添加一個或多個成員
2 SCARD key
獲取集合的成員數
3 SDIFF key1 [key2]
返回給定所有集合的差集
4 SDIFFSTORE destination key1 [key2]
返回給定所有集合的差集并存儲在 destination 中
5 SINTER key1 [key2]
返回給定所有集合的交集
6 SINTERSTORE destination key1 [key2]
返回給定所有集合的交集并存儲在 destination 中
7 SISMEMBER key member
判斷 member 元素是否是集合 key 的成員
8 SMEMBERS key
返回集合中的所有成員
9 SMOVE source destination member
將 member 元素從 source 集合移動到 destination 集合
10 SPOP key
移除并返回集合中的一個隨機元素
11 SRANDMEMBER key [count]
返回集合中一個或多個隨機數
12 SREM key member1 [member2]
移除集合中一個或多個成員
13 SUNION key1 [key2]
返回所有給定集合的并集
14 SUNIONSTORE destination key1 [key2]
所有給定集合的并集存儲在 destination 集合中
15 SSCAN key cursor [MATCH pattern] [COUNT count]
迭代集合中的元素
6).Redis對有序集合(sorted set)操作的命令
redis 127.0.0.1:6379> ZADD xlosykey 1 redis (integer) 1 redis 127.0.0.1:6379> ZADD xlosykey 2 mongodb (integer) 1 redis 127.0.0.1:6379> ZADD xlosykey 3 mysql (integer) 1 redis 127.0.0.1:6379> ZADD xlosykey 3 mysql (integer) 0 redis 127.0.0.1:6379> ZADD xlosykey 4 mysql (integer) 0 redis 127.0.0.1:6379> ZRANGE xlosykey 0 10 WITHSCORES 1) "redis" 2) "1" 3) "mongodb" 4) "2" 5) "mysql" 6) "4"
1 ZADD key score1 member1 [score2 member2]
向有序集合添加一個或多個成員,或者更新已存在成員的分數
2 ZCARD key
獲取有序集合的成員數
3 ZCOUNT key min max
計算在有序集合中指定區間分數的成員數
4 ZINCRBY key increment member
有序集合中對指定成員的分數加上增量 increment
5 ZINTERSTORE destination numkeys key [key …]
計算給定的一個或多個有序集的交集并將結果集存儲在新的有序集合 key 中
6 ZLEXCOUNT key min max
在有序集合中計算指定字典區間內成員數量
7 ZRANGE key start stop [WITHSCORES]
通過索引區間返回有序集合成指定區間內的成員
8 ZRANGEBYLEX key min max [LIMIT offset count]
通過字典區間返回有序集合的成員
9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT]
通過分數返回有序集合指定區間內的成員
10 ZRANK key member
返回有序集合中指定成員的索引
11 ZREM key member [member …]
移除有序集合中的一個或多個成員
12 ZREMRANGEBYLEX key min max
移除有序集合中給定的字典區間的所有成員
13 ZREMRANGEBYRANK key start stop
移除有序集合中給定的排名區間的所有成員
14 ZREMRANGEBYSCORE key min max
移除有序集合中給定的分數區間的所有成員
15 ZREVRANGE key start stop [WITHSCORES]
返回有序集中指定區間內的成員,通過索引,分數從高到底
16 ZREVRANGEBYSCORE key max min [WITHSCORES]
返回有序集中指定分數區間內的成員,分數從高到低排序
17 ZREVRANK key member
返回有序集合中指定成員的排名,有序集成員按分數值遞減(從大到小)排序
18 ZSCORE key member
返回有序集中,成員的分數值
19 ZUNIONSTORE destination numkeys key [key …]
計算給定的一個或多個有序集的并集,并存儲在新的 key 中
20 ZSCAN key cursor [MATCH pattern] [COUNT count]
迭代有序集合中的元素(包括元素成員和元素分值)
七、Redis的發布與訂閱
Redis 發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
Redis 客戶端可以訂閱任意數量的頻道。
redis 127.0.0.1:6379> SUBSCRIBE redisChat Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "redisChat" 3) (integer) 1
訂閱一個通道名稱為“redisChat”的通道消息,等待通道消息中
redis 127.0.0.1:6379> PUBLISH redisChat "Redis is a great caching technique" (integer) 1 redis 127.0.0.1:6379> PUBLISH redisChat "Learn redis by xlosy.com" (integer) 1
訂閱者的客戶端會顯示如下消息
1) "message" 2) "redisChat" 3) "Redis is a great caching technique" 1) "message" 2) "redisChat" 3) "Learn redis by xlosy.com"
1 PSUBSCRIBE pattern [pattern …]
訂閱一個或多個符合給定模式的頻道。
2 PUBSUB subcommand [argument [argument …]]
查看訂閱與發布系統狀態。
3 PUBLISH channel message
將信息發送到指定的頻道。
4 PUNSUBSCRIBE [pattern [pattern …]]
退訂所有給定模式的頻道。
5 SUBSCRIBE channel [channel …]
訂閱給定的一個或多個頻道的信息。
6 UNSUBSCRIBE [channel [channel …]]
指退訂給定的頻道。
七、Redis 事務
Redis 事務可以一次執行多個命令, 并且帶有以下兩個重要的保證:
批量操作在發送 EXEC 命令前被放入隊列緩存。
收到 EXEC 命令后進入事務執行,事務中任意命令執行失敗,其余的命令依然被執行。
在事務執行過程,其他客戶端提交的命令請求不會插入到事務執行命令序列中。
一個事務從開始到執行會經歷以下三個階段:
開始事務。
命令入隊。
執行事務。
redis 127.0.0.1:6379> MULTI OK redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days" QUEUED redis 127.0.0.1:6379> GET book-name QUEUED redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series" QUEUED redis 127.0.0.1:6379> SMEMBERS tag QUEUED redis 127.0.0.1:6379> EXEC 1) OK 2) "Mastering C++ in 21 days" 3) (integer) 3 4) 1) "Mastering Series" 2) "C++" 3) "Programming"
單個 Redis 命令的執行是原子性的,但 Redis 沒有在事務上增加任何維持原子性的機制,所以 Redis 事務的執行并不是原子性的。
事務可以理解為一個打包的批量執行腳本,但批量指令并非原子化的操作,中間某條指令的失敗不會導致前面已做指令的回滾,也不會造成后續的指令不做。
1 DISCARD
取消事務,放棄執行事務塊內的所有命令。
2 EXEC
執行所有事務塊內的命令。
3 MULTI
標記一個事務塊的開始。
4 UNWATCH
取消 WATCH 命令對所有 key 的監視。
5 WATCH key [key …]
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。
八、Redis 腳本
Redis 腳本使用 Lua 解釋器來執行腳本。 Redis 2.6 版本通過內嵌支持 Lua 環境。執行腳本的常用命令為 EVAL。
redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 1) "key1" 2) "key2" 3) "first" 4) "second"
1 EVAL script numkeys key [key …] arg [arg …]
執行 Lua 腳本。
2 EVALSHA sha1 numkeys key [key …] arg [arg …]
執行 Lua 腳本。
3 SCRIPT EXISTS script [script …]
查看指定的腳本是否已經被保存在緩存當中。
4 SCRIPT FLUSH
從腳本緩存中移除所有腳本。
5 SCRIPT KILL
殺死當前正在運行的 Lua 腳本。
6 SCRIPT LOAD script
將腳本 script 添加到腳本緩存中,但并不立即執行這個腳本。
九、Redis 連接
redis 127.0.0.1:6379> AUTH "password" OK redis 127.0.0.1:6379> PING PONG
1 AUTH password
驗證密碼是否正確
2 ECHO message
打印字符串
3 PING
查看服務是否運行
4 QUIT
關閉當前連接
5 SELECT index
切換到指定的數據庫
十、Redis 服務器
redis 127.0.0.1:6379> INFO //顯示服務相關信息
1 BGREWRITEAOF
異步執行一個 AOF(AppendOnly File) 文件重寫操作
2 BGSAVE
在后臺異步保存當前數據庫的數據到磁盤
3 CLIENT KILL [ip:port] [ID client-id]
關閉客戶端連接
4 CLIENT LIST
獲取連接到服務器的客戶端連接列表
5 CLIENT GETNAME
獲取連接的名稱
6 CLIENT PAUSE timeout
在指定時間內終止運行來自客戶端的命令
7 CLIENT SETNAME connection-name
設置當前連接的名稱
8 CLUSTER SLOTS
獲取集群節點的映射數組
9 COMMAND
獲取 Redis 命令詳情數組
10 COMMAND COUNT
獲取 Redis 命令總數
11 COMMAND GETKEYS
獲取給定命令的所有鍵
12 TIME
返回當前服務器時間
13 COMMAND INFO command-name [command-name …]
獲取指定 Redis 命令描述的數組
14 CONFIG GET parameter
獲取指定配置參數的值
15 CONFIG REWRITE
對啟動 Redis 服務器時所指定的 redis.conf 配置文件進行改寫
16 CONFIG SET parameter value
修改 redis 配置參數,無需重啟
17 CONFIG RESETSTAT
重置 INFO 命令中的某些統計數據
18 DBSIZE
返回當前數據庫的 key 的數量
19 DEBUG OBJECT key
獲取 key 的調試信息
20 DEBUG SEGFAULT
讓 Redis 服務崩潰
21 FLUSHALL
刪除所有數據庫的所有key
22 FLUSHDB
刪除當前數據庫的所有key
23 INFO [section]
獲取 Redis 服務器的各種信息和統計數值
24 LASTSAVE
返回最近一次 Redis 成功將數據保存到磁盤上的時間,以 UNIX 時間戳格式表示
25 MONITOR
實時打印出 Redis 服務器接收到的命令,調試用
26 ROLE
返回主從實例所屬的角色
27 SAVE
同步保存數據到硬盤
28 SHUTDOWN [NOSAVE] [SAVE]
異步保存數據到硬盤,并關閉服務器
29 SLAVEOF host port
將當前服務器轉變為指定服務器的從屬服務器(slave server)
30 SLOWLOG subcommand [argument]
管理 redis 的慢日志
31 SYNC
用于復制功能(replication)的內部命令
十一、java中使用redis
首先你需要下載驅動包 下載 jedis.jar,確保下載最新驅動包。
在你的 classpath 中包含該驅動包。
import redis.clients.jedis.Jedis; public class RedisJava { public static void main(String[] args) { //連接本地的 Redis 服務 Jedis jedis = new Jedis("localhost"); System.out.println("連接成功"); //查看服務是否運行 System.out.println("服務正在運行: "+jedis.ping()); } }
操作字符串
import redis.clients.jedis.Jedis; public class RedisStringJava { public static void main(String[] args) { //連接本地的 Redis 服務 Jedis jedis = new Jedis("localhost"); System.out.println("連接成功"); //設置 redis 字符串數據 jedis.set("xlosykey", "www.xlosy.com"); // 獲取存儲的數據并輸出 System.out.println("redis 存儲的字符串為: "+ jedis.get("runoobkey")); } }
Redis Java List(列表) 實例
import java.util.List; import redis.clients.jedis.Jedis; public class RedisListJava { public static void main(String[] args) { //連接本地的 Redis 服務 Jedis jedis = new Jedis("localhost"); System.out.println("連接成功"); //存儲數據到列表中 jedis.lpush("site-list", "xlosy"); jedis.lpush("site-list", "Google"); jedis.lpush("site-list", "Taobao"); // 獲取存儲的數據并輸出 List<String> list = jedis.lrange("site-list", 0 ,2); for(int i=0; i<list.size(); i++) { System.out.println("列表項為: "+list.get(i)); } } }
Redis Java Keys 實例
import java.util.Set; import redis.clients.jedis.Jedis; public class RedisKeyJava { public static void main(String[] args) { //連接本地的 Redis 服務 Jedis jedis = new Jedis("localhost"); System.out.println("連接成功"); // 獲取數據并輸出 Set<String> keys = jedis.keys("*"); Iterator<String> it=keys.iterator() ; while(it.hasNext()){ String key = it.next(); System.out.println(key); } } }
Redis開發建議
最后附上Redis的一些開發規范和建議:
1.冷熱數據分離,不要將所有數據全部都放到Redis中
雖然Redis支持持久化,但是Redis的數據存儲全部都是在內存中的,成本昂貴。建議根據業務只將高頻熱數據存儲到Redis中【QPS大于5000】,對于低頻冷數據可以使用MySQL/ElasticSearch/MongoDB等基于磁盤的存儲方式,不僅節省內存成本,而且數據量小在操作時速度更快、效率更高!
2.不同的業務數據要分開存儲
不要將不相關的業務數據都放到一個Redis實例中,建議新業務申請新的單獨實例。因為Redis為單線程處理,獨立存儲會減少不同業務相互操作的影響,提高請求響應速度;同時也避免單個實例內存數據量膨脹過大,在出現異常情況時可以更快恢復服務! 在實際的使用過程中,redis最大的瓶頸一般是CPU,由于它是單線程作業所以很容易跑滿一個邏輯CPU,可以使用redis代理或者是分布式方案來提升redis的CPU使用率。
3.存儲的Key一定要設置超時時間
如果應用將Redis定位為緩存Cache使用,對于存放的Key一定要設置超時時間!因為若不設置,這些Key會一直占用內存不釋放,造成極大的浪費,而且隨著時間的推移會導致內存占用越來越大,直到達到服務器內存上限!另外Key的超時長短要根據業務綜合評估,而不是越長越好!
4.對于必須要存儲的大文本數據一定要壓縮后存儲
對于大文本【+超過500字節】寫入到Redis時,一定要壓縮后存儲!大文本數據存入Redis,除了帶來極大的內存占用外,在訪問量高時,很容易就會將網卡流量占滿,進而造成整個服務器上的所有服務不可用,并引發雪崩效應,造成各個系統癱瘓!
5.線上Redis禁止使用Keys正則匹配操作
Redis是單線程處理,在線上KEY數量較多時,操作效率極低【時間復雜度為O(N)】,該命令一旦執行會嚴重阻塞線上其它命令的正常請求,而且在高QPS情況下會直接造成Redis服務崩潰!如果有類似需求,請使用scan命令代替!
6.可靠的消息隊列服務
Redis List經常被用于消息隊列服務。假設消費者程序在從隊列中取出消息后立刻崩潰,但由于該消息已經被取出且沒有被正常處理,那么可以認為該消息已經丟失,由此可能會導致業務數據丟失,或業務狀態不一致等現象發生。
為了避免這種情況,Redis提供了RPOPLPUSH命令,消費者程序會原子性的從主消息隊列中取出消息并將其插入到備份隊列中,直到消費者程序完成正常的處理邏輯后再將該消息從備份隊列中刪除。同時還可以提供一個守護進程,當發現備份隊列中的消息過期時,可以重新將其再放回到主消息隊列中,以便其它的消費者程序繼續處理。
7.謹慎全量操作Hash、Set等集合結構
在使用HASH結構存儲對象屬性時,開始只有有限的十幾個field,往往使用HGETALL獲取所有成員,效率也很高,但是隨著業務發展,會將field擴張到上百個甚至幾百個,此時還使用HGETALL會出現效率急劇下降、網卡頻繁打滿等問題【時間復雜度O(N)】,此時建議根據業務拆分為多個Hash結構;或者如果大部分都是獲取所有屬性的操作,可以將所有屬性序列化為一個STRING類型存儲!同樣在使用SMEMBERS操作SET結構類型時也是相同的情況!
8.根據業務場景合理使用不同的數據結構類型
目前Redis支持的數據庫結構類型較多:字符串(String),哈希(Hash),列表(List),集合(Set),有序集合(Sorted Set), Bitmap, HyperLogLog和地理空間索引(geospatial)等,需要根據業務場景選擇合適的類型。
常見的如:String可以用作普通的K-V、計數類;Hash可以用作對象如商品、經紀人等,包含較多屬性的信息;List可以用作消息隊列、粉絲/關注列表等;Set可以用于推薦;Sorted Set可以用于排行榜等!
9.命名規范
雖然說Redis支持多個數據庫(默認32個,可以配置更多),但是除了默認的0號庫以外,其它的都需要通過一個額外請求才能使用。所以用前綴作為命名空間可能會更明智一點。
另外,在使用前綴作為命名空間區隔不同key的時候,最好在程序中使用全局配置來實現,直接在代碼里寫前綴的做法要嚴格避免,這樣可維護性實在太差了。
如:系統名:業務名:業務數據:其他
但是注意,key的名稱不要過長,盡量清晰明了,容易理解,需要自己衡量
10.線上禁止使用monitor命令
禁止生產環境使用monitor命令,monitor命令在高并發條件下,會存在內存暴增和影響Redis性能的隱患
11.禁止大string
核心集群禁用1mb的string大key(雖然redis支持512MB大小的string),如果1mb的key每秒重復寫入10次,就會導致寫入網絡IO達10MB;
12.redis容量
單實例的內存大小不建議過大,建議在10~20GB以內。
redis實例包含的鍵個數建議控制在1kw內,單實例鍵個數過大,可能導致過期鍵的回收不及時。
13 可靠性
需要定時監控redis的健康情況:使用各種redis健康監控工具,實在不行可以定時返回redis 的 info信息。
客戶端連接盡量使用連接池(長鏈接和自動重連)
感謝各位的閱讀!關于“Redis怎么使用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。