日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

redis命令行操作庫、鍵、和五大數據類型詳解

作者:流水武qin 更新時間: 2022-11-29 編程語言

一、數據庫操作命令

redis默認有16個數據庫,類似數組下標從0開始,初始默認使用0號庫。

1.1 測試是否連通

ping

測試服務器是否連通 返回pone就是連通了

1.2 切換數據庫

select index

1.3 數據移動

move key db

1.4 顯示數據總量

dbsize

1.5 數據清除

flushdb		# 只清除當前庫 
flushall	# 16個庫一起清

二、鍵操作命令

2.1 查看當前庫所有key

keys *

2.2 刪除指定key

立即刪除:

del key

異步刪除:

unlink key

2.3 獲取key是否存在

exists key

2.4 獲取key的類型

type key

2.5 更改key的名字

# 當 key和newkey相同,或者 key不存在時,返回一個錯誤
# 當 newkey 已經存在時, RENAME 命令將覆蓋舊值
rename key newkey	
# 當且僅當newkey不存在時,將key改名為newkey,否則不會改名
renamenx key newkey

2.6 指定key的有效期

# 為當前key設置過期10秒的時間
expire key 10

# 為當前key設置過期10毫秒的時間
pexpire key 10

# 以Unix時間戳格式設置鍵的到期時間(不常用)
expireat key 1393840000

2.7 獲取key的有效期

# 以秒為單位返回 key 的剩余過期時間
ttl key
# 以毫秒為單位返回 key 的剩余過期時間
pttl key

2.8 把key從會過期的換為不會過期

persist key

2.9 查詢模式的使用

語法結構:

keys pattern

使用示例:

keys *          查詢所有key
keys java*      查詢所有以java開頭的key
keys *java     	查詢所有以java結尾的key
keys ??heima    查詢所有前面兩個字符任意,后面以java結尾的key
keys user:?     查詢所有user:開頭,最后一個字符任意的key
keys u[st]er:1  查詢所有以u開頭,以er:1結尾,中間包含一個字母,s或t的key

三、五大數據類型-string

stringredis最基本的類型,一個key對應一個value,是一種單鍵單值的結構。

string類型是二進制安全的。意味著redisstring可以包含任何數據。比如jpg圖片或者序列化的對象。
在這里插入圖片描述

3.1 添加/修改數據

set key value

3.2 獲取數據

get key

3.3 刪除數據

del key

3.4 在key不存在時 設置key的值

setnx key value

3.5 添加/修改多個數據

mset key1 value1 key2 value2 …

3.6 獲取多個數據

mget key1 key2 …

3.7 獲取key對應value的長度

strlen key

3.8 追加信息到原始信息后面

append key value

3.9 將key中儲存的數字值增加指定的值

# 將key中所儲存的值加1(默認就是加1,因此不寫就是加1)
incr key

# 將key中所儲存的值加10
incrby key 10

# 將key中所儲存的值加上指定的浮點數增量值
incrbyfloat key 9.9

3.10 將key中儲存的數字值減少指定的值

# 將key中儲存的數字值減1
decr key

# 將key中所儲存的值減少指定值
decrby key 10

3.11 設置有效時間

# 設置鍵值的同時,設置過期時間(時間單位為秒)
setex key seconds value

# 設置鍵值的同時,設置過期時間(時間單位為毫秒)
psetex key milliseconds value

3.12 設置指定key的值,并返回key的舊值

GETSET db mongodb    # 首次設置沒有舊值,返回 nil
GETSET db redis      # 返回舊值 mongodb

3.13 獲取指定key對應的值的一部分數據

# getrange key 起始位置 結束位置
getrange key 0 3

3.14 覆蓋給定key所儲存的字符串的一部分值

# setrange key 起始位置 value
SETRANGE key 6 "Redis"

覆蓋的位置從偏移量6開始。

3.13 string命名規約

比如新浪微博大V主頁顯示粉絲數與微博數量,這種訪問量很高的數據,我們應按如下規則命名會比較好:

  • redis中為大V用戶設定用戶信息,以用戶主鍵和屬性值作為key,后臺設定定時刷新策略即可。
eg:	user:id:3506728370:fans		→	12210947
eg:	user:id:3506728370:blogs	→	6164
eg:	user:id:3506728370:focuses	→	83
  • 也可以使用json格式保存數據
eg:	user:id:3506728370    →	{“fans”:12210947,“blogs”:6164,“ focuses ”:83 }
  • key 的設置約定
表名 主鍵名 主鍵值 字段名
eg: user id 29437595 fans

