1. 程式人生 > >Redis命令操作各個型別

Redis命令操作各個型別

一、什麼是Redis

Redis是一個使用C語言開發的開源的高效能的key-value儲存系統,我們可以把它近似理解為Java Map。簡單來講,Redis是一種NOSQL記憶體資料庫,小夥伴們可不要把它理解為NO SQL(不是SQL),它的全稱是Not Only SQL(不僅僅是SQL),換個層面來講,它是一種非關係型的資料庫,它是作為關係型資料庫的良好補充,它與傳統的MySQL,Oracle不同之處在於,它是通過在記憶體中讀寫資料,大大提高了讀寫速度。可以說,Redis是為了解決網站高併發、高可用、高可擴充套件、大資料儲存等一系列問題而產生的資料庫解決方案,不可或缺的一部分。

它具有以下特點:

1、Redis支援資料的持久化,可以將記憶體中的資料保持在磁碟中,重啟的時候可以再次載入進行使用。

2、Redis不僅僅支援簡單的key-value型別的資料,同時還提供string、list、set、sortedset、hash等資料結構的儲存。

3、Redis支援資料的備份,即master-slave模式的資料備份。

Redis有五種鍵值型別:

  • String字元型別
  • hash雜湊型別
  • list列表型別
  • set集合型別
  • sortedset有序集合型別

而本文將基於Redis5.0為例來介紹Redis一些相關命令的使用和踩過的坑

二、關於Redis的安裝與啟動

環境準備

  • CentOS7 (未安裝Development Tools)
  • Redis5.0-rc3.tar.gz

安裝教程百度一大堆,這裡我就不說了,自行百度即可

線上環境

官網似乎提供了一個線上的Redis平臺,連結在這裡:http://try.redis.io/

Redis啟動

前端啟動

按照我所提供的教程安裝以後,我們只需要輸入命令redis-server即可,介面如下:

新人入坑必備,Redis一定會用到的吐血總結

 

前端停止啟動

後端啟動

因為Redis在實際使用中不會只是一個Redis單獨工作,啟動和關閉方式中的ip地址和埠號可以在配置檔案中自行修改,下面會有修改方式.

啟動方式

  1. 需要將redis解壓之後的原始碼包中的redis.conf檔案拷貝到bin目錄下.直接複製貼上即可
  2. 修改redis.conf檔案,將daemonize改為yes(vi redis.conf進去,:/daemonize搜尋).
  3. 使用命令後端啟動redis.命令列redis-server redis.conf(以配置檔案啟動)
  4. 檢視是否啟動成功.命令列 ps -aux | grep redis (直接檢視redis的程序)

如果你之前按照我所提供的教程修改過,這一過程可以直接忽略就好

新人入坑必備,Redis一定會用到的吐血總結

 

關閉方式

  • 強制關閉:kill -9 PID
  • 正常關閉:redis-cli -h ip地址 -p 埠號(預設埠號是6379) shutdown

在專案中,建議使用正常關閉。 因為redis作為快取來使用的話,將資料儲存到記憶體中,如果使用正常關閉,則會將記憶體資料持久化到本地之後,再關閉。如果是強制關閉,則不會進行持久化操作,可能會造成部分資料的丟失。

Redis客戶端啟動

啟動客戶端命令:[[email protected]]# redis-cli -h ip地址 -p 埠號

由於預設IP是127.0.0.1,埠是6379,我們只需要輸入命令redis-cli即可

退出:127.0.0.1:6379> quit即可

三、Redis資料型別及常用命令講解

1、Redis-String

string使用環境:主要用於儲存json格式的字串

賦值

set key value:設定key持有指定的字串value,如果該key存在則進行覆蓋操作,總是返回"OK",如果賦予相同的key,新的value會覆蓋老的value

example:

127.0.0.1:6379> set username zhangsan
OK

取值

get key:獲取key的value。如果與該key關聯的value不是string型別,redis將返回錯誤資訊,因為get命令只能用於獲取string value;如果該key不存在,返回nil

example:

127.0.0.1:6379> get username
"zhangsan"

刪除

del key:刪除指定key,返回值是數字型別,表示刪了幾條資料

example:

127.0.0.1:6379> del username
(integer) 1

擴充套件

getset key value:先獲取該key的值,然後再設定該key的值

example:

127.0.0.1:6379> getset username zhangsan
(nil)
127.0.0.1:6379> keys *
1) "username"
127.0.0.1:6379> get username
"zhangsan"

incr key:將指定的key的value原子性的遞增1,如果該key不存在,其初始值為0,在incr之後的值為1,如果value的值不能轉成整型,如hello,該操作將執行失敗並返回相應的錯誤資訊,相當於++(作用:統計網站訪客人數,當計數器)

