redis學習筆記


【redis簡介】html

    redis是一個開源的,先進的key-value存儲。它一般被稱爲數據結構服務器,由於redis的key能夠包含stringhashlistsetzset。這些數據都支持push/pop、add/remove以及取交集並集等豐富的操做。redis支持各類不一樣方式的排序。爲了保證效率,數據都是寫入內存中,它能夠週期性的把更新的數據寫入到磁盤或者把修改的操做寫入到追加的記錄文件中。redis

【redis適用場合數組

  • 取最新N個數據的操做緩存

  • 排行榜應用,去topN操做bash

  • 須要設置精確的過時時間的應用服務器

  • 計數器的應用數據結構

  • uniq操做,去重app

  • 實時系統,反垃圾系統ide

  • pub(發佈)/sub(訂閱)構建實時消息系統spa

  • 構建隊列系統

  • 緩存

【redis的string數據類型

1.set:設置值,成功返回OK

127.0.0.1:6379> set name hucc
OK
127.0.0.1:6379>

2.get:獲取key對應的值,若是key存在,返回對應的value,若是不存在,返回nil

127.0.0.1:6379> get name
"hucc"
127.0.0.1:6379> get name1
(nil)
127.0.0.1:6379>

3.setnx(set not exits):只有在key不存在時才作插入操做。

  • 若是key存在,不插入,返回0。

  • 若是key不存在,插入,返回1。

127.0.0.1:6379> setnx name hcc
(integer) 0
127.0.0.1:6379> setnx name1 hcc
(integer) 1
127.0.0.1:6379>

4.setex:爲key設置值,同時指定key的生存時間。格式:set key time value

127.0.0.1:6379> setex name 10 hucc
OK
127.0.0.1:6379>

上述例子:name這個key只存在10秒鐘,10秒後自動銷燬。

5.setrange:設置指定key的value值的子字符串。格式:setrange key num value

127.0.0.1:6379> set email hucc@163.com
OK
127.0.0.1:6379> get email
"hucc@163.com"
127.0.0.1:6379> setrange email 5 126.com
(integer) 12
127.0.0.1:6379> get email
"hucc@126.com"
127.0.0.1:6379>

從上述例子能夠看出,setrange的功能是將163.com替換成了126.com。即email的第5位開始,執行成功後會返回字符串的長度。可是:看下面的例子

127.0.0.1:6379> get email
"hucc@126.com"
127.0.0.1:6379> setrange email 5 qq.com
(integer) 12
127.0.0.1:6379> get email
"hucc@qq.comm"
127.0.0.1:6379>

爲何將126.com替換成qq.com的時候多了一個m,由於setrange只會替換掉你指定的字符串的長度的字符串,說白了就是qq.com會替換掉126.co這6個字母,剩下的m會保留。

6.mset:一次性設置多個key和value,若是返回1,則都成功,若是返回0,則都失敗。

127.0.0.1:6379> mset name1 hucc1 name2 hucc2
OK
127.0.0.1:6379> get name1
"hucc1"
127.0.0.1:6379> get name2
"hucc2"
127.0.0.1:6379>

7.msetnx:同理,不解釋

8.getset:獲取舊值而且設置新值

127.0.0.1:6379> set val 20
OK
127.0.0.1:6379> getset val 30
"20"
127.0.0.1:6379> get val
"30"
127.0.0.1:6379>

9.getrange:獲取子字符串。格式:getrange email begin end

127.0.0.1:6379> get email
"hucc@yahoo.com"
127.0.0.1:6379> getrange email 1 5
"ucc@y"
127.0.0.1:6379>

10.mget:批量獲取

127.0.0.1:6379> mget name name1 name2 name3
1) (nil)
2) "hucc1"
3) "hucc2"
4) "hucc3"
127.0.0.1:6379>

11.incr:自增,++。若是key不存在,則默認key的value值爲0

127.0.0.1:6379> get val
"30"
127.0.0.1:6379> incr val
(integer) 31
127.0.0.1:6379> 
127.0.0.1:6379> incr a
(integer) 1
127.0.0.1:6379>

