Redis key的操作、5種數據類型及其使用場景


 

redis默認有16個數據庫,第一個數據庫是db0,第16個數據庫是db15,使用下標指定要使用數據庫。

 

先連接到redis服務器,再選擇某個數據庫進行操作:

./redis-cli -h 192.168.1.7  #端口使用默認的6379
select 0  #選擇|切換數據庫,不指定默認使用db0

dbsize  #返回當前數據庫中key的數量

flushdb  #清空當前數據庫
flushall  #清空所有數據庫

 

 

 

可在redis.conf中設置redis的數據庫個數:

 

 


 

 

redis的數據類型及其使用場景

redis是一個鍵值數據庫,存儲的數據都是鍵值對的形式,key都是string類型,value可以是以下5種類型:

  • string  字符串

  常用於緩存、限流、計數器、分布式鎖、分布式session等等。

 

  • hash  哈希

  常用於存儲對象,比如存儲用戶相關信息、存儲商品信息等對象。

 

  • list  列表

  因為是有序的,常用於存儲時間軸上的事件,比如生成歷程報告:

  回顧你與qq一同走過的10年,xx年月日,你注冊了qq號;xx年月日你發布了第一條說說,xx年月日凌晨5點半,你還在和xx聊天;

  學生的成績變化,股市的變化、按評論時間加載的評論等等,隨時間變化。

 

  • set  集合

  常用於存儲無序的多個元素,比如這條說說、朋友圈的贊你的好友,文章標簽,好友分組等

 

  • sorted set  有序集合

  也叫做zset。

  常用於排行榜,比如熱搜、閱讀排行榜、評論排行榜、精華、熱銷商品、金曲排行榜、最火熱點、新聞熱點等等。

 

 


 

 

key的常用操作

set name chy  #設置一個鍵值對,如果key已存在,則是修改對應的值
setnx name "chy01" #多個后綴nx,name不存在才設置,若name已存在,則不作任何操作,可以保護原值不被覆蓋。
mset name "chy" age 22 #同時設置|修改多個鍵值對,key1 value1 key2 value2......

get name #獲取name的值,如果name不存在,返回nil
mget name age #同時獲取多個key的值


getset name "chy1" #先獲取name原來的值,再重新賦值



type name  #查看key對應的值的數據類型


rename name myname #重命名key。將name重命名為myname,如果myname已存在,會覆蓋myname原來的值 
renamenx name myname #多了nx,如果myname不存在,才執行重命名,並返回1;如果myname已存在,則不執行重命名,返回0


randomkey #從當前數據庫中隨機返回一個key。返回的是key,不是value


exists name  #檢查指定的key是否存在,存在則返回1,不存在返回0
del name#刪除一個鍵值對,返回1。若指定的鍵(值對)不存在,返回0




expire name 60  #設置某個鍵值對的過期時間(有效期),單位s。60s后name鍵值對過期,自動刪除該鍵值對。比如說24h后刪除此說說。

pexpire name 60000 #多了前綴p,表示單位是ms

expireat name 1232323232323 #多了后綴at,表示使用時間戳,單位依然是s,距離1970.01.01 00:00:00 1232323232323秒后過期
pexpireat name 121212122323 #多了前綴p、后綴at,表示使用時間戳+單位ms,距離1970.01.01 00:00:00 121212122323毫秒后過期


ttl name #查看name的過期時間,默認單位s。-2表示此key不存在、已過期、已被刪除,-1表示此key未設置過期時間,永久有效。

persist name #清除設置的過期時間。默認永不過期。



setex name 60 "chy02" #設置|修改一個鍵值對,並設置過期時間。60s后過期,ex即expire。


move name 1 #把name鍵值對移到db1,即鍵值對的剪切


keys n* #使用正則表達式匹配key,返回所有以n開頭的key,匹配的是key。
keys * #獲取所有的key


dump name #序列化指定的鍵值對,返回序列化后的值

 
        

 

 


 

 

string  字符串

string是redis的基礎數據類型。

 

set name "chy" #雙引、單引均可
set age 20 #redis沒有數值類型,值默認是字符串類型,引不引都行。習慣上,key不引,數值型的value不引,中英文、符號之類的引一下。


strlen name  #返回字符串(值)長度

append name "01" #若鍵值對已存在,在值的末尾添加字符串;若key不存在,自動新建(初始化為空串),再執行添加操作。返回操作后字符串(值)的長度


incr age #值的自增。將age的值+1,並返回+1后的值。如果age不存在,會先新建(值初始化為0),再執行自增。常用於主鍵自增,比如訂單編號。
incrby age 5  #指定增量為5,即+5,增量只能是整數
incrbyfloat age 5.0 #增量是浮點數。整數算是一種特殊的浮點數,所以整數也行。
 decr age #值的自減