example:

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> incr age
(integer) 19

decr key:將指定的key的value原子性的遞減1,如果該key不存在,其初始值為0,在incr之後的值為-1,如果value的值不能轉成整型,如hello,該操作將執行失敗並返回相應的錯誤資訊,相當於–i

example:

127.0.0.1:6379> set age 18
OK
127.0.0.1:6379> decr age
(integer) 17

append key value:拼接字串,如果該key存在,則在原有的value後追加該值,如果該key不存在,則重新建立一個key/value

example:

127.0.0.1:6379> set information hel
OK
127.0.0.1:6379> append information lo
(integer) 5
127.0.0.1:6379> get information
"hello"

incrby和decrby:只能對字串是數字的進行操作,incrby key value是對原有的key的值增加value,而decrby key value是對原有的key的值減少value

example:

127.0.0.1:6379> get age
"17"
127.0.0.1:6379> incrby age 10
(integer) 27
127.0.0.1:6379> decrby age 10
(integer) 17
127.0.0.1:6379> get information
"hello"
127.0.0.1:6379> incrby information 10
(error) ERR value is not an integer or out of range
127.0.0.1:6379> decrby information 10
(error) ERR value is not an integer or out of range

2、Redis-hash

Redis中的hash型別可以看成具有string key和string value的map容器,所以該型別非常適合於儲存值物件的資訊。如username,password和age等。如果hash中包含很少的欄位,那麼該型別的資料也將僅佔用很少的磁碟空間。每一個hash可以儲存4294967295個鍵值對。

hash特點:佔用的磁碟空間極少

賦值:

hset key field value:為指定的key設定field/value對(鍵值對)

example:

127.0.0.1:6379> hset key1 field1 123
(integer) 1

hmset key field value[field2 value2…]:設定key中的多個field/value

example:

127.0.0.1:6379> hmset aaa name kitty age 20
OK

取值:

hget key filed:獲取指定的key的field的值

example:

127.0.0.1:6379> hget key1 field1
"123"

hmget key filed1 field2…:獲取key中的多個field的值

example:

127.0.0.1:6379> hmget aaa name age
1) "kitty"
2) "20"

hgetall key:獲取key中的所有field-value2

example:

127.0.0.1:6379> hgetall aaa
1) "name"
2) "kitty"
3) "age"
4) "20"

刪除

hdel key field[field…]:可以刪除一個或多個欄位,返回值是被刪除的欄位個數

example:

127.0.0.1:6379> hdel key1 field1
(integer) 1

del key:刪除整個list

example:

127.0.0.1:6379> del aaa
(integer) 1

增加數字

hincrby key field increment:設定key中的field增加increment,如age增加20

example:

127.0.0.1:6379> hmset aaa name kitty age 20
OK
127.0.0.1:6379> hincrby aaa age 20
(integer) 40

擴充套件命令

hexists key field:判斷指定的key中的field是否存在

example:

127.0.0.1:6379> hexists aaa name
(integer) 1
127.0.0.1:6379> hexists aaa aaaa
(integer) 0

hlen key:獲取key所包含的field的數量

example:

127.0.0.1:6379> hlen aaa
(integer) 2

hkeys key:獲得所有的欄位

example:

127.0.0.1:6379> hkeys aaa
1) "name"
2) "age"

3、Redis-list

Redis中list選取的是連結串列,因為在Redis操作中,最多的操作是進行元素的增刪

賦值

lpush key value [value1 value2 …] 在指定的key所關聯的list頭部插入所有的value,如果該key不存在,該命令在插入之前建立一個與該key關聯的空連結串列,之後再向該連結串列的頭部插入資料,插入成功,返回元素的個數。

example:

127.0.0.1:6379> lpush score1 1 2 3 4 5
(integer) 5

rpush key value [value1 value2 …] 在該list的尾部新增元素

example:

127.0.0.1:6379> rpush score2 1 2 3 4 5
(integer) 5

取值

lrange key start end:獲取連結串列中從start到end的元素的值,start、end從0開始計數;也可以為負數,若為-1則表示連結串列尾部的元素,-2表示倒數第二個,以此類推…

example:

127.0.0.1:6379> lrange score1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> lrange score2 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"

刪值

lpop key:返回並彈出指定的key關聯的連結串列中的第一個元素,即頭部元素。如果該key不存在,返回nil;若key存在,則返回連結串列的頭部元素

example:

127.0.0.1:6379> lpop score1
"5"
127.0.0.1:6379> lpop score2
"1"

