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的元素,都只能是字符串,如果要存儲其它類型的數據,要加引號作為字符串存儲。