decrby age  5  #指定減量,即-5




getrange name 0 2 #返回value的[0,2]區間上的字符串。redis的區間都是閉區間,都支持負數索引
getrange name 0 -1 #支持負數索引

 

 


 

 

hash  哈希

hash也叫做散列,一個hash可儲存多個鍵值對,hash中的鍵值對不叫作鍵值對,而是叫做字段。一個 hash 可以存儲 232 - 1(42億+)個字段。

 

 hash中字段值必須是字符串類型。

hset user name "chy"  #在user中添加|更新name字段,如果user不存在,會自動創建。若之前name不存在,添加name字段並返回1;若之前name存在,則更新其值,返回0
hsetnx user name "chy" #多了后綴nx,如果name字段已存在,則不進行任何操作,可以保護name字段的原值不被覆蓋
hmset user name "chy" age 20 #同時添加|更新多個字段


hget user name #獲取單個字段的值
hmget user name age #獲取多個字段的值


hgetall user #獲取整個hash的所有字段(字段名+字段值)
hkeys user #獲取所有的字段名
hvals user #獲取所有的字段值


hdel user name #刪除一個字段。hdel返回刪除的字段個數
hdel user name age #刪除多個字段


hincrby user age 5 #字段值的自增,指定增量,+5
hincrby user age -2 #負值表示字段值的自減,-2。沒有hincr、hdecr、hdecrby命令

hincrbyfloat user age 5.0 #用法同上,只不過支持浮點數
hincrbyfloat user age -2.0 #


hexists user name #判斷某個字段是否存在,存在返回1,不存在返回0

hlen user #獲取字段數

 

h即hash,m即multiple。

user是一個hash,是redis的一個key,值是多個字段。

 

hash適合儲存對象、json數據,一個字段存儲一個屬性。

 

 


 

 

list  列表

list是有序集合,元素可以重復,但元素只能是字符串類型。一個list可以存儲 232 - 1 (42億+)。

 

lpush users "zhangsan" "lisi" #在list的頭部插入一個或多個元素,l即left。若users不存在,會先自動創建,再插入。先插入"zhangsan",再插入"lisi",每次都是在最前面插入,list第一個元素是lisi
lpushx users "zhangsan" "lisi" #多了一個x,表示如果users不存在,不作任何操作,不會自動創建

rpush users "wangwu" "zhaoliu" #在list的尾部插入一個或多個元素,r即right,每次都是在最后面插入,list的最后一個元素是zhaoliu
rpushx users "wangwu" "zhaoliu" #多個一個x,表示如果users不存在,不作任何操作,不會自動創建




lpop users #彈出list的第一個元素。彈出是指返回並刪除一個元素。
rpop users #彈出list的最后一個元素


blpop users 60 #彈出列表的第一個元素,若list是空的,會阻塞等待60s,這60s內list內有了元素就彈出。60是超時時間。b即block,阻塞。
brpop users 60 #最后一個元素



rpoplpush list1 list2 #彈出list1的最后一個元素,並在list2的頭部插入該元素。即把列表的最后一個元素剪切到另一個列表的開頭。
brpoplpush list1 list2 60 #設置超時時間



llen users #返回list的長度(元素個數),第一個l即list

lrange users 0 -1 #返回[0,-1]上的所有元素。redis的區間都是閉區間,都支持負數索引

lindex users 1 #返回指定位置上元素,是查找、並不是刪除。指定下標。

lset users 1 "zhangwei" #修改指定位置上元素,該位置要已存在元素,才能修改,否則報錯。



lrem users 0 "zhangsan" #移除list中所有值為zhangsan的元素。0表示刪除匹配到的所有元素
lrem users 2 "zhangsan" #從前往后搜索,刪除匹配到的前2個元素
lrem users -2 "zhangsan" #從后往前搜索,刪除匹配到的前2個元素。正負表示搜索方向,數值表示刪除個數。


ltrim users 1 3 #修剪list,只保留[1,3]上的元素,會刪除其它元素


linsert users before "zhangsan" "lisi" #從前往后搜索"zhangsan",在匹配的第一個"zhangsan"前面插入元素lisi"。若"zhangsan"不存在,不做任何操作,返回-1;若users不存在,不做任何操作,返回0
lisert users after "zhangsan" "lisi" #
從前往后搜索"zhangsan",在匹配的第一個"zhangsan"后面插入元素lisi"

 

 list適合存儲有序的多個元素,比如評論(時間順序)。

lpush comments '{"id":1,"comment":"質量很好","date":12121212121212}'

元素只能是字符串,可以把整個json數據作為字符串存儲,但整個json必須加引號。

 

 