rpop key:從尾部彈出元素

example:

127.0.0.1:6379> rpop score1
"1"
127.0.0.1:6379> rpop score2
"5"

擴充套件

llen key:返回指定的key關聯的連結串列中的元素的數量

example:

127.0.0.1:6379> llen score1
(integer) 3
127.0.0.1:6379> llen score2
(integer) 3

lrem key count value:刪除count個值為value的元素,如果count大於0,從頭到尾遍歷並刪除count個值為value的元素,如果count小於0,則從尾到頭遍歷並刪除,如果count等於0,則刪除連結串列中所有等於value的元素。

example:

127.0.0.1:6379> lrem score1 1 2
(integer) 1
127.0.0.1:6379> lrem score2 1 2
(integer) 1

通過索引替換

lset key index value:設定連結串列中的index的腳標的元素值,0代表連結串列的頭元素,-1代表連結串列的尾元素。操作連結串列的腳標不存在則丟擲異常

example:

127.0.0.1:6379> lset score1 0 1
OK
127.0.0.1:6379> lset score2 0 1
OK

在索引前/後插入元素

linsert key before|after pivot value:在pivot元素前或者後插入value這個元素

example:

127.0.0.1:6379> linsert score1 before 3 aaa
(integer) 3
127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
3) "3"
127.0.0.1:6379> linsert score1 after 3 bbb
(integer) 4
127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
3) "3"
4) "bbb"

rpoplpush resource destination:將連結串列中的尾部元素彈出並新增到頭部。[迴圈操作]

example:

127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
3) "3"
127.0.0.1:6379> lrange score2 0 -1
1) "bbb"
2) "1"
3) "4"
127.0.0.1:6379> rpoplpush score1 score2
"3"
127.0.0.1:6379> lrange score1 0 -1
1) "1"
2) "aaa"
127.0.0.1:6379> lrange score2 0 -1
1) "3"
2) "bbb"
3) "1"
4) "4"

4、Redis-set

賦值

sadd key value[value1 value2…]:向set中新增元素,如果該key的值已有則不會重複新增

example:

127.0.0.1:6379> sadd abc 1 2 3 4
(integer) 4

srem key member[member1 member2…]:刪除set中指定的成員

example:

127.0.0.1:6379> srem abc 1 3
(integer) 2

取值

smembers key:獲取set中所有的成員

example:

127.0.0.1:6379> smembers abc
1) "2"
2) "4"

sismember key member:判斷引數中指定的成員是否在該set中,1表示存在,0表示不存在或者該key本身就不存在(無論集合中有多少元素都可以極速的返回結果)

example:

127.0.0.1:6379> sismember abc 2
(integer) 1
127.0.0.1:6379> sismember abc 3
(integer) 0

刪值

集合運算

差集運算

sdiff key1 key2…:返回key1與key2中相差的成員,而且與key的順序有關,即返回差集

example:

127.0.0.1:6379> sadd set1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> sadd set2 3 4 5 6 7
(integer) 5
127.0.0.1:6379> sdiff set1 set2
1) "1"
2) "2"
127.0.0.1:6379> sdiff set2 set1
1) "6"
2) "7"

交集運算

sinter key1 key2…:返回交集

example:

127.0.0.1:6379> sinter set1 set2
1) "3"
2) "4"
3) "5"

並集運算

sunion key1 key2…:返回並集

example:

127.0.0.1:6379> sunion set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"
7) "7"

擴充套件命令

scard key:獲取set中成員的數量

example:

127.0.0.1:6379> scard set1
(integer) 5

srandmember key:隨機返回set中的一個成員

example:

127.0.0.1:6379> srandmember set1
"1"
127.0.0.1:6379> srandmember set1
"5"
127.0.0.1:6379> srandmember set1
"3"

sdiffstore destination key1 key2…:將key1 key2…相差的成員儲存在destination上

example:

127.0.0.1:6379> sdiffstore set3 set1 set2
(integer) 2
127.0.0.1:6379> smembers set3
1) "1"
2) "2"

sinterstore destination key[key…]:將返回的交集儲存在destination上

example:

127.0.0.1:6379> sinterstore set4 set1 set2
(integer) 3
127.0.0.1:6379> smembers set4
1) "3"
2) "4"
3) "5"

5、Redis-sortedset

賦值

zadd key score member score2 member2…:將所有成員以及該成員的分數存放到sorted-set中。如果該元素已經存在則會用新的分數代替原有的分數,返回值是新加入到集合中的元素個數,不包含之前已經存在的元素。

example:

127.0.0.1:6379> zadd list 50 xiaoming 100 xiaohong 200 xiaozhang
(integer) 3

取值

zscore key member:返回指定成員的分數

example:

127.0.0.1:6379> zscore list xiaohong
"100"

zcard key:獲取集合中的成員數量

example:

127.0.0.1:6379> zcard list
(integer) 3

範圍查詢

zrange key start end[withscores]:獲取集合中腳標為start-end的成員,[withscores]引數表明返回的成員包含其分數(分數從小到大排序)

example:

127.0.0.1:6379> zrange list 0 -1
1) "xiaoming"
2) "xiaohong"
3) "xiaozhang"
127.0.0.1:6379> zrange list 0 -1 withscores
1) "xiaoming"
2) "50"
3) "xiaohong"
4) "100"
5) "xiaozhang"
6) "200"

zrevrange key start end[withscores]:獲取集合中腳標為start-end的成員,[withscores]引數表明返回的成員包含其分數(分數從大到小排序)

example:

127.0.0.1:6379> zrevrange list 0 -1
1) "xiaozhang"
2) "xiaohong"
3) "xiaoming"
127.0.0.1:6379> zrevrange list 0 -1 withscores
1) "xiaozhang"
2) "200"
3) "xiaohong"
4) "100"
5) "xiaoming"
6) "50"

刪值

zrem key member[member…]:移除集合中指定的成員,可以指定多個成員

example:

127.0.0.1:6379> zrem list xiaozhang
(integer) 1

zremrangebyrank key start stop:按照排名範圍刪除元素

example:

127.0.0.1:6379> zremrangebyrank list 0 1
(integer) 2

zremrangebyscore key min max:按照分數範圍刪除元素

example:

127.0.0.1:6379> zremrangebyscore list 50 120
(integer) 2

擴充套件命令

zrangebyscore key min max [withscores][LIMIT offset count]:返回分數在[min,max]的成員並按照分數從低到高排序。[withscores]:顯示分數;[LIMIT offset count]:offset,表明從腳標為offset的元素開始並返回count個成員

example:

127.0.0.1:6379> zrangebyscore list 50 120 withscores limit 0 2
1) "xiaoming"
2) "50"
3) "xiaohong"
4) "100"

zincrby key increment member:設定指定成員的增加的分數,返回值是更改後的分數

example:

127.0.0.1:6379> zincrby list 30 xiaoming
"80"

zcount key min max:獲取分數在[min,max]之間的成員

example:

127.0.0.1:6379> zcount list 80 120
(integer) 2

zrank key member:返回成員在集合中的排名(索引從小到大)

example:

127.0.0.1:6379> zrank list xiaohong
(integer) 1

zrevrank key member:返回成員在集合中的排名。(索引從大到小)

example:

127.0.0.1:6379> zrevrank list xiaozhang
(integer) 0

6、通用Redis命令【重點】

keys pattern:獲取所有與pattern匹配的key,返回所有與該key匹配的keys。*表示任意一個或者多個字元

萬用字元:

  • *表示任意0個或者多個字元
  • ?表示任意一個字元

exits key:判斷該key是否存在,1表示存在,0表示不存在

example:

127.0.0.1:6379> exists username
(integer) 1
127.0.0.1:6379> exists admin
(integer) 0

rename key newkey:為當前的key重新命名

127.0.0.1:6379> rename username user
OK
127.0.0.1:6379> keys *
 1) "list"
 2) "abc"
 3) "set1"
 4) "information"
 5) "set2"
 6) "age"
 7) "score2"
 8) "set4"
 9) "score1"
10) "set3"
11) "user"

type key:獲取指定的key的值型別,該命令將以字串的格式返回。返回的字串為string、list、set、hash和zset,

如果key不存在返回none

example:

127.0.0.1:6379> type user
string
127.0.0.1:6379> type list
zset

expire key:設定過期時間,單位:秒 如果某個key過期,redis會將其刪除

example:

127.0.0.1:6379> expire abc 10
(integer) 1
127.0.0.1:6379> keys *
 1) "list"
 2) "set1"
 3) "information"
 4) "set2"
 5) "age"
 6) "score2"
 7) "set4"
 8) "score1"
 9) "set3"
10) "user"

ttl key:獲取該key所剩的超時時間,如果沒有設定超時時間,返回-1.如果返回-2表示超時不存在。

example:

127.0.0.1:6379> expire user 10
(integer) 1
127.0.0.1:6379> ttl user
(integer) 3
127.0.0.1:6379> ttl user
(integer) -2
127.0.0.1:6379> keys *
1) "list"
2) "set1"
3) "information"
4) "set2"
5) "age"
6) "score2"
7) "set4"
8) "score1"
9) "set3"
127.0.0.1:6379> ttl information
(integer) -1