這樣設置,不僅規則清晰,之后找數據和排錯也更加方便,便于維護。

3.14 string類型的其它注意事項

  • 數據未獲取到時,返回對應的數據為nil,等同于null

  • 數據最大存儲量:512MB

  • Stringredis內部存儲默認就是一個字符串,當遇到增減類操作incrdecr時會轉成數值型進行計算

  • 按數值進行操作的數據,如果原始數據不能轉成數值,或超越了redis 數值上限范圍,將報錯

  • redis所有的操作都是原子性的,采用單線程處理所有業務,命令是一個一個執行的,因此無需考慮并發帶來

    的數據影響.

3.15 string數據結構詳解

string的數據結構為簡單動態字符串(Simple Dynamic String,縮寫SDS)。

是可以修改的字符串,內部實現類似于JavaArrayList,采用預分配冗余空間的方式來減少內存的頻繁分配。

它內部為當前字符串實際分配的空間capacity一般要高于實際字符串長度len

當字符串長度小于1M時,擴容都是加倍現有的空間。

如果超過1M,擴容時一次只會多擴1M的空間。需要注意的是字符串最大長度為512M

四、五大數據類型-list

list數據類型,一個key對應多個value,是一種單鍵多值的數據結構。

Redis列表是簡單的字符串列表,按照插入順序排序。可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

它的底層實際是個雙向鏈表,對兩端的操作性能很高,通過索引下標的操作中間的節點性能會較差。

宏觀來看就是key存儲這一個list的這樣結構的數據:

在這里插入圖片描述

4.1 添加/修改數據

# 從左邊插入數據
# 語法:lpush key value1 [value2] ……
lpush key 10 20 30

# 從左邊插入數據
# 語法:rpush key value1 [value2] ……
rpush key 10 20 30

4.2 獲取并移除一個數據(彈出數據)

lpop key    # 從左側彈出
rpop key    # 從右側彈出

每次操作只會彈出一個數據,最終值在鍵在,值光鍵亡。

4.3 從key1列表右邊吐出一個值,插到key2列表左邊

rpoplpush key1 key2

4.4 按照索引下標獲得元素(從左到右獲取)

lrange key start stop

# 示例
# 0左邊第一個,-1右邊第一個,這就表示獲取所有的意思
lrange mylist 0 -1

range操作不會移除元素,和pop操作是不同的

4.5 按照索引下標獲得元素(從左到右)

lindex key index 

4.6 獲得列表長度

llen key

4.7 在value的后面插入newvalue

linsert key before value newvalue

4.8 刪除count個和value相等的元素

lrem key count value

# 示例 刪除5個redis字符串
lrem mylist 5 redis
  • count > 0 : 從表頭開始向表尾搜索,移除與value相等的元素,數量為count
  • count < 0 : 從表尾開始向表頭搜索,移除與value相等的元素,數量為count的絕對值。
  • count = 0 : 移除表中所有與value相等的值。

4.9 將列表key下標為index的值替換成指定value

lset key index value 

4.10 規定時間內獲取并移除數據

# 在指定時間內 從左邊移出并獲取列表的第一個元素
blpop key1 [key2] timeout
# 在指定時間內 從右邊移出并獲取列表的第一個元素
brpop key1 [key2] timeout
# 在指定時間內 從source列表中取出最后一個元素,并插入到另外一個列表destination的頭部
brpoplpush source destination timeout

4.11 list的數據結構

list的數據結構為快速鏈表quickList

首先在列表元素較少的情況下會使用一塊連續的內存存儲,這個結構是ziplist,也即是壓縮列表。

它將所有的元素緊挨著一起存儲,分配的是一塊連續的內存。當數據量比較多的時候才會改成quicklist

因為普通的鏈表需要的附加指針空間太大,會比較浪費空間。

比如這個列表里存的只是int類型的數據,結構上還需要兩個額外的指針prevnext

redis將鏈表和ziplist結合起來組成了quicklist。也就是將多個ziplist使用雙向指針串起來使用。
在這里插入圖片描述

這樣既滿足了快速的插入刪除性能,又不會出現太大的空間冗余。

五、五大數據類型-hash

hash數據類型是一個鍵值對集合,可以理解為左邊一個key,對右邊一個存儲空間。

右邊這塊兒存儲空間叫hash,也就是說hash是指的一個數據類型。

它指的不是一個數據,是這里邊的一堆數據,那么它底層呢,是用hash表的結構來實現的。

值得注意的是:

如果右邊存儲空間數量較少,存儲結構優化為類數組結構。

如果右邊存儲空間數量較多,存儲結構使用HashMap結構。

