redis中對基本資料型別的操作
一、redis中對字串型別的資料結構的操作與使用
字串是redis的最基礎的資料結構,其他的集中型別的資料結構都是在字串的基礎上構建的。字串型別的值可以是字串、數字、二進位制,但是指最大不能超過512M。
1、字串的基本操作
(1)設定值
命令:SET key value [EX seconds] [PX milliseconds] [NX|XX]
選項:EX seconds:為鍵設定妙級的過期時間, 相當於setex命令
PX milliseconds:為鍵設定毫秒級別的過期時間
NX:鍵必須不存在,才可以設定成功,用於新增,相當於setnx命令
XX:鍵必須存在,才可以設定,用於更新
# 設定一個鍵,值為dayi1234
127.0.0.1:6379> SET name dayi1234
OK
# 新增一個鍵hello,值為world
127.0.0.1:6379> SETNX hello world
(integer) 1
# 更新鍵name的值
127.0.0.1:6379> set name dayi123 xx
OK
(2)獲取值
命令:GET key
# 獲取設定的name的值
127.0.0.1:6379> GET name
"dayi123"
(3)批量設定值
命令:MSET key value [key value ...]
# 同時設定多個鍵值對
127.0.0.1:6379> MSET name liuy age 25 job it
OK
(4)批量獲取值
命令:MGET key [key ...]
# 獲取剛才設定的多個鍵的值
127.0.0.1:6379> MGET name age job
1) "liuy"
2) "25"
3) "it"
相對於獲取及設定單個值,批量操作有助於提高業務效率。
(5)計數
命令:INCR key
Inrc用於對值做自增操作,返回結果中,如果值不是整數,則返回錯誤;值是整數,則返回自增後的結果;如果鍵不存在,按照值為0自增,返回結果為1。
除了inrc外,redis還有自減decr命令,自增指定數字incrby命令、自減指定數字decrby命令以及自增浮點數incrbyfloat命令。
# 對年齡自增
127.0.0.1:6379> INCR age
(integer) 26
# 由於name為字串所以報錯
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
# 對一個不存在的鍵自增,則返回1
127.0.0.1:6379> incr age1
(integer) 1
# 對年齡進行自減
127.0.0.1:6379> DECR age
(integer) 25
# 對年齡自減指定的數字
127.0.0.1:6379> DECRBY age 8
(integer) 17
(6)追加值
命令:APPEND key value
# 向字串末尾追加字串
127.0.0.1:6379> APPEND name an
(integer) 6
127.0.0.1:6379> get name
"liuyan"
(7)獲取字串的長度
命令:STRLEN key
# 獲取name的值得長度
127.0.0.1:6379> STRLEN name
(integer) 6
(8)設定值並返回原值
命令:GETSET key value
# 設定一鍵值
127.0.0.1:6379> GETSET city shanghai
(nil)
127.0.0.1:6379> get city
"shanghai"
# 重新設定時會返回上一個值
127.0.0.1:6379> GETSET city beijing
"shanghai"
127.0.0.1:6379> get city
"beijing"
(9)設定指定位置的字串
命令:SETRANGE key offset value
127.0.0.1:6379> get name
"liuyan"
127.0.0.1:6379> SETRANGE name 3 L
(integer) 6
127.0.0.1:6379> GET name
"liuLan"
(10)獲取部分字串
命令:GETRANGE key start end
# 檢視第0個到第二個字串
127.0.0.1:6379> GETRANGE name 0 2
"liu"
2、字串的內部編碼
字串的內部編碼有三種,分別是8個位元組的長整型(int),小於等於39個位元組的字串(embstr),大於39個位元組的字串(raw),redis會根據當前值得型別和長度決定使用哪種內部編碼實現。
# name的內部編碼為raw
127.0.0.1:6379> OBJECT encoding name
"raw"
# age的內部編碼為int
127.0.0.1:6379> OBJECT encoding age
"int"
3、字串型別主要應用場景
(1)快取
(2)計數
(3)共享session
(4)限速
二、redis中對hash型別的資料的操作與使用
Redis中雜湊型別的資料結構是指鍵值本身又是一個鍵值對的結構。雜湊型別中的對映關係叫做field-value,value值field對應的值。
1、hash型別資料結構的操作命令
(1)設定值
命令:HSET key field value
# 設定一個hash型別的鍵值
127.0.0.1:6379> HSET user:1 name dayi
(integer) 1
127.0.0.1:6379> HSET user:1 age 22
(integer) 1
(2)獲取值
命令:HGET key field
# 獲取user:1的name域對應的值
127.0.0.1:6379> HGET user:1 name
"dayi"
# 獲取user:1下的所有值
127.0.0.1:6379> HGETALL user:1
1) "name"
2) "dayi"
3) "age"
4) "22"
(3)刪除field
命令:HDEL key field [field ...]
# 刪除user:1的age
127.0.0.1:6379> HDEL user:1 age
(integer) 1
(4)計算field的個數
命令:HLEN key
# 計算user:1中field的
127.0.0.1:6379> HLEN user:1
(integer) 1
(5)批量設定faield-value
命令:HMSET key field value [field value ...]
# 設定一個user:3,同時設定多個faield-value
127.0.0.1:6379> HMSET user:3 name day age 25 job it city shanghai
OK
(6)批量獲取faield-value
命令:HMGET key field [field ...]
# 獲取剛設定的user:3中的name、city、age的值
127.0.0.1:6379> HMGET user:3 name age city
1) "day"
2) "25"
3) "shanghai"
(7)判斷field是否存在
命令:HEXISTS key field
# 判斷user:3中的name是否存在
127.0.0.1:6379> HEXISTS user:3 name
(integer) 1
(8)獲取所有的field
命令:HKEYS key
# 獲取user:3中的所有key
127.0.0.1:6379> HKEYS user:3
1) "name"
2) "age"
3) "job"
4) "city"
(9)獲取所有的value
命令:HVALS key
# 獲取user:3中的所有value
127.0.0.1:6379> HVALS user:3
1) "day"
2) "25"
3) "it"
4) "shanghai"
(10)計算value的字串長度
命令:HSTRLEN key field
# 計算user:3中city值得字串長度
127.0.0.1:6379> HSTRLEN user:3 city
(integer) 8
2、hash型別的內部編碼
(1)ziplist(壓縮列表):當hash型別元素個數小於hash-max-ziplist-entries配置(預設512個),同時所有的值都小於hash-max-ziplist-value配置(預設64位元組),redis會使用ziplist。Ziplist節省記憶體。
(2)hashtable(雜湊表):hash無法滿足ziplist時會使用hashtable。
# 檢視user:3的內部編碼
127.0.0.1:6379> OBJECT encoding user:3
"ziplist"
3、應用場景
主要用於快取。
三、redis中對list型別的資料的操作與使用
Redis中列表是用來儲存多個有序的字串,列表中的每個字串稱之為元素,一個列表最多可以儲存2^32-1個元素,redis中,可以對列表兩端插入(push)和彈出(pop),還可以獲取指定範圍的元素列表,獲取指定索引下表元素。列表可以充當棧和佇列的角色。
列表的特點:列表中的元素是有序的,可以通過索引或者下標獲取某個元素或者某個範圍內的原色列表;列表中的元素可以是重複的。
1、列表型別的資料操做命令
(1)新增
命令:
從右邊插入元素:RPUSH key value [value ...]
從左邊插入元素:LPUSH key value [value ...]
向某個元素前或者後插入元素:LINSERT key BEFORE|AFTER pivot value
# 從右邊插入元素3、2、1
127.0.0.1:6379> RPUSH list1 3 2 1
(integer) 3
# 從左邊插入元素4、5、6
127.0.0.1:6379> LPUSH list1 4 5 6
(integer) 6
# 在3的後面插入0
127.0.0.1:6379> LINSERT list1 AFTER 3 0
(integer) 7
(2)查詢元素
命令:
獲取指定範圍內的元素列表:LRANGE key start stop
獲取列表指定索引下表的元素:LINDEX key index
獲取列表的長度:LLEN key
#獲取當前列表的長度
127.0.0.1:6379> LLEN list1
(integer) 7
#檢視當前列表中的所有元素
127.0.0.1:6379> LRANGE list1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "0"
6) "2"
7) "1"
#獲取列表的最後一個元素
127.0.0.1:6379> LINDEX list1 -1
"1"
#獲取列表中的第二個元素
127.0.0.1:6379> LINDEX list1 2
"4"
(3)刪除元素
命令:
從列表的左側彈出元素:LPOP key
從列表的右側彈出元素:RPOP key
按照索引範圍修改列表:LTRIM key start stop
刪除指定的元素:LREM key count value
LREM會從列表中找到等於value的元素進行刪除,當count大於0時,從左到右, 刪除最多count個元素,當count小於0時,從右到左,刪除最多count絕對值個元素, 當count等於0時,刪除所有的值為value的元素。
#從列表的最左側刪除一個元素
127.0.0.1:6379> LPOP list1
"6"
#從列表的最右側刪除一個元素
127.0.0.1:6379> RPOP list1
"1"
# 只保留第二道第六個元素,即第一個元素會被刪除
127.0.0.1:6379> LTRIM list1 1 5
OK
# 從左邊開始新增五個元素
127.0.0.1:6379> LPUSH list1 1 1 1 1 1
(integer) 9
# 從左邊開始刪除4個1
127.0.0.1:6379> LREM list1 4 1
(integer) 4
(4)修改元素
命令(根據索引下表修改):LSET key index value
# 將第0個元素的值修改為start
127.0.0.1:6379> LSET list1 0 start
OK
(5)阻塞操作
命令:阻塞式彈出命令:BLPOP key [key ...] timeout
BRPOP key [key ...] timeout
blpop和brpop是lpop和rpop的阻塞版本,在使用的過程中,如果列表為空,客戶端會等到timeout時間到後會自動返回,如果timeout等於0則會一直等待下去;如果列表不為空,則會立即返回。
# 列表為空等待三秒後返回結果
127.0.0.1:6379> BRPOP list2 3
(nil)
(3.05s)
# 列表不為空,會立即返回結果
127.0.0.1:6379> BRPOP list1 3
1) "list1"
2) "2
在使用brop時,如果是多個鍵,那麼brop會從左至右遍歷鍵,一旦有一個鍵能彈出鍵,客戶端立即返回;如果多個客戶端對同一個鍵執行brpop,那麼最先執行brpo命令的客戶端可以獲取彈出的值。
2、列表型別的內部編碼
(1)ziplist(壓縮列表):當列表的元素個數小於list-max-ziplist-entries配置(預設512),同時列表中每個元素的值都小於list-max-ziplist-value(預設64位元組)時使用ziplist。
(2)linkdedlist(連結串列):當列表型別五碼滿足ziplist時。
(3)quicklist(快速列表):Redis 3.2版本中新加的資料結構,用在列表的底層實現
#檢視剛才設定的列表的內部編碼
127.0.0.1:6379> OBJECT encoding list1
"quicklist"
3、列表應用場景
(1)lpush+lpop=stack(棧)
(2)lpush+rpop=queue(佇列)
(3)lpush+ltrim=capped collection(有限集合)
(4)lpush+brpop=message queue(訊息佇列)
四、redis中對set型別的資料的操作與使用
集合型別也是用來儲存多個字串元素,並且集合中不能有重複元素,並且集合中的元素是無序的,也就意味著集合不能通過下標獲取元素。一個集合最多可以儲存2^32-1個元素。Redis對集合的操作除了增刪改查外,還可以對多個集合取交集、並集、差集。
1、集合內的操作命令
(1)新增元素
命令:SADD key member [member ...]
# 對集合新增元素
127.0.0.1:6379> SADD set1 a b c d
(integer) 4
(2)刪除元素
命令:SREM key member [member ...]
# 刪除集合set中的元素a、b
127.0.0.1:6379> SREM set1 a b
(integer) 2
(3)計算元素的個數
命令:SCARD key
Scard不會遍歷集合所有元素,直接用redis內部變數
# 計算集合set11元素的數量
127.0.0.1:6379> SCARD set1
(integer) 2
(4)判斷元素是否在集合中
命令:SISMEMBER key member
# 判斷元素c是否在集合set1中
127.0.0.1:6379> SISMEMBER set1 c
(integer) 1
(5)隨機從集合返回指定個數元素
命令:SRANDMEMBER key [count]
Count為返回元素的個數,不指定個數,預設為1
# 從集合set1中隨機彈出一個元素
127.0.0.1:6379> SRANDMEMBER set1
"c"
(6)獲取集合中所有的元素
命令:SMEMBERS key
# 獲取集合set1中的所有元素
127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "c"
(7)從集合中隨機彈出元素
命令: SPOP key [count]
Count為隨機彈出元素的個數,不指定則預設為1
# 從集合set1中隨機彈出一個元素
127.0.0.1:6379> SPOP set1
"d"
# 檢視彈出後剩餘的元素個數
127.0.0.1:6379> SMEMBERS set1
1) "c"
2、集合間的操作命令
集合間的操作主要有求集合的交集、並集及差集
# 在操作前先設定兩個集合
127.0.0.1:6379> SADD myset1 a b c d e
(integer) 5
127.0.0.1:6379> SADD myset2 e f 0 1 2
(integer) 5
(1)求多個集合的交集
命令:SINTER key [key ...]
求到的交集儲存到新的集合中命令:SINTERSTORE destination key [key ...]
# 求集合myset1和myset2的交集
127.0.0.1:6379> SINTER myset1 myset2
1) "e"
# 將求到的交集儲存到新的集合mytestsinter中
127.0.0.1:6379> SINTERSTORE mytestsinter myset1 myset2
(integer) 1
(2)求多個集合的並集
命令:SUNION key [key ...]
將求到的並集儲存到新的集合中命令:SUNIONSTORE destination key [key ...]
# 求集合myset1和myset2的並集
127.0.0.1:6379> SUNION myset1 myset2
1) "a"
2) "f"
3) "e"
4) "0"
5) "b"
6) "1"
7) "d"
8) "c"
9) "2
(3)求集合的差集
命令:SDIFF key [key ...]
將求到的差集儲存到新的集合中的命令: SDIFFSTORE destination key [key ...]
# 求集合myset1和myset2的差集,會將myset1中有的,myset2中沒有的元素打印出來
127.0.0.1:6379> SDIFF myset1 myset2
1) "a"
2) "b"
3) "d"
4) "c
3、集合的內部編碼
(1)intset(整數集合):當集合中的元素都是整數且元素個數小於set-max-intest-entries配置時。
(2)hashtable(雜湊表):無法滿足inset時會使用hashtable
# 集合myset2中有字母,所以編碼為hashtable
127.0.0.1:6379> OBJECT encoding myset2
"hashtable"
4、集合使用場景
(1)sadd = tagging(標籤)
(2)spop/srandmember = random item(生成隨機數,如抽獎)
(3)sadd + sinter = Social Graph(社交需求)
五、redis中對有序集合型別的資料的操作與使用
有序集合相對於集合而言,有序集合中的元素是可以排序的,有序集合排序的依據是是給每個元素設定一個分數(score)做為排序的依據。有序集合中的元素是不能重複的,但是元素的分數(score)是可以重複的。
1、有序集合內的操作命令
(1)新增成員
命令:ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
選項說明:
Nx:member必須不存在,才可以設定成功,用於新增
Xx: member必須存在,才可以設定成功,用於更新。
Ch: 返回此次操作後,有序集合元素和分數發生變化的個數。
Incr:對score做增加
# 向有序集合中新增一個元素
127.0.0.1:6379> ZADD class:1 100 dayi123
(integer) 1
# 向有序集合中新增多個元素
127.0.0.1:6379> ZADD class:1 101 liu 102 liuyi 103 dyi
(integer) 3
# 更新dayi123的分數,並返回操作後分數發生變化的元素的個數
127.0.0.1:6379> ZADD class:1 xx ch 200 dayi123
(integer) 1
(2)計算成員的個數
命令:ZCARD key
# 計算class:1的元素個數
127.0.0.1:6379> ZCARD class:1
(integer) 4
(3)計算某個成員的分數
命令:ZSCORE key member
# 計算class:1中dayi123的分數
127.0.0.1:6379> ZSCORE class:1 dayi123
"200"
(4)計算成員的排名
命令:ZRANK key member
ZREVRANK key member
ZRANK依據分數從低到高進行排名,ZREVRANK是依據分數從高到低進行排名
# 從高到低獲取dayi123的名次
127.0.0.1:6379> ZREVRANK class:1 dayi123
(integer) 0
# 從低到高獲取dayi123的名次
127.0.0.1:6379> ZRANK class:1 dayi123
(integer) 3
(5)刪除成員
命令:ZREM key member [member ...]
# 刪除class:1中的成員liu
127.0.0.1:6379> ZREM class:1 liu
(integer) 1
(6)增加成員分數
命令:ZINCRBY key increment member
# 給class:1中成員dayi123再增加50分
127.0.0.1:6379> ZINCRBY class:1 50 dayi123
"250"
(7)返回指定排名範圍的成員
命令:ZRANGE key start stop [WITHSCORES]
ZREVRANGE key start stop [WITHSCORES]
ZRANGE是依據分數從低到高返回,ZREVRANGE是依據分數從高到低返回。
# 依據分數從高到低返回class:1中的排名一二的成員
127.0.0.1:6379> ZREVRANGE class:1 0 1
1) "dayi123"
2) "dyi"
# 依據分數從低到高返回class:1中排名一二的成員
127.0.0.1:6379> ZRANGE class:1 0 1
1) "liuyi"
2) "dyi"
(8)返回指定分數範圍的成員
命令: ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
ZRANGEBYSCORE按照分數從低到高返回,ZREVRANGEBYSCORE按照分數從高到低返回,
Max,min支援開區間,-inf和+inf分別代表無限小和無限大
選項:
WITHSCORES:同時返回每個成員的分數
[LIMIT offset count]:限制輸出的起始位置和個數
# 輸出分數100到兩百之間的元素並依據分數從小到大排序
127.0.0.1:6379> ZRANGEBYSCORE class:1 100 200 withscores
1) "liuyi"
2) "102"
3) "dyi"
4) "103"
# 輸出分數100到兩百之間的元素並依據分數大到小排序
127.0.0.1:6379> ZREVRANGEBYSCORE class:1 200 100 withscores
1) "dyi"
2) "103"
3) "liuyi"
4) "102
# 輸出分數小於200的元素,並依據分數從高到底排序
127.0.0.1:6379> ZREVRANGEBYSCORE class:1 (200 -inf withscores
1) "dyi"
2) "103"
3) "liuyi"
4) "102"
(9)返回指定分數範圍成員個數
命令:ZCOUNT key min max
# 返回分數為100到兩百之間的成員的個數
127.0.0.1:6379> ZCOUNT class:1 100 200
(integer) 2
(10)刪除指定排名內的成員(按照升序)
命令:ZREMRANGEBYRANK key start stop
# 按照升序刪除排名第一二的元素
127.0.0.1:6379> ZREMRANGEBYRANK class:1 0 1
(integer) 2
(11)刪除指定分數的成員
命令:ZREMRANGEBYSCORE key min max
# 刪除分數大於兩百分的成員
127.0.0.1:6379> ZREMRANGEBYSCORE class:1 (200 +inf
(integer) 1
2、有序集合間的操作
# 操作前先插入先設定兩個有序集合
127.0.0.1:6379> ZADD class:1 100 dayi123 99 lisi 89 wanger 96 zhangsan
(integer) 4
127.0.0.1:6379> ZADD class:2 99 dayi 95 lisi 60 zhangsan 80 liu
(integer) 4
(1)求交集
命令:ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
引數:
destination:將交集的結果儲存到這個鍵
numkeys:需要做交集計算鍵的個數
key [key ...] :需要做交集的鍵
[WEIGHTS weight]:鍵的權重,預設是1,做交集是每個鍵的member將自己的分數乘以這個權重
[AGGREGATE SUM|MIN|MAX]:做交集後的彙總方式,預設是sum
# 求class:1和class:2的交集
127.0.0.1:6379> ZINTERSTORE class 2 class:1 class:2
(integer) 2
127.0.0.1:6379> ZRANGE class 0 -1 withscores
1) "zhangsan"
2) "156"
3) "lisi"
4) "194"
(2)並集
命令:ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
引數:同求交集命令引數相同
# 求class:1和class:2的並集,會對相同元素的分數相加
127.0.0.1:6379> ZUNIONSTORE class:union 2 class:1 class:2
(integer) 6
127.0.0.1:6379> ZRANGE class:union 0 -1 withscores
1) "liu"
2) "80"
3) "wanger"
4) "89"
5) "dayi"
6) "99"
7) "dayi123"
8) "100"
9) "zhangsan"
10) "156"
11) "lisi"
12) "194"
3、有序集合的內部編碼
(1)ziplist(壓縮列表):有序元素的個數小於zset-max-ziplist-entries配置(預設128個),同時每個元素的值都小於zset-max-ziplist-value配置(預設64位元組)時,redis會用ziplist,ziplist能有效減少記憶體的使用。
(2)skiplist(跳躍表):ziplist條件不滿足時使用。
# class:union滿足ziplist條件,所以內部編碼是ziplist
127.0.0.1:6379> OBJECT encoding class:union
"ziplist"
4、有序集合的使用場景
排行榜系統