7、Redis其他特性

訊息訂閱與釋出

subscribe channel:訂閱頻道

example:

127.0.0.1:6379> subscribe mychat
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "mychat"
3) (integer) 1

psubscribe channel*:批量訂閱頻道

example:

127.0.0.1:6379> psubscribe s*
Reading messages... (press Ctrl-C to quit)
1) "psubscribe"
2) "s*"
3) (integer) 1

publish channel content:在指定的頻道中釋出訊息

example:

127.0.0.1:6379> publish mychat 'today is a newday'
(integer) 1

多資料庫

傳統資料庫如MySQL資料庫可以自己用語句自定義建立,我們可以通過create database xxxx進行建立。Redis 也是有資料庫的,不過Redis已經提前建立好了。在redis預設有十六個資料庫,0,1,2…15,在radis上所作的所有資料操作,都是預設在0號資料庫上操作,資料庫與資料庫之間是不能共享鍵值對的。我們可以把Redis資料庫理解為一個map集合。

切換資料庫

select 資料庫名:切換資料庫

example:

127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 15
OK
127.0.0.1:6379[15]> select 16
(error) ERR DB index is out of range

資料庫的移植

move newkey 資料庫名:將當前資料庫的key移植到指定的資料庫中

example:

127.0.0.1:6379> keys *
1) "list"
2) "set1"
3) "information"
4) "set2"
5) "age"
6) "score2"
7) "set4"
8) "score1"
9) "set3"
127.0.0.1:6379> move information 1
(integer) 1
127.0.0.1:6379> keys *
1) "list"
2) "set1"
3) "set2"
4) "age"
5) "score2"
6) "set4"
7) "score1"
8) "set3"
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "information"

資料庫清空

flushdb 刪除當前資料庫中的所有key

flushall 刪除所有資料庫中的所有key

伺服器命令

ping 測試連線是否存活

example:

127.0.0.1:6379> ping
PONG

echo 在命令列列印一些內容

example:

127.0.0.1:6379> echo hehe
"hehe"

quit/Ctrl+C 退出客戶端

example:

127.0.0.1:6379> quit

dbsize 返回當前資料庫中的key的數目

example:

127.0.0.1:6379> dbsize
(integer) 8

info 獲取伺服器的資訊和統計

example:

127.0.0.1:6379> info
# Server
redis_version:4.9.103
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:d727e4f6fe88cefd
redis_mode:standalone
......
......

8、Redis持久化策略

RDB策略

RDB是redis的預設持久化機制,相當於照快照,儲存的是一種狀態

優點:

  • 快照速度極快,還原資料速度極快
  • 適用於災難備份

缺點:

  • 小記憶體機器不適合使用

RDB機制符合要求就會照快照(隨時隨地啟動),會佔用一定的系統資源(突然的)很可能記憶體不足直接宕機。(宕機後,伺服器會關閉,屬於非正常關閉,資料會丟失)

RDB機制適用於記憶體比較充裕的計算機

RDB是何時進行照快照?

  • 伺服器正常關閉時,會照一次快照
  • key滿足一定條件時,會照一次快照
  • save 900 1#每900秒至少有1個key發生變化,則dump記憶體快照
  • save 300 10#每300秒至少有10個key發生變化,則dump記憶體快照
  • save 60 10000#每60秒至少有10000個key發生變化,則dump記憶體快照

AOF策略

AOF策略是一種使用日誌功能儲存資料操作的機制,預設AOF機制關閉的,它的操作只會儲存導致key變化的語句

優點:

  • 持續性佔用極少量的記憶體資源

缺點:

  • 日誌檔案會特別大,不適用於災難恢復
  • 恢復效率遠遠低於RDB

AOF機制適用於記憶體比較小的計算機

AOF是如何進行資料備份的呢?

  • 每秒同步:每秒進行一次AOF儲存資料,安全性低,比較節省系統資源
  • 每修改同步:只要有key變化語句,就進行AOF儲存資料,比較安全,但是這樣做極為浪費系統資源,降低效率
  • 不同步:不進行任何持久化操作,這種配置不安全

AOF的配置

  • always #每秒有資料修改發生時都會寫入AOF檔案
  • everysec #每秒同步一次,該策略為AOF的預設策略
  • no #從不同步。高效但是資料不會被持久化

開啟AOF機制的方法

  1. 在redis.config檔案中用:/aof找到對應的段落
  2. 將appendonly no改成appendonly yes
  3. 再修改其中一段成appendfsync always即可