在這里插入圖片描述

宏觀來看就是一個string類型的field(字段)和value(值)的映射表,特別適合用于存儲對象。

類似Java里面的Map<String,Object>

比如用戶id為查找的key,存儲的value為用戶對象的各個字段的鍵值對:如果用普通的key/value結構來存儲

在這里插入圖片描述

這樣通過 **key(用戶ID) + field(屬性標簽) **就可以操作對應屬性數據了。

既不需要重復存儲數據,也不會帶來反復序列化和并發修改控制的問題。

5.1 添加/修改數據

# key 是redis的鍵   field是hash中數據的鍵
hset key field value
# 示例
hset key name "張三"

5.2 獲取數據

# 從key中取出 hash的鍵為field的值
hget key field

# 獲取key中全部的hash數據
hgetall key

5.3 刪除數據

# 設置了幾個field就刪除幾個
hdel key field1 field2...

5.4 設置field的值,如果該field存在則不做任何操作

hsetnx key field value

5.5 添加/修改多個數據(批量添加)

hmset key field1 value1 field2 value2 …

5.6 獲取多個數據

hmget key field1 field2 …

5.7 獲取哈希表中字段的數量

hlen key

5.8 獲取哈希表中是否存在指定的字段

hexists key field

5.9 列出該hash集合的所有field

hkeys key

5.10 列出該hash集合的所有value

hvals key

5.11 為哈希表 key 中的域 field 的值加上指定值

# 這里的increment只能是整數
hincrby key field increment

# 這里的increment只能是浮點數
hincrbyfloat key field increment

5.12 當field不存在時才添加field

hsetnx key field value

5.13 hash類型數據其它的注意事項

  • hash類型中value只能存儲字符串,不允許存儲其他數據類型,不存在嵌套現象。

    如果數據未獲取到,對應的值為(nil)。

  • 每個hash可以存儲 2^32-1個鍵值對

    hash類型十分貼近對象的數據存儲形式,并且可以靈活添加刪除對象屬性。

    hash設計初衷不是為了存儲大量對象而設計 的,切記不可濫用,更不可以將hash作為對象列表使用。

  • hgetall操作可以獲取全部屬性,如果field過多,遍歷整體數據效率會很低,有可能成為數據訪問瓶頸。

5.14 hash類型對應的數據結構

hash類型的數據結構主要有兩種:ziplist(壓縮列表),hashtable(哈希表)。

field-value長度較短且個數較少時,使用ziplist,否則使用hashtable

六、五大數據類型-set

redisset數據類型對外提供的功能與list類似是一個列表的功能,特殊之處在于set是可以自動排重的。

當需要存儲一個列表數據,又不希望出現重復數據時,set是一個很好的選擇。

并且set提供了判斷某個成員是否在一個set集合內的重要接口,這個也是list所不能提供的。

set是一個string類型的無序集合。它底層其實是一個valuenullhash表。
在這里插入圖片描述

所以添加,刪除,查找的復雜度都是O(1)

一個算法,隨著數據的增加,執行時間的長短,如果是O(1),那么意味著隨著數據增加,查找數據的時間不變。

這在大數據查找時就顯得很有優勢了。

6.1 添加數據

sadd key member1 [member2]...

# 示例:
asdd myset 9 8 7

6.2 獲取全部數據

smembers key

6.3 刪除一部分數據

srem key member1 [member2]...

6.4 獲取集合數據總量

scard key

6.5 判斷集合中是否包含指定數據

sismember key member

6.6 隨機獲取集合中指定數量的數據

srandmember key [count]

6.7 隨機獲取集中的某個數據并將該數據移除集合

# count不指定時默認為1
spop key [count]

6.8 把集合中一個值從一個集合移動到另一個集合

# source 源集合的名稱
# destination 目標集合的名稱
# value源集合想要移動的值
smove source destination value

6.9 返回兩個集合的交集元素

sinter key1 key2

6.10 返回兩個集合的并集元素

sunion key1 key2

6.11 返回兩個集合的差集元素

sdiff key1 key2

6.12 求兩個集合的交、并、差集并存儲到指定集合中

# 求兩個集合的交集元素并存儲到destination集合當中
sinterstore destination key1 key2

# 求兩個集合的并集元素并存儲到destination集合當中
sunionstore destination key1 key2

# 求兩個集合的差集元素并存儲到destination集合當中
sdiffstore destination key1 key2

6.13 set 類型數據操作的注意事項

  • set 類型不允許數據重復,如果添加的數據在set中已經存在,將只保留一份。

  • set 雖然與hash的存儲結構相同,但是無法啟用hash中存儲值的空間。

