網站首頁 編程語言 正文
一、數據庫操作命令
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
string
是redis
最基本的類型,一個key
對應一個value
,是一種單鍵單值的結構。
string
類型是二進制安全的。意味著redis
的string
可以包含任何數據。比如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
-
String
在redis
內部存儲默認就是一個字符串,當遇到增減類操作incr
,decr
時會轉成數值型進行計算 -
按數值進行操作的數據,如果原始數據不能轉成數值,或超越了
redis
數值上限范圍,將報錯 -
redis
所有的操作都是原子性的,采用單線程處理所有業務,命令是一個一個執行的,因此無需考慮并發帶來的數據影響.
3.15 string數據結構詳解
string
的數據結構為簡單動態字符串(Simple Dynamic String
,縮寫SDS
)。
是可以修改的字符串,內部實現類似于Java
的ArrayList
,采用預分配冗余空間的方式來減少內存的頻繁分配。
它內部為當前字符串實際分配的空間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
類型的數據,結構上還需要兩個額外的指針prev
和next
。
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
redis
的set
數據類型對外提供的功能與list
類似是一個列表的功能,特殊之處在于set是可以自動排重的。
當需要存儲一個列表數據,又不希望出現重復數據時,set
是一個很好的選擇。
并且set
提供了判斷某個成員是否在一個set
集合內的重要接口,這個也是list
所不能提供的。
set
是一個string
類型的無序集合。它底層其實是一個value
為null
的hash
表。
所以添加,刪除,查找的復雜度都是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
字典,字典是用哈希表實現的。
Java
中HashSet
的內部實現使用的是HashMap
,只不過所有的value
都指向同一個對象。
redis
的set
結構也是一樣,它的內部也使用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的數據結構
zset
是redis
提供的一個非常特別的數據結構。
一方面它等價于Java
的數據結構Map<String, Double>
,可以給每一個元素value賦予一個權重score。
另一方面它又類似于TreeSet
,內部的元素會按照權重score
進行排序,可以得到每個元素的名次,還可以通過
score
的范圍來獲取元素的列表。
zset
底層使用了兩個數據結構:
-
hash
:hash
的作用就是關聯元素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的數據結構
zset
是redis
提供的一個非常特別的數據結構。
但ZSet
數據較少時底層數據結構是ziplist
,數據較多時轉為skiplist
。
一方面它等價于Java
的數據結構Map<String, Double>
,可以給每一個元素value
賦予一個權重score
。
另一方面它又類似于TreeSet
,內部的元素會按照權重score
進行排序,可以得到每個元素的名次,還可以通過
score
的范圍來獲取元素的列表。
zset
底層使用了兩個數據結構:
-
hash
:hash
的作用就是關聯元素value
和權重score
。保障元素
value
的唯一性,可以通過元素value
找到相應的score
值。 -
跳躍表,跳躍表的目的在于給元素
value
排序,根據score
的范圍獲取元素列表。
原文鏈接:https://blog.csdn.net/qq_44749491/article/details/128061624
- 上一篇:redis配置文件詳解
- 下一篇:redis的主從復制,哨兵和cluster集群
相關推薦
- 2022-01-02 無法將“node.exe”項識別為 cmdlet、函數、腳本文件或可運行程序的名稱
- 2022-11-23 Qt采用線程以隊列方式實現下發數據_C 語言
- 2023-02-25 Golang嵌入資源文件實現步驟詳解_Golang
- 2022-05-20 python?關鍵字與標識符超詳細整理_python
- 2022-08-12 python算法加密?pyarmor與docker_python
- 2023-03-28 Go字符串操作深入解析_Golang
- 2022-11-27 VsCode運行html界面的實戰步驟_其它綜合
- 2023-04-28 react如何獲取URL中參數_React
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支