12.incrby:自增多少次,接參數,若是參數爲5,則自增5次,若是爲-5,則自減5次。

127.0.0.1:6379> get val
"20"
127.0.0.1:6379> incrby val 5
(integer) 25
127.0.0.1:6379> incrby val -5
(integer) 20
127.0.0.1:6379>

13.decr、decrby,自減操做,和incr、incrby對立。

14.append:給指定的key後面添加值,返回新字符串的長度

127.0.0.1:6379> set name hucc
OK
127.0.0.1:6379> append name " is a handsome boy"
(integer) 22
127.0.0.1:6379> get name
"hucc is a handsome boy"
127.0.0.1:6379>

15:strlen:獲取指定key的值的長度。

127.0.0.1:6379> set name "hucc is a handsome boy"
OK
127.0.0.1:6379> strlen name
(integer) 22
127.0.0.1:6379>

【redis的hash數據類型

hash是string類型的field和value的映射表,它的添加和刪除都是o(1)。hash特別適用於存儲對象,相比string把每一個字段都存儲成單個string類型,將一個對象都存儲在hash中將更省內存,而且更加的方便存取整個對象。說白了就是string存儲單個屬性,hash適合存儲整個對象。

1.hset:hash的設置方法。hset table field value(至關於與設置了對象一個屬性,還能往裏面添加)。

127.0.0.1:6379> hset person name hucc
(integer) 1
127.0.0.1:6379> hset person age 22
(integer) 1
127.0.0.1:6379> hset person saraly 9000
(integer) 1

2.hsetnx,相似setnx。

3.hmset,相似mset

127.0.0.1:6379> hmset user:001 name hucc age 21 saraly 9000
OK
127.0.0.1:6379>

4.hincrby

5.hexits:查看某一個字段是否存在

6.hlen:查看某個對象裏面的字段的數量

7.hdel:刪除某個字段

8.hkeys:返回對象中全部的字段名。

9.hvals:返回對象中全部的value值。

10.hgetall:獲取某個hash中所有的key和value,這個最好用

127.0.0.1:6379> hgetall user:001
1) "name"
2) "hucc"
3) "age"
4) "21"
5) "saraly"
6) "9000"
127.0.0.1:6379>

【redis的list數據類型

redis的list是一個鏈表結構,key是鏈表的名稱,每個子元素都是string類型的雙向鏈表。能夠經過push和pop操做從鏈表的頭部或者尾部添加刪除元素,這樣list既能夠做爲棧,也能夠做爲隊列。

1.lpush:從鏈表的頭部壓入一個元素

127.0.0.1:6379> lpush list1 hello
(integer) 1
127.0.0.1:6379> lpush list1 world
(integer) 2

2.lrange:從指定鏈表的表頭向表位方向取元素,範圍爲(start,stop)包含了start和stop兩個元素

  命令:lrange key start stop

  • start和stop都是數字

  • 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。

  • -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推

  • 取出全部元素的辦法:lrange list 0 -1

127.0.0.1:6379> lrange list 0 -1
1) "world"
2) "hello"
127.0.0.1:6379>

3.rpush:每次從鏈表的尾部壓入元素。

  • lpush配合lrange能夠實現棧的效果

  • rpush配合lrange能夠實現隊列的效果

4.linsert:往鏈表的指定位置插入元素

127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "world"
127.0.0.1:6379> linsert list before world hucc
(integer) 3
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hucc"
3) "world"
127.0.0.1:6379>

5.lset:替換掉鏈表指定下標的元素的值。LSET key index value

127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hucc"
3) "world"
127.0.0.1:6379> (error) ERR unknown command 'hello'
127.0.0.1:6379> 
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hucc"
3) "world"
127.0.0.1:6379> lset list 1 hucoco
OK
127.0.0.1:6379> lrange list 0 -1
1) "hello"
2) "hucoco"
3) "world"
127.0.0.1:6379>

6.LREM key count value