6.14 set類型的數據結構

Set數據結構是dict字典,字典是用哈希表實現的。

JavaHashSet的內部實現使用的是HashMap,只不過所有的value都指向同一個對象。

redisset結構也是一樣,它的內部也使用hash結構,所有的value都指向同一個內部值。

七、五大數據類型-Zset(sorted set)

Redis有序集合zset與普通集合set非常相似,是一個沒有重復元素的字符串集合。

不同之處是有序集合的每個成員都關聯了一個評分(score)。

這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。

集合的成員是唯一的,但評分可以重復 。

因為元素是有序的, 所以你也可以很快的根據評分(score)或者次序(position)來獲取一個范圍的元素。

并且訪問有序集合的中間元素也是非常快的。

優勢利用zset實現一個文章訪問量的排行榜,就是非常不錯的選擇。

7.1 將一個或多個元素及其score 值加入到有序集 key 當中

# 就是每個值前面得加一個分數用來排序
zadd key score1 value1 score2 value2

7.2 返回有序集key中,下標在start到stop之間的元素

# WITHSCORES可加可不加,但是加了可以讓分數一起和值返回到結果集
zrange key start stop [WITHSCORES]

# 示例:獲取key中下邊0-5之間的元素
zrange key 0 5 WITHSCORES

7.3 返回有序集key中,所有 score 值介于min和max之間的元素

zrangebyscore key min max [withscores] [limit offset count]

# 示例
ZRANGEBYSCORE salary -inf +inf					# 顯示整個有序集salary的數據
ZRANGEBYSCORE salary -inf +inf WITHSCORES    	# 顯示整個有序集及成員的 score 值
ZRANGEBYSCORE salary -inf 5000 WITHSCORES    	# 顯示工資 <=5000 的所有成員
ZRANGEBYSCORE salary (5000 400000				# 顯示工資大于 5000 小于等于 400000 的成員
ZRANGEBYSCORE salary (5000 (400000				# 顯示工資大于 5000 小于 400000 的成員

包括等于 min 或 max 的元素

返回值按score從小到大排列

zrevrangebyscore key max min [withscores] [limit offset count]

這個和上面的用法幾乎一樣,只不過返回值按score從大到小排列

7.4 為元素的score加上增量 increment

zincrby key increment value

# 示例
zincrby myzset 2 "one"		# 返回值是增加后的分數

7.4 刪除有序集合中指定值的元素

zrem key value

7.5 統計該有序集分數區間內的元素個數

zcount key min max

7.6 返回該值在有序集合中的排名,從0開始

zrank key value>

7.8 zset的數據結構

zsetredis提供的一個非常特別的數據結構。

一方面它等價于Java的數據結構Map<String, Double>,可以給每一個元素value賦予一個權重score。

另一方面它又類似于TreeSet,內部的元素會按照權重score進行排序,可以得到每個元素的名次,還可以通過

score的范圍來獲取元素的列表。

zset底層使用了兩個數據結構:

  • hashhash的作用就是關聯元素value和權重score

    保障元素value的唯一性,可以通過元素value找到相應的score值。

  • 跳躍表,跳躍表的目的在于給元素value排序,根據score的范圍獲取元素列表。

zrevrangebyscore key max min [withscores] [limit offset count]

這個和上面的用法幾乎一樣,只不過返回值按score從大到小排列

7.4 為元素的score加上增量 increment

zincrby key increment value

# 示例
zincrby myzset 2 "one"		# 返回值是增加后的分數

7.4 刪除有序集合中指定值的元素

zrem key value

7.5 統計該有序集分數區間內的元素個數

zcount key min max

7.6 返回該值在有序集合中的排名,從0開始

zrank key value>

7.8 zset的數據結構

zsetredis提供的一個非常特別的數據結構。

ZSet數據較少時底層數據結構是ziplist,數據較多時轉為skiplist

一方面它等價于Java的數據結構Map<String, Double>,可以給每一個元素value賦予一個權重score

另一方面它又類似于TreeSet,內部的元素會按照權重score進行排序,可以得到每個元素的名次,還可以通過

score的范圍來獲取元素的列表。

zset底層使用了兩個數據結構:

  • hashhash的作用就是關聯元素value和權重score

    保障元素value的唯一性,可以通過元素value找到相應的score值。

  • 跳躍表,跳躍表的目的在于給元素value排序,根據score的范圍獲取元素列表。

原文鏈接:https://blog.csdn.net/qq_44749491/article/details/128061624

欄目分類
最近更新