Redis 8種基本數(shù)據(jù)類型及常用命令和數(shù)據(jù)類型的應(yīng)用場景小結(jié)
Redis 五大數(shù)據(jù)類型
redis 官方網(wǎng)張:https://redis.io/
redis 常用命令:https://www.redis.net.cn/order/
使用 SpringBoot。Jedis 連接的方法也是這些命令
key
# 驗證 redis 服務(wù)密碼 127.0.0.1:6379> auth 123456 # 查看 redis 節(jié)點信息 127.0.0.1:6379> info replication # 測試是否連接 redis 127.0.0.1:6379> ping # 查看所有的key 127.0.0.1:6379> keys * #關(guān)閉redis 127.0.0.1:6379> shutdown # 退出 127.0.0.1:6379> exit # 切換數(shù)據(jù)庫 127.0.0.1:6379> select 3 # 查看DB大小 127.0.0.1:6379> DBSIZE # 清除當(dāng)前數(shù)據(jù)庫 127.0.0.1:6379> flushdb # 清除全部數(shù)據(jù)庫的內(nèi)容 127.0.0.1:6379> flushall # 判斷當(dāng)前的key是否存在 127.0.0.1:6379> exists name 127.0.0.1:6379> set name # 移動key到第一個數(shù)據(jù)庫 127.0.0.1:6379> move name 1 # 設(shè)置key的過期時間,單位是秒 127.0.0.1:6379> expite name 10 # 查看當(dāng)前 key 的剩余時間 127.0.0.1:6379> ttl name # 查看當(dāng)前key的一個類型 127.0.0.1:6379> type name
String
# 設(shè)置值 127.0.0.1:6379> set k1 v1 # 獲取值 127.0.0.1:6379> get k1 # 獲取所有的 key 127.0.0.1:6379> keys * # 判斷一個 key 是否存在 127.0.0.1:6379> exists k1 # 獲取字符串的長度 127.0.0.1:6379> STRLEN key1 # 追加字符串,如果當(dāng)前 key 不存在,就相當(dāng)于set key 127.0.0.1:6379> APPEND k1 ",Hello" # 初始瀏覽量為 0 127.0.0.1:6379> set views 0 # 自增1 瀏覽量變?yōu)? 127.0.0.1:6379> incr views # 自減1 瀏覽量-1 127.0.0.1:6379> decr views # 可以設(shè)置步長,指定增加10 127.0.0.1:6379> incrby views 10 # 可以設(shè)置步長,指定減小10 127.0.0.1:6379> decrby views 10 # 設(shè)置 k1 的值 127.0.0.1:6379> set k1 "hello,world" # 截取字符串 [0,3] 127.0.0.1:6379> getrange k1 0 3 # 獲取全部的字符串和 get key 是一樣的 127.0.0.1:6379> getrange k1 0 -1 # 設(shè)置 k2 的值 "12345678" 127.0.0.1:6379> set k2 "12345678" # 替換指定位置開始的字符串 127.0.0.1:6379> SETRANGE k2 1 xx # setex (set with expire) # 設(shè)置過期時間 # setnx (set if not exist) # 不存在在設(shè)置 (在分布式鎖中會常常使用?。? # 設(shè)置key3 的值為 hello,30秒后過期 127.0.0.1:6379> setex k3 30 "hello" # 查看 k3 過期時間 127.0.0.1:6379> ttl k3 # 如果 k3 不存在,創(chuàng)建 k3 127.0.0.1:6379> setnx k3 "haha" # 清除當(dāng)前數(shù)據(jù)庫的所有 key 127.0.0.1:6379> flushdb # 同時設(shè)置多個值 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 # 同時獲取多個值 127.0.0.1:6379> mget k1 k2 k3 # msetnx 是一個原子性的操作,要么一起成功,要么一起失敗 結(jié)果返回 0 127.0.0.1:6379> msetnx k1 v1 k4 v4 # 對象 set user:1 {name:zhangsan,age:3} 設(shè)置一個user:1 對象值為 json 字符來保存一個對象 # 這里的key是一個巧妙的設(shè)計: user:{id}:{filed} , 如此設(shè)計在Redis中是完全OK了 127.0.0.1:6379> mset user:1:name zhangsan user:1:age 2 # 獲取對象中的值 127.0.0.1:6379> mget user:1:name user:1:age # getset 先get然后在set # 如果不存在值,則返回 nil 127.0.0.1:6379> getset db redis # 如果存在值,獲取原來的值,并設(shè)置新的值 127.0.0.1:6379> getset db mongodb
String類似的使用場景:value 除了是字符串還可以是數(shù)字
- 用戶token
- 計數(shù)器
- 統(tǒng)計多單位的數(shù)量
- 粉絲數(shù)
- 對象緩存存儲
List
基本的數(shù)據(jù)類型,列表,在redis里面,list 是一種比較靈活的鏈表數(shù)據(jù)結(jié)構(gòu),可以充當(dāng)棧、隊列、阻塞隊列
list 列表是鏈表型的數(shù)據(jù)結(jié)構(gòu),所以它的元素是有序的,而且列表內(nèi)的元素是可以重復(fù)的。意味著它可以根據(jù)鏈表的下標(biāo)獲取指定的元素和某個范圍內(nèi)的元素集。
# 將一個值或者多個值,插入到列表頭部 (左) 127.0.0.1:6379> lpush list one 127.0.0.1:6379> lpush list one two three # 獲取 list 中的所有值 127.0.0.1:6379> lpush list 0 -1 # 通過區(qū)間獲取具體的值 127.0.0.1:6379> lrange lisr 0 1 # 將一個值或者多個值,插入到列表位部 (右) 127.0.0.1:6379> rpush list righr # 通過下標(biāo)獲得 list 中的某一個值 127.0.0.1:6379> lindex list 1 # 返回 list 列表的長度 127.0.0.1:6379> llen list # 移除list的第一個元素 127.0.0.1:6379> lpop list # 移除list的最后一個元素 127.0.0.1:6379> rpop list # 移除list集合中指定個數(shù)的value,精確匹配 127.0.0.1:6379> lrem list 1 one # trim 修剪 # 新建一個 newlist 集合 127.0.0.1:6379> lpush newlist "hello" "hello1" "hello2" "hello3" "hello4" # 通過下標(biāo)截取指定的長度,這個list已經(jīng)被改變了,截斷了只剩下截取的元素 127.0.0.1:6379> ltrim newlist 1 2 # rpoplpush 移除列表的最后一個元素,將他移動到新的列表中 127.0.0.1:6379> rpush newlist "hello1" # 移除列表的最后一個元素,將他移動到新的列表中 127.0.0.1:6379> rpoplpush another anotherlist # 查看目標(biāo)列表中,確實存在改值 127.0.0.1:6379> lrange anotherlist 0 -1 # lset 將列表中指定下標(biāo)的值替換為另外一個值,更新操作 127.0.0.1:6379> exists list # 如果不存在列表更新機會報錯,更新前先檢查列表是否存在(0表示下表索引) 127.0.0.1:6379> lset list 0 item # 如果下標(biāo)不存在,則會報錯 127.0.0.1:6379> lset list 10 other # linsert 將某個具體的 value 插入到列表中某個元素的前面或者后面 127.0.0.1:6379> rpush list "hello" 127.0.0.1:6379> rpush list "world" # 把 other 添加到 world 前面 127.0.0.1:6379> linsert list before "world" "other" # 把 another 添加到 world 后面 127.0.0.1:6379> linsert list after "world" "another"
List 是一個鏈表,before , after , left,right 都可以插入值,在兩邊插入或者改動值,效率最高! 中間元素,相對來說效率會低一點
使用場景:
- 消息隊列
- 排行榜
- 最新列表
Set
Sets: 不重復(fù)且無序的字符串元素的集合。
set 類型是 string 類型的集合,其特點是集合元素?zé)o序且不重復(fù),每個集合最多可以存儲 232 - 1 個元素(40多億)
所有的 set 命令都是 s 開始
# 清空當(dāng)前數(shù)據(jù)庫 127.0.0.1:6379> flushdb # set 集合中添加幾個值 127.0.0.1:6379> sadd myset "1" 127.0.0.1:6379> sadd myset "1" "2" "3" "4" "5" "6" "7" "8" "9" "0" # 查看指定 set 的所有值 127.0.0.1:6379> smembers myset # 判斷某一個值是不是在 set 集合中 127.0.0.1:6379> sismember myset # 獲取 set 集合中的內(nèi)容元素個數(shù) 127.0.0.1:6379> scard myset # 移除 set 集合中的指定元素 127.0.0.1:6379> srem myset 3 # 隨機抽選出一個元素,set 無序不重復(fù)集合。抽隨機 127.0.0.1:6379> srandmember myset # 隨機抽取2個 127.0.0.1:6379> srandmember myset 2 # 隨機刪除 myset 中的值 127.0.0.1:6379> spop myset # 將一個指定的值,移動到另外一個set集合 127.0.0.1:6379> sadd "hello" 127.0.0.1:6379> sadd "world" 127.0.0.1:6379> smove myset newset "hello" # 數(shù)字集合類 - 差集 sdiff - 交集 sinter - 并集 sunion 127.0.0.1:6379> sadd key1 "a" "b" "c" 127.0.0.1:6379> sadd key2 "c" "e" "f" # 差集—— key1 在 key2 中沒有的值 127.0.0.1:6379> sdiff key1 key2 # 交集—— key1 和 key2 共同擁有的值 127.0.0.1:6379> sinter key1 key2 # 并集—— key1 和 key2 所有的值 127.0.0.1:6379> sunion key1 key2
Set使用場景:
- 共同關(guān)注,共同愛好,推薦好友,共同好友,共同喜好,二度好友,共同粉絲,微信點贊同好友可看,感興趣的人集合
- 興趣標(biāo)簽,相同愛好的為一個標(biāo)簽
- 統(tǒng)計網(wǎng)站的獨立IP。利用set集合當(dāng)中元素不唯一性,可以快速實時統(tǒng)計訪問網(wǎng)站的獨立IP。
- 安全提示,群聊拉人的時候,新人入群的提示,如果被拉進群聊的新人除了拉取人之外,和其他群友都不是好友關(guān)系或者跟不超過N個人是好友關(guān)系的時候,就可以給一個安全提示。此時用到的是SISMEMBER
Hash
Map集合,key-maps 時候這個值是一個map集合! 本質(zhì)和String類型沒有太大區(qū)別,還是一個簡單的key-vlaue!
有點像 HashMap 的 value 又套了個HashMap
所有 hash 的命令都是 h 開頭
# set一個具體 key-vlaue 127.0.0.1:6379> hset myhash field "hello # 獲取一個字段值 127.0.0.1:6379> hget myhash field # set 多個 key-vlaue 返回 OK 127.0.0.1:6379> hmset myhash field1 "hello" field2 "world" # set 多個 key-vlaue 返回成功的數(shù)量 127.0.0.1:6379> hset myhash field3 "hello" field4 "world" # 獲取多個字段值 127.0.0.1:6379> hmget myhash field1 field2 # 獲取全部的數(shù)據(jù) 127.0.0.1:6379> hgetall myhash # 獲取hash表的字段數(shù)量 127.0.0.1:6379> hlen myhash # 判斷hash中指定字段是否存在 127.0.0.1:6379> hexists myhash field1 # 只獲得所有 field 127.0.0.1:6379> hkeys myhash # 只獲得所有value 127.0.0.1:6379> hvals myhash # 指定增量 127.0.0.1:6379> hset myhash field5 5 127.0.0.1:6379> hincrby myhash field5 5 127.0.0.1:6379> hincrby myhash field5 -2 # 如果不存在則可以設(shè)置,存在則不能設(shè)置 127.0.0.1:6379> hsetnx myhash field6 "hello" # 刪除指定的 field 127.0.0.1:6379>hdel myhash field # 返回 hash 指定 field 的 value 的字符串長度,field 不存在返回 0 127.0.0.1:6379> hstrlen myhash field1
hash變更的數(shù)據(jù) user name age,尤其是是用戶信息之類的,經(jīng)常變動的信息! hash 更適合于對象的存儲,String更加適合字符串存儲
購物車的實現(xiàn):field (商品id),hincrby (商品數(shù)量,添加增量會返回總數(shù)),hdel(刪除),hgetall(全選),hlen(購物車車數(shù)量),key(用戶id)
Hash 結(jié)構(gòu)優(yōu)點:
- 同類數(shù)據(jù)歸類整合存儲,方便數(shù)據(jù)管理
- 相比 String 操作消耗內(nèi)存與 cpu 更小
- 相比 String 儲存更節(jié)省空間
缺點:
- 過期功能不能使用在 field 上,只能用在 key 上
- Redis 集群架構(gòu)下不適合大規(guī)模使用
Sorted Set
Sorted-Set和Set類型極為相似,它們都是字符串的集合,都不允許重復(fù)的成員出現(xiàn)在一個Set中。它們之間的主要差別是Sorted-Set中的每一個成員都會有一個分數(shù)(score)與之關(guān)聯(lián),Redis正是通過分數(shù)來為集合中的成員進行從小到大的排序。然而需要額外指出的是,盡管Sorted-Set中的成員必須是唯一的,但是分數(shù)(score)卻是可以重復(fù)的
在set的基礎(chǔ)上,增加了一個值,set k1 v1 zset k1 score1 v1
# 添加一個值 127.0.0.1:6379> zadd myzset 1 one # 添加多個值 127.0.0.1:6379> zadd myzset 2 two 3 three # zincrby 和 zadd 效果一樣,最后返回結(jié)果是字符串,zadd 返回添加總數(shù) # 查看添加的值 127.0.0.1:6379> zrange myzset 0 -1 127.0.0.1:6379> zrange myzset 0 -1 withscores # 實現(xiàn)排序 添加三個用戶 127.0.0.1:6379> zadd salary 120 zhang 98 wang 110 li # ZRANGEBYSCORE key min max 顯示全部的用戶 從小到大 127.0.0.1:6379> zrangebyscore salary -inf +inf # 從大到進行排序 127.0.0.1:6379> zrevrange salary 0 -1 # 顯示全部的用戶并且附帶成績 127.0.0.1:6379> zrangebyscore salary -inf +inf withscores # 顯示成績小于 110 的所有人,升序排序 127.0.0.1:6379> zrangebyscore salary -inf 110 withscores # zrem 移除,移除有序集合中的指定元素 127.0.0.1:6379> zrem salary zhang # 添加值 127.0.0.1:6379> zadd myzset 2 hello 3 world # 有序集合的元素個數(shù), key 不存在則返回0 127.0.0.1:6379> zcard myzset # 獲取區(qū)間成員數(shù)量 127.0.0.1:6379> zcount myzset 1 3 # 計算成員之間的數(shù)量 127.0.0.1:6379> zlexcount myzset - + 127.0.0.1:6379> zlexcount myzset [b [f # 刪除一個 zset -> del myzset 127.0.0.1:6379> del myzset
ZSet 數(shù)據(jù)類型使用場景:游戲排名、微博熱點話題,根據(jù)時間排序的新聞列表, 閱讀排行榜,延時隊列等
限流,滑動窗口是限流常見的一種策略。如果我們把一個用戶的 ID 作為 key 來定義一個 zset ,member 或者 score 可以都為訪問時的時間戳。我們只需統(tǒng)計某個 key 下在指定時間戳區(qū)間內(nèi)的個數(shù),就能得到這個用戶滑動窗口內(nèi)訪問頻次,與最大通過次數(shù)比較,來決定是否允許通過。
三種特殊類型
Geospatial 地理位置
將指定的地理空間位置(緯度、經(jīng)度、名稱)添加到指定的key中。這些數(shù)據(jù)將會存儲到sorted set這樣的目的是為了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令對數(shù)據(jù)進行半徑查詢等操作
常用命令:
命令 | 描述 |
---|---|
Redis GEOHASH 命令 | 返回一個或多個位置元素的 Geohash 表示 |
Redis GEOPOS 命令 | 從key里返回所有給定位置元素的位置(經(jīng)度和緯度) |
Redis GEODIST 命令 | 返回兩個給定位置之間的距離 |
Redis GEORADIUS 命令 | 以給定的經(jīng)緯度為中心, 找出某一半徑內(nèi)的元素 |
Redis GEOADD 命令 | 將指定的地理空間位置(緯度、經(jīng)度、名稱)添加到指定的key中 |
Redis GEORADIUSBYMEMBER 命令 | 找出位于指定范圍內(nèi)的元素,中心點是由給定的位置元素決定 |
使用場景:
例如:微信位置共享,附近的人等地圖功能
redis 127.0.0.1:6379> GEOADD Sicily 13.361389 38.115556 "beijing" 15.087269 37.502669 "shanghai" (integer) 2 redis 127.0.0.1:6379> GEODIST Sicily beijing shanghai "166274.15156960039" redis 127.0.0.1:6379> GEORADIUS Sicily 15 37 100 km 1) "shanghai" redis 127.0.0.1:6379> GEORADIUS Sicily 15 37 200 km 1) "beijing" 2) "shanghai"
Hyperloglog
使用場景:
統(tǒng)計注冊的IP數(shù),每日訪問數(shù),每天在線人數(shù),搜索詞條數(shù)等類似場景
命令 | 描述 |
---|---|
Redis Pgmerge 命令 | 將多個 HyperLogLog 合并為一個 HyperLogLog |
Redis Pfadd 命令 | 添加指定元素到 HyperLogLog 中。 |
Redis Pfcount 命令 | 返回給定 HyperLogLog 的基數(shù)估算值。 |
示例1:
redis 127.0.0.1:6379> PFADD mykey a b c d e f g h i j (integer) 1 redis 127.0.0.1:6379> PFCOUNT mykey (integer) 10
示例2:
redis 127.0.0.1:6379> PFADD hll1 foo bar zap a (integer) 1 redis 127.0.0.1:6379> PFADD hll2 a b c foo (integer) 1 redis 127.0.0.1:6379> PFMERGE hll3 hll1 hll2 OK redis 127.0.0.1:6379> PFCOUNT hll3 (integer) 6
Bitmap
使用場景:
統(tǒng)計用戶信息、活躍、不活躍、 登錄 、 未登錄、打卡、365打卡! 兩個狀態(tài)的,都可以使用 Bitmaps!
Bitmap 位圖,數(shù)據(jù)結(jié)構(gòu),都是操作二進制位來進行記錄,就只有0 和 1 兩個狀態(tài)!
365 天 = 365 bit 1字節(jié) = 8bit 46 個字節(jié)左右!
# 使用 bitmap 記錄周一到周日打卡 127.0.0.1:6379> setbit sign 0 1 127.0.0.1:6379> setbit sign 1 1 127.0.0.1:6379> setbit sign 2 1 127.0.0.1:6379> setbit sign 3 0 127.0.0.1:6379> setbit sign 4 1 127.0.0.1:6379> setbit sign 5 1 127.0.0.1:6379> setbit sign 6 1 # 查看那一天是否打卡 127.0.0.1:6379> getbit sign 3 127.0.0.1:6379> getbit sign 4 # 統(tǒng)計這周的打卡記錄,就可以看到是否有全勤 127.0.0.1:6379> bitcount sign
到此這篇關(guān)于Redis 8種基本數(shù)據(jù)類型及常用命令和數(shù)據(jù)類型的應(yīng)用場景小結(jié)的文章就介紹到這了,更多相關(guān)Redis 基本數(shù)據(jù)類型內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Redis?HyperLogLog數(shù)據(jù)統(tǒng)計輕量級解決方案詳解
這篇文章主要為大家介紹了Redis?HyperLogLog數(shù)據(jù)統(tǒng)計輕量級解決方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Windows安裝Redis并添加本地自啟動服務(wù)的實例詳解
這篇文章主要介紹了Windows安裝Redis并添加本地自啟動服務(wù)的實例詳解,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11利用Redis實現(xiàn)訪問次數(shù)限流的方法詳解
這篇文章主要給大家介紹了關(guān)于如何利用Redis實現(xiàn)訪問次數(shù)限流的相關(guān)資料,文中通過實例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2022-02-02