比如回顧你與qq一同走過的10年,xx年月日,你注冊了qq號;xx年月日你發布了第一條說說,xx年月日凌晨5點半,你還在和xx聊天;

 

學生的成績變化,股市的變化、按評論時間加載的評論等等。

 

 

 


 

 

set  集合

set是無序集合,元素不可重復,元素只能是字符串。一個set可以存儲 232 - 1 (42億+)個元素。

 

sadd users "zhangsan" "lisi"  #向集合中添加一個或多個元素,若users不存在,會自動創建。若set中已有該元素,則不添加該元素,返回本次操作添加的元素個數
srem users "zhangsan" "lisi" #刪除set中的一個或多個元素,若set中沒有該元素,自動跳過


smembers users #返會set中的所有元素

sismember users "zhangsan" #檢測某個元素是否是users的成員,是返回1,不是返回0。s is member ,第一個s即set。

scard users #返回set中的元素個數



spop users #隨機彈出一個元素。set是無序的,只能隨機彈,不能指定彈出哪個元素


srandmember users #隨機返回一個元素。是返回,不是彈出,不會刪除該元素
srandmember users 3  #隨機返回3個元素。隨機返回一個元素,再從剩下的元素中隨機返回一個,再從剩下的元素中隨機返回一個,依此類推。就是說返回的元素各不相同。
srandmember users -3 #負數表示每次都從整個集合中選,不是從剩下的里面選,即返回的元素可能有相同的。若數值大於集合的元素總數,則返回集合中的所有元素。



smove set1 set2 "zhangsan" #把set1中的元素"zhangsan"剪切到set2中



sinter set1 set2 set3 #返回這些集合的交集(共同元素)
sinterstore destset set1 set2 set3 #多了后綴store,表示求交集,並把交集中的元素存儲到集合destset中。返回的是交集中的元素個數


sunion set1 set2 set3 #並集(合並到一起)
sunionstore destset set1 set2 set3


sdiff set1 set2 #求差集(set1中有、set2中沒有的元素)
sdiffstore destset set1 set2

 

常用於存儲無序的多個元素,比如一條說說、朋友圈贊你的好友,博客文章的分類,聯系人分組等。

要存儲多個元素,且這些元素不需要排序。

 

 


 

 

sorted set  有序集合

也叫做zset,元素有序,每個元素都會關聯一個分數(整型、浮點型),通過分數的大小來排序。

元素不能重復,分數可以重復。元素只能是字符串。一個sorted set可以存儲2^32-1(42億+)個元素。

 

zadd grade 90 "zhangsan" 98.5 "lisi" #添加|更新一個或多個元素。關聯的分數在前,元素在后。分數支持整型、浮點型,負數也可以。如果元素已存在,則更新關聯的分數。返回此次操作添加的元素個數

zrangebyscore grade 90 100 #返回分數在[90,100]上的所有元素
zrangebyscore grade 90 100 withscores #返回時帶上對應的分數

zscore grade "zhangsan"  #返回該元素關聯的分數。比如查詢積分。

zincrby grade 5 "zhangsan" #將指定元素關聯的分數+5。比如積分的增減。
zincrby grade -5 "zhangsan" #負數即減,-5


zrange grade 0 -1 #返回[0,-1]上的所有元素。
zrange grade 0 -1 withscores #返回時帶上對應的分數
#zrevrange的用法同上,只不過多了rev,表示按分數降序排列。默認都是按分數升序排列。
#比如獲取排行旁前10的名單



zrank grade "zhangsan" #返回該元素的位置(下標)。
#zrevrank用法同上,只不過按分數降序排列
#比如查詢排名





zcount grade 90 100 #返回分數在[90,100]上的元素個數


zcard grade #返回元素個數


zrem grade "zhangsan" "lisi" #刪除一個或多個元素

zremrangebyrank grade 0 2 #刪除[0,2]上的所有元素
zremrangebyscore grade 90 100  #刪除分數在[90,100]上的所有元素

 

 sorted set常用於排行榜,比如閱讀排行旁、評論排行榜、推薦排行榜、熱搜排行榜、最熱視頻、最火音樂、熱賣商品、人氣指數、積分排名等等。

分數即是衡量指標,上面涉及到下標的操作,默認都是按分數升序排列,可以把前綴z換為zrev,表示按分數降序排列。

要存儲多個元素,且這些元素需要排序。

 

 


 

 

 說明

  • redis中命令不區分大小寫,比如SET、set都是一樣的。但是鍵值對、字段、元素等都要區分大小寫。
  • string是基礎數據類型,hash、list、set、sorted set都是數據結構
  • hash的字段的值,list、set、sorted set的元素,都只能是字符串,如果要存儲其它類型的數據,要加引號作為字符串存儲。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM