天天看點

Redis五種基本資料類型及三種特殊資料類型基礎部分五大資料類型三種特殊資料類型

基礎部分

1:簡介

redis是一個高性能的key-value資料庫,不過與傳統資料庫不同的是redis的資料是存在記憶體中的,是以讀寫速度非常快。可以用做資料庫、緩存和消息中間件,不區分大小寫指令

2:redis啟動

redis-server redis.conf:啟動redis
redis-cli -p 6379:使用redis用戶端進行連接配接

ps -ef|grep redis:檢視目前程序數量
           
Redis五種基本資料類型及三種特殊資料類型基礎部分五大資料類型三種特殊資料類型

3:redis關閉

shutdown:關閉redis

exit:退出redis

Redis五種基本資料類型及三種特殊資料類型基礎部分五大資料類型三種特殊資料類型

五大資料類型

1:Redis-key的基本指令

keys * :檢視目前資料庫所有的key
exists name:檢視資料庫是否存在名稱為name的key
move name 1:将名稱為name的key從目前資料庫移動到資料庫1
expire name 10:設定名稱為name的key10秒鐘後過期
ttl name:檢視名稱為name的key的剩餘時間
type name:檢視名稱為name的key的資料類型
           

2:String(字元串)

set name gaojie:設定name的值
get name:檢視name的值
append name shiwo:在name的值的後面追加shiwo進行拼接(如果名稱為name的key不存在,則等同于 set name shiwo)
del name:删除鍵值對name-gaojie
strlen name:擷取name的value的長度

incr views:将名稱為views的key對應的value值+1(views必須為integer)
decr views:将名稱為views的key對應的value值-1(views必須為integer)
incrby views 10:将名稱為views的key對應的value值+10(views必須為integer)
decrby views 5:将名稱為views的key對應的value值-5(views必須為integer)

getrange name 0 3:獲得名稱為name的key對應的value的前四個字元
getrange name 0 -1:獲得名稱為name的key對應的value的全部字元
setrange name 5 xx:将name的第五個字元替換為xx

setex key 30 hello:設定一個key的值為hello,30秒後過期(set with expire)
setnx key1 hello:設定一個key1的值為hello,key1不存在則才能建立,存在則失敗(set if not exist)
注意:setnx在分布式鎖中常常使用

mset k1 v1 k2 v2 k3 v3 :批量插入k1、k2、k3(存在則更新,不存在則插入)
mget k1 k2 k3:批量檢視k1、k2、k3

msetnx k1 v1 k4 v4:批量插入k1、k4,有一個存在則全部失敗(原子性操作)因為上面已經插入了k1

儲存對象
mset user:1:name zhangsan user:1:age 23 :設定一個對象
mget user:1:name user:1:age:得到對象

getset name gaojie:擷取舊值gaojishiwo,再設定新值gaojie 
先get再set,如果不存在則傳回nil
           

注意:String類似的使用場景:value除了是我們的字元串還可以是我們的數字

3:List(清單)

Redis裡面的list類型其實是每一個子元素都為string類型的雙向連結清單,連結清單的長度為2^32,list可以用作棧、隊列

增
 lpush list one:添加元素one(在左邊添加)
 rpush list rone:添加元素rone(在右邊添加)
 
 删
 lpop list:把最左邊的元素移除
 rpop list:把最右邊的元素移除
 
 改
 lindex list 1:擷取list的第2個值(通過下标擷取值)
 lrem list 1 one:移除list中的一個one值(精确比對)
 ltrim list 1 2 :截斷list隻保留第2個元素到第三個元素區間(其他元素已經删除)
 
 rpoplpush list mylist:将list右邊的第一個元素移動到mylist中
 
 lset list 0 hello:将list中第1個元素的值替換成hello(前提是list必須存在,下标也必須是存在的,不存在就會報錯)
 
 linsert list before world value:在list中world元素之前插入value
 linsert list after world value:在list中world元素之後插入value
 
 查
 lrange list 0 -1:檢視list的全部元素
 lrange list 0 1:檢視list的前2個元素
 
 llen list:傳回list的長度
           

Redis五種基本資料類型及三種特殊資料類型基礎部分五大資料類型三種特殊資料類型

4:Set(集合)

set中的值不允許重複(無序)

增
sadd myset hello:myset中添加hello元素

删
srem myset hello:删除myset中的hello元素
spop myset:随機删除myset一個元素

改
smove myset myset1 a:将a從myset移動到myset2中

查
smembers myset:檢視myset所有元素
sismember myset hello:判斷myset中是否存在hello元素,傳回1表示存在,傳回0表示不存在
scard myset:擷取myset長度
srandmember myset:随機擷取myset中的一個元素(可以用作随機抽獎)
srandmember myset 2:随機擷取myset中的2個元素

myset1中為a、b、c,myset2中為c、d、e
sdiff myset1 myset2:輸出為b、a,取差集(myset1在前,以myset為标準)
sinter myset1 myset2:輸出為c,取交集(可以用作微網誌、b站的共同關注)
sunion myset1 myset2:輸出a、b、c、d、e,取并集
           

5:Hash(散列)

map集合,其實就是key-(key-value)、本質其實和String類型沒有太大差別

增、查
hset user name zhangsan:插入一個user,user裡面是name-zhangsan
hget user name:檢視user的name的值
hmset user name zhangsan age 23 gender man:同時插入user裡面的多個鍵值對
hget user name age gender:擷取user的多個字段的值
hgetall user:擷取user的所有字段和值(鍵和值都展示)
hlen user:擷取user中有多少個鍵值對
hexists user name:判斷user中指定的name字段是否存在
hkeys user:擷取user中的所有key(name、age、gender)
hvals user:擷取user中所有的value(zhangsan、23、man)

改
hincrby user age 1:将user中的age字段的值+1(1為指定的增量)
hsetnx user tel 182:建立user中的tel-182鍵值對,如果不存在則建立,如果存在則建立失敗

删
hdel user gender:删除user中的gender-man鍵值對
           

注意:hash更适合存儲對象,string更适合存儲字元串

Redis五種基本資料類型及三種特殊資料類型基礎部分五大資料類型三種特殊資料類型

6:Zset(有序集合)

在set的基礎上,增加了一個順序屬性,每個元素都關聯一個duoble類型的score,表示權重,通過權重将元素從小到大排列

增
zadd myset 2500 xiaohong:增加一個值
zadd myset 5000 zhangsan 200 xiaoming:增加多個值

删
zrem salary xiaohong:删除xiaohong

查  
zrangebyscore salary -inf +inf:按照salary全部進行升序排序(隻顯示名稱)
zrangebyscore salary -inf +inf withscores:按照salary全部進行升序排序(名稱和salary都顯示)
zrangebyscore salary -inf 2500 withscores:按照salary将小于2500的進行升序排序(名稱和salary都顯示)
zrevrange salary 0 -1 :按照salary全部進行降序排序
zcard salary:擷取myset中的個數
zcount myset 200 5000:擷取集合中200-5000之間的元素個數
           

注意:可以用來做存儲班級成績表、工資表排序、排行榜應用實作!

三種特殊資料類型

1:geospatial(地理位置)

南北級無法直接添加,一般會下載下傳城市資料,通過java程式一次性導入。

經度範圍:-180到+180;緯度範圍:-85.05112到+85.05112

增
geoadd china:city 108.96 34.26 xian:添加xian的地理位置(key為china:city,value為經度 緯度 名稱)
geoadd china:city 116.40 39.90 beijing 114.05 22.52 shenzhen:添加xian、shenzhen的地理位置

查
geopos china:city xian:擷取xian的經度緯度
geopos china:city xian beijing:擷取xian、beijing的經度緯度

geodist china:city xian shenzhen km:擷取xian、shenzhen之間的距離,機關為km(可以是m、km)---------打車的距離計算

georadius china:city 110 30 1000 km:以110 30 經緯度為圓心,1000km為半徑,搜尋範圍内的城市(城市必須存在在目前集合)-------附近的人
georadius china:city 110 30 1000 km withdist:同時顯示距離
georadius china:city 110 30 1000 km withdist count 1:同時顯示距離,隻顯示一個城市
georadius china:city 110 30 1000 km withcoord:同時顯示城市經緯度

georadiusbymemeber china:city beijing 1000 km:以beijing為圓心,1000km為半徑,搜尋範圍内的城市(搜尋結果包括自己)

注意:geo的底層實作原理就是zset,是以可以使用zset指令來操作geo!
           

注意:可以用作朋友的定位,附近的人,打車距離計算等

2:hyperloglog(基數統計)

基數:一個可重複的集合中,不重複元素的個數(是可以接受誤差的)例如: A{1、3、4、7、8、7} 基數=5

優點:占用的記憶體是固定的

增
pfadd mykey a b c d e f g h i j:在mykey中增加10個元素

改
pfmerge mykey3 mykey mykey2:将mykey、mykey2集合合并到mykey3中,取并集 

查
pfcount mykey:統計mykey中的集合基數數量,10個
           

注意:可以用作網頁的UV(一個人通路一個網站多次,但是還是算作一個人),如果允許容錯,可以使用;不允容錯,則不能使用,需要使用set或其他的資料類型

3:bitmaps(位存儲)

bitmaps位圖,資料結構,都是操作二進制位來進行記錄,就隻有0和1兩個狀态!

增
setbit sign 0 0:集合統計周天沒有打卡(末尾0表示未打卡,1表示打卡)
setbit sign 1 1:增加周一的打卡

查
getbit sign 0:檢視周天是否打卡(傳回0表示未打卡,1表示打卡了)
bitcount sign:統計打卡次數(末尾為1的次數)
           

注意:統計使用者資訊、活躍、不活躍!登入未登入!等兩個狀态的都可以使用bitmaps

繼續閱讀