redis入门笔记(1)
生活随笔
收集整理的這篇文章主要介紹了
redis入门笔记(1)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
1. Redis 簡介Redis是一款開源的、高性能的鍵-值存儲(key-value store)。它常被稱作是一款數據結構服務器(data structure server)。Redis的鍵值可以包括字符串(strings)類型,同時它還包括哈希(hashes)、列表(lists)、集合(sets)和 有序集合(sorted sets)等數據類型。 對于這些數據類型,你可以執行原子操作。例如:對字符串進行附加操作(append);遞增哈希中的值;向列表中增加元素;計算集合的交集、并集與差集等。
為了獲得優異的性能,Redis采用了內存中(in-memory)數據集(dataset)的方式。同時,Redis支持數據的持久化,你可以每隔一段時間將數據集轉存到磁盤上(snapshot),或者在日志尾部追加每一條操作命令(append only file,aof)。
Redis同樣支持主從復制(master-slave replication),并且具有非常快速的非阻塞首次同步( non-blocking first synchronization)、網絡斷開自動重連等功能。同時Redis還具有其它一些特性,其中包括簡單的事物支持、發布訂閱 ( pub/sub)、管道(pipeline)和虛擬內存(vm)等 。
Redis具有豐富的客戶端,支持現階段流行的大多數編程語言。( http://redis.io/clients)
?
2. Redis安裝
?
下載最新穩定版 redis-2.2.11 (http://redis.io/download)
tar zxvf redis-2.2.11 ? 解壓縮
cdsrc ? ? ? ? ? ? ?進入src目錄
make ? ? ? ? ? ? ? 編譯Redis
make test ? ? ? 可以測試一下(本步可省略)
make install ? ?安裝,默認安裝目錄是 /usr/local/bin,生成如下圖中的5個二進制文件,可以將其拷到新建目錄下,例如: ?/usr/local/redis/bin
cp ?源碼/src/redis.conf ? /usr/local/redis/etc ? ? 配置文件復制
cd /usr/local/redis
./bin/redis-server ./etc/redis.conf ? ? ? ? ? ? ? ? ? ?啟動Redis服務
此時redis已經運行,但要獲得好的性能,還需要對配置文件進行合理的配置
?
3. Redis配置
?
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 <dbid>命令在連接上指定數據庫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 <password>命令提供密碼,默認關閉
? ? 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. 設置在向客戶端應da時,是否把較小的包合并為一個包發送,默認為開啟
? ? glueoutputbuf yes
28. 指定在超過一定的數量或者最大的元素超過某一臨界值時,采用一種特殊的哈希算法
? ? hash-max-zipmap-entries 64
? ? hash-max-zipmap-value 512
29. 指定是否激活重置哈希,默認為開啟
? ? activerehashing yes
30. 指定包含其它的配置文件,可以在同一主機上多個Redis實例之間使用同一份配置文件,而同時各個實例又擁有自己的特定配置文件
? ? include /path/to/local.conf
?
4. Redis支持的數據類型
Keys
–非二進制安全的字符類型( not binary-safe strings )
Values
–Strings ? ? ? ? (Binary-safe strings )
–Lists ? ? ? ? ? ? ?(Lists of binary-safe strings )
–Sets ? ? ? ? ? ? ?(Sets of binary-safe strings)
–Sorted sets (Sorted sets of binary-safe strings)
–Hash
?
?Key說明
redis本質上一個key-value 數據庫,所以我們首先來看看他的key.首先key也是字符串類型,由于key不是binary safe的字符串,所以像“my key”和“mykey\n”這樣包含空格和換行的key是不允許的。
我們在使用的時候可以自己定義一個Key的格式。例如 object-type:id:field
Key不要太長。占內存,查詢慢。
Key不要太短。u:1000:pwd ? 不如 ? user:1000:password ?可讀性好
?
Key相關命令
exits key 測試指定key是否存在,返回1表示存在,0不存在
del key1 key2 ....keyN ?刪除給定key,返回刪除key的數目,0表示給定key都不存在
type key 返回給定key的value類型。返回 none 表示不存在,key有string字符類型,list 鏈表類型 set 無序集合類型等...
keys pattern 返回匹配指定模式的所有key(支持*,?,[abc ]的方式)
randomkey 返回從當前數據庫中隨機選擇的一個key,如果當前數據庫是空的,返回空串
rename oldkey newkey 原子的重命名一個key,如果newkey存在,將會被覆蓋,返回1表示成功,0失敗。失敗可能是oldkey不存在或者和newkey相同
renamenx oldkey newkey 同上,但是如果newkey存在返回失敗
dbsize 返回當前數據庫的key數量
expire key seconds 為key指定過期時間,單位是秒。返回1成功,0表示key已經設置過過期時間或者不存在
ttl key 返回設置了過期時間的key的剩余過期秒數, -1表示key不存在或者沒有設置過過期時間
select db-index 通過索引選擇數據庫,默認連接的數據庫所有是0,默認數據庫數是16個。返回1表示成功,0失敗
move key db-index ?將key從當前數據庫移動到指定數據庫。返回1成功。0 如果key不存在,或者已經在指定數據庫中
flushdb 刪除當前數據庫中所有key,此方法不會失敗。慎用
flushall 刪除所有數據庫中的所有key,此方法不會失敗。更加慎用
?
Value說明
?
String
string是redis最基本的類型,而且string類型是二進制安全的。
redis的string可以包含任何數據。包括jpg圖片或者序列化的對象。
最大上限是1G字節。
如果只用string類型,redis就可以被看作加上持久化特性的memcached
?
String 相關命令
set key value 設置key對應的值為string類型的value,返回1表示成功,0失敗
setnx key value 同上,如果key已經存在,返回0 。nx 是not exist的意思
get key 獲取key對應的string值,如果key不存在返回nil
getset key value ?設置key的值,并返回key的舊值。如果key不存在返回nil
mget key1 key2 ... keyN 一次獲取多個key的值,如果對應key不存在,則對應返回nil。下面是個實驗, nonexisting不存在,對應返回nil
mset key1 value1 ... keyN valueN 一次設置多個key的值,成功返回1表示所有的值都設置了,失敗返回0表示沒有任何值被設置
msetnx key1 value1 ... keyN valueN 同上,但是不會覆蓋已經存在的key
incr key 對key的值做加加操作,并返回新的值。注意incr一個不是int的value會返回錯誤,incr一個不存在的key,則設置key為1
decr key 同上,但是做的是減減操作,decr一個不存在key,則設置key為-1
incrby key integer 同incr,加指定值 ,key不存在時候會設置key,并認為原來的value是 0
decrby key integer 同decr,減指定值。decrby完全是為了可讀性,我們完全可以通過incrby一個負值來實現同樣效果,反之一樣。
append key value ?給指定key的字符串值追加value,返回新字符串值的長度。
substr key start end 返回截取過的key的字符串值,注意并不修改key的值。下標是從0開始的。
?
List
redis的list類型其實就是一個每個子元素都是string類型的雙向鏈表。我們可以通過push,pop操作從鏈表的頭部或者尾部添加刪除元素。這使得list既可以用作棧,也可以用作隊列。
list的pop操作還有阻塞版本的。當我們[lr]pop一個list對象是,如果list是空,或者不存在,會立即返回nil。但是阻塞版本的b[lr]pop可以則可以阻塞,當然可以加超時時間,超時后也會返回nil。為什么要阻塞版本的pop呢,主要是為了避免輪詢。舉個簡單的例子如果我們用list來實現一個工作隊列。執行任務的thread可以調用阻塞版本的pop去獲取任務這樣就可以避免輪詢去檢查是否有任務存在。當任務來時候工作線程可以立即返回,也可以避免輪詢帶來的延遲。?
?
List相關命令
?
lpush key string 在key對應list的頭部添加字符串元素,返回1表示成功,0表示key存在且不是list類型
rpush key string 同上,在尾部添加
llen key 返回key對應list的長度,key不存在返回0,如果key對應類型不是list返回錯誤
lrange key start end 返回指定區間內的元素,下標從0開始,負值表示從后面計算,-1表示倒數第一個元素 ,key不存在返回空列表
ltrim key start end ?截取list,保留指定區間內元素,成功返回1,key不存在返回錯誤
lset key index value 設置list中指定下標的元素值,成功返回1,key或者下標不存在返回錯誤
lrem key count value 從key對應list中刪除count個和value相同的元素。count為0時候刪除全部
lpop key 從list的頭部刪除元素,并返回刪除元素。如果key對應list不存在或者是空返回nil,如果key對應值不是list返回錯誤
rpop 同上,但是從尾部刪除
blpop key1...keyN timeout 從左到右掃描返回對第一個非空list進行lpop操作并返回,比如blpop list1 list2 list3 0 ,如果list不存在,list2,list3都是非空則對list2做lpop并返回從list2中刪除的元素。如果所有的list都是空或不存在,則會阻塞timeout秒,timeout為0表示一直阻塞。
當阻塞時,如果有client對key1...keyN中的任意key進行push操作,則第一在這個key上被阻塞的client會立即返回。如果超時發生,則返回nil。
brpop 同blpop,一個是從頭部刪除一個是從尾部刪除
rpoplpush srckey destkey 從srckey對應list的尾部移除元素并添加到destkey對應list的頭部,最后返回被移除的元素值,整個操作是原子的.如果srckey是空
或者不存在返回nil
?
Set
redis的set是string類型的無序集合。
set元素最大可以包含(2的32次方-1)個元素。
set的是通過hash table實現的,hash table會隨著添加或者刪除自動的調整大小
關于set集合類型除了基本的添加刪除操作,其他有用的操作還包含集合的取并集(union),交集(intersection),差集(difference)。通過這些操作可以很容易的實現sns中的好友推薦和blog的tag功能。
?
Set相關命令
sadd key member 添加一個string元素到,key對應的set集合中,成功返回1,如果元素以及在集合中返回0,key對應的set不存在返回錯誤
srem key member 從key對應set中移除給定元素,成功返回1,如果member在集合中不存在或者key不存在返回0,如果key對應的不是set類型的值返回錯誤
spop key 刪除并返回key對應set中隨機的一個元素,如果set是空或者key不存在返回nil
srandmember key 同spop,隨機取set中的一個元素,但是不刪除元素
smove srckey dstkey member 從srckey對應set中移除member并添加到dstkey對應set中,整個操作是原子的。成功返回1,如果member在srckey中不存在返回0,如果key不是set類型返回錯誤
scard key 返回set的元素個數,如果set是空或者key不存在返回0
sismember key member 判斷member是否在set中,存在返回1,0表示不存在或者key不存在
sinter key1 key2...keyN 返回所有給定key的交集
sinterstore dstkey key1...keyN 同sinter,但是會同時將交集存到dstkey下
sunion key1 key2...keyN 返回所有給定key的并集
sunionstore dstkey key1...keyN 同sunion,并同時保存并集到dstkey下
sdiff key1 key2...keyN 返回所有給定key的差集
sdiffstore dstkey key1...keyN 同sdiff,并同時保存差集到dstkey下
smembers key 返回key對應set的所有元素,結果是無序的
?
Sorted set
和set一樣sorted set也是string類型元素的集合,不同的是每個元素都會關聯一個double類型的score。sorted set的實現是skip list和hash table的混合體。當元素被添加到集合中時,一個元素到score的映射被添加到hash table中,另一個score到元素的映射被添加到skip list
并按照score排序,所以就可以有序的獲取集合中的元素。
Sorted set 相關命令
zadd key score member 添加元素到集合,元素在集合中存在則更新對應score
zrem key member 刪除指定元素,1表示成功,如果元素不存在返回0
zincrby key incr member 增加對應member的score值,然后移動元素并保持skip list有序。返回更新后的score值
zrank key member 返回指定元素在集合中的排名(下標,非score),集合中元素是按score從小到大排序的
zrevrank key member 同上,但是集合中元素是按score從大到小排序
zrange key start end 類似lrange操作從集合中取指定區間的元素。返回的是有序結果
zrevrange key start end 同上,返回結果是按score逆序的
zrangebyscore key min max 返回集合中score在給定區間的元素
zcount key min max 返回集合中score在給定區間的數量
zcard key 返回集合中元素個數
zscore key element ?返回給定元素對應的score
zremrangebyrank key min max 刪除集合中排名在給定區間的元素
zremrangebyscore key min max 刪除集合中score在給定區間的元素
?
Hash
redis hash是一個string類型的field和value的映射表。
hash特別適合用于存儲對象。相較于將對象的每個字段存成單個string類型。將一個對象存儲在hash類型中會占用更少的內存,并且可以更方便的存取整個對象。
Hash相關命令
hset key field value 設置hash field為指定值,如果key不存在,則先創建
hget key field ?獲取指定的hash field
hmget key filed1....fieldN 獲取全部指定的hash filed
hmset key filed1 value1 ... filedN valueN 同時設置hash的多個field
hincrby key field integer 將指定的hash filed 加上給定值
hexists key field 測試指定field是否存在
hdel key field 刪除指定的hash field
hlen key 返回指定hash的field數量
hkeys key 返回hash的所有field
hvals key 返回hash的所有value
hgetall 返回hash的所有filed和value
轉載于:https://my.oschina.net/pvpCC9IFwqz4/blog/669931
總結
以上是生活随笔為你收集整理的redis入门笔记(1)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: HBase权威指南 高清中文版 PDF(
- 下一篇: 别人要访问我的电脑上部署的tomcat,