根據參數 count 的值,移除列表中與參數 value 相等的元素。

count 的值能夠是如下幾種:

  • count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量爲 count 。

  • count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量爲 count 的絕對值。

  • count = 0 : 移除表中全部與 value 相等的值。

127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
3) "three"
4) "one"
127.0.0.1:6379> lrem list -1 "one"
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
3) "three"
127.0.0.1:6379>

上述例子:從尾部開始刪除一個one

7.LTRIM key start stop

對一個列表進行修剪(trim),就是說,讓列表只保留指定區間內的元素,不在指定區間以內的元素都將被刪除。

參數和lrange的參數是同樣的意思。

127.0.0.1:6379> ltrim list 0 1
OK
127.0.0.1:6379> lrange list 0 -1
1) "one"
2) "two"
127.0.0.1:6379>

上述例子只想保留第一個和第二個元素。

8.lpop與rpop;分別是從頭和從尾部彈出一個元素。而且返回這個元素的值。

9.rpoplpush list1 list2

命令 rpoplpush 在一個原子時間內,執行如下兩個動做:

  • 將列表 list1 中的最後一個元素(尾元素)彈出,並返回給客戶端。

  • list1 彈出的元素插入到列表 list2 ,做爲 list2 列表的的頭元素。

10.lindex key index:獲取鏈表指定下標的元素的內容

11.llen key:返回鏈表的長度。

【redis的set數據類型

redis的set是集合,經過hash table實現的,它是string類型的無序集合。添加、刪除和查找的複雜度都是o(1)。對於集合咱們能夠取並集、交集、差集。

1.SADD key member [member ...]

將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。

127.0.0.1:6379> sadd set1 one
(integer) 1
127.0.0.1:6379> sadd set1 two
(integer) 1
127.0.0.1:6379> sadd set1 two
(integer) 0
127.0.0.1:6379>

2.SMEMBERS key

返回集合 key 中的全部成員。

不存在的 key 被視爲空集合

127.0.0.1:6379> smembers set1
1) "one"
2) "two"
127.0.0.1:6379>

3.SREM key member [member ...]

移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略。

當 key 不是集合類型,返回一個錯誤。

127.0.0.1:6379> srem set1 one
(integer) 1
127.0.0.1:6379> smembers set1
1) "two"

4.SPOP key

移除並返回集合中的一個隨機元素。

若是隻想獲取一個隨機元素,但不想該元素從集合中被移除的話,可使用 SRANDMEMBER 命令。

5.SDIFF key [key ...]

返回一個集合的所有成員,該集合是全部給定集合之間的差集。

不存在的 key 被視爲空集。

127.0.0.1:6379> smembers set1
1) "one"
2) "two"
127.0.0.1:6379> smembers set2
1) "two"
2) "three"
127.0.0.1:6379> sdiff set1 set2
1) "one"
127.0.0.1:6379>

6.SDIFFSTORE destination key [key ...]

這個命令的做用和 SDIFF 相似,但它將結果保存到 destination 集合,而不是簡單地返回結果集。

若是 destination 集合已經存在,則將其覆蓋。

destination 能夠是 key 自己。

7.sinter、sinterstore:交集

8.sunion、sunionstore:並集

9.SMOVE source destination member

將 member 元素從 source 集合移動到 destination 集合。

SMOVE 是原子性操做。

若是 source 集合不存在或不包含指定的 member 元素,則 SMOVE 命令不執行任何操做,僅返回 0 。不然, member 元素從 source 集合中被移除,並添加到 destination 集合中去。

當 destination 集合已經包含 member 元素時, SMOVE 命令只是簡單地將 source 集合中的 member 元素刪除。

當 source 或 destination 不是集合類型時,返回一個錯誤。

10.SCARD key

返回集合 key 的個數(集合中元素的數量)。

11.SISMEMBER key member

判斷 member 元素是否集合 key 的成員。

12.SRANDMEMBER key [count]

若是命令執行時,只提供了 key 參數,那麼返回集合中的一個隨機元素。

從 Redis 2.6 版本開始, SRANDMEMBER 命令接受可選的 count 參數:

  • 若是 count 爲正數,且小於集合基數,那麼命令返回一個包含 count 個元素的數組,數組中的元素各不相同。若是 count大於等於集合基數,那麼返回整個集合。

  • 若是 count 爲負數,那麼命令返回一個數組,數組中的元素可能會重複出現屢次,而數組的長度爲 count 的絕對值。

該操做和 SPOP 類似,但 SPOP 將隨機元素從集合中移除並返回,而 SRANDMEMBER 則僅僅返回隨機元素,而不對集合進行任何改動。

【redis的sorted set數據類型

redis的sorted set是有序集合,也被稱爲zset,它在set的基礎上添加了一個順序屬性,這個屬性在添加修改元素的時候能夠指定,每次指定後,zset會從新調整順序。

1.ZADD key score member [[score member] [score member] ...]

將一個或多個 member 元素及其 score 值加入到有序集 key 當中。

若是某個 member 已是有序集的成員,那麼更新這個 member 的 score 值,並經過從新插入這個 member 元素,來保證該 member 在正確的位置上。

score 值能夠是整數值或雙精度浮點數。

若是 key 不存在,則建立一個空的有序集並執行 ZADD 操做。

當 key 存在但不是有序集類型時,返回一個錯誤。

2.ZRANGE key start stop [WITHSCORES]

返回有序集 key 中,指定區間內的成員。

其中成員的位置按 score 值遞增(從小到大)來排序。

具備相同 score 值的成員按字典序(lexicographical order )來排列。

若是你須要成員按 score 值遞減(從大到小)來排列,請使用 ZREVRANGE 命令。

下標參數 start 和 stop 都以 0 爲底,也就是說,以 0 表示有序集第一個成員,以 1 表示有序集第二個成員,以此類推。

你也可使用負數下標,以 -1 表示最後一個成員, -2 表示倒數第二個成員,以此類推。

超出範圍的下標並不會引發錯誤。

好比說,當 start 的值比有序集的最大下標還要大,或是 start > stop 時, ZRANGE 命令只是簡單地返回一個空列表。

另外一方面,假如 stop 參數的值比有序集的最大下標還要大,那麼 Redis 將 stop 看成最大下標來處理。

能夠經過使用 WITHSCORES 選項,來讓成員和它的 score 值一併返回,返回列表以 value1,score1, ..., valueN,scoreN 的格式表示。

客戶端庫可能會返回一些更復雜的數據類型,好比數組、元組等。

3.ZREVRANGE key start stop [WITHSCORES]

返回有序集 key 中,指定區間內的成員。

其中成員的位置按 score 值遞減(從大到小)來排列。

具備相同 score 值的成員按字典序的逆序(reverse lexicographical order)排列。

除了成員按 score 值遞減的次序排列這一點外, ZREVRANGE 命令的其餘方面和 ZRANGE 命令同樣。

4.ZREM key member [member ...]

移除有序集 key 中的一個或多個成員,不存在的成員將被忽略。

當 key 存在但不是有序集類型時,返回一個錯誤。

5.ZINCRBY key increment member

爲有序集 key 的成員 member 的 score 值加上增量 increment 。

能夠經過傳遞一個負數值 increment ,讓 score 減去相應的值,好比 ZINCRBY key -5 member ,就是讓 member 的 score 值減去 5 。

當 key 不存在,或 member 不是 key 的成員時, ZINCRBY key increment member 等同於 ZADD key increment member 。

當 key 不是有序集類型時,返回一個錯誤。

score 值能夠是整數值或雙精度浮點數。

6.ZRANK key member

返回有序集 key 中成員 member 的排名。其中有序集成員按 score 值遞增(從小到大)順序排列。

排名以 0 爲底,也就是說, score 值最小的成員排名爲 0 。

使用 ZREVRANK 命令能夠得到成員按 score 值遞減(從大到小)排列的排名。

相關文章
相關標籤/搜索