亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
687
2022-05-29
Redis數據類型
String 字符類型
Hash?字典類型
List?列表
Set?集合
Zsort有序集合
1 String類型 類似ArrayList 動態字符串
內部結構為字符數組, 常見用途就是緩存用戶信息, 將用戶信息結構體使用JSON序列化成字符串,再存入Redis充當緩存, 獲取用戶信息有一次反序列化過程
String的數據結構為簡單動態字符串(Simple Dynamic String,縮寫SDS)。是可以修改的字符串
內部結構實現上類似于Java的ArrayList,采用預分配冗余空間的方式來減少內存的頻繁分配
內部為當前字符串實際分配的空間capacity一般要高于實際字符串長度len。當字符串長度小于1M時,擴容都是加倍現有的空間,
如果超過1M,擴容時一次只會多擴1M的空間。需要注意的是字符串最大長度為512M
1.1? 應用場景
session 共享
常規計數:微博數,粉絲數,訂閱、禮物, 傳統對象緩存等
1.2 常用功能1 ?鍵值對 set、get、del、append、strlen
127.0.0.1:6379> set name1 alex # 設置值 OK 127.0.0.1:6379> get name1 # 獲得key "value1" 127.0.0.1:6379> del name1 # 刪除key (integer) 1 127.0.0.1:6379> exists name1 # 確保 key1 不存在 (integer) 0 127.0.0.1:6379> append name3 "hello" # 對不存在的 key 進行 APPEND ,等同于 SET key1 "hello" (integer) 5 # 字符長度 127.0.0.1:6379> get name2 "sully" 127.0.0.1:6379> APPEND name2 -003 # 對已存在的字符串進行 APPEND (integer) 9 127.0.0.1:6379> get name2 "sully-003" 127.0.0.1:6379> STRLEN name2 # 獲取字符串的長度 (integer) 9
1.3 常用功能2 批量設置
# mset mget # msetnx 當所有 key 都成功設置,返回 1 127.0.0.1:6379> mset k1 v2 k2 v2 k3 v3 OK 127.0.0.1:6379> mget k1 k2 k3 1) "v2" 2) "v2" 3) "v3" 127.0.0.1:6379> MSETNX k1 v11 k10 v10 (integer) 0 127.0.0.1:6379> get v10 (nil)
1.4 常用功能3 計數
# incr、decr 一定要是數字才能進行加減,+1 和 -1。 # incrby、decrby 命令將 key 中儲存的數字加上指定的增量值 127.0.0.1:6379> set views 0 # 設置瀏覽量為0 OK 127.0.0.1:6379> incr views # 瀏覽 + 1 (integer) 1 127.0.0.1:6379> incr views # 瀏覽 + 1 (integer) 2 127.0.0.1:6379> decr views # 瀏覽 - 1 (integer) 1 127.0.0.1:6379> incrby views 10 # +10 (integer) 11 127.0.0.1:6379> decrby views 10 # -10 (integer) 1
1.5常用功能4 設定過期時間&判斷是否存在
# setex(set with expire)鍵秒值 # setnx(set if not exist) 127.0.0.1:6379> setex key3 60 expire # 設置過期時間 OK 127.0.0.1:6379> ttl key3 # 查看剩余的時間 (integer) 55 127.0.0.1:6379> setnx mykey "redis" # 如果不存在就設置,成功返回1 (integer) 1 127.0.0.1:6379> setnx mykey "mongodb" # 如果存在就設置,失敗返回0 (integer) 0 127.0.0.1:6379> get mykey "redis"
1.6 ?常用功能5 range范圍
# getrange 獲取指定區間范圍內的值,類似between...and的關系,從零到負一表示全部 # setrange 設置指定區間范圍內的值,格式是setrange key值具體值 127.0.0.1:6379> GETRANGE name2 0 -1 "sully&003" 127.0.0.1:6379> SETRANGE name2 5 & (integer) 9 127.0.0.1:6379> get name2 "sully&003"
1.7 ?常用6 ?傳統對象緩存
set user:1 value(json數據) # 可以用來緩存對象 127.0.0.1:6379> MSET user1:name alex user1:age 35 OK 127.0.0.1:6379> mget user1:name user1:age 1) "alex" 2) "35"
2??hash類型(字典類型) kv模式不變,但V是一個鍵值對(MAP)
Hash類型對應的數據結構是兩種:ziplist(壓縮列表),hashtable(哈希表)。當field-value長度較短且個數較少時,使用ziplist,否則使用hashtable
Hash 類型相當于 java的hashmap
Redis hash是一個string類型的field和value的映射表,hash特別適合用于存儲對象
通過 key(用戶ID) + field(屬性標簽) 就可以操作對應屬性數據了,既不需要重復存儲數據,也不會帶來序列化和并發修改控制的問題
應用場景:
存儲部分變更的數據,如用戶信息等。最接近mysql表結構的一種類型,可以做數據庫緩存
2.1?常用操作1 增刪改
# hset、hget 命令用于為哈希表中的字段賦值 。 # hmset、hmget 同時將多個field-value對設置到哈希表中,會覆蓋哈希表中已存在的字段。 # hgetall 用于返回哈希表中,所有的字段和值。 # hdel 用于刪除哈希表 key 中的一個或多個指定字段 # hincrby 為哈希表中的字段值加上指定增量值。 # hsetnx 為哈希表中不存在的的字段賦值,不存在則成功寫入,存在返回false 0 # hmset、hmget 同時將多個field-value對設置到哈希表中 127.0.0.1:6379> HMSET user2 name bob age 40 children 3 cars 2 OK 127.0.0.1:6379> HMGET user2 name age 1) "bob" 2) "40" # hdel 用于刪除哈希表 key 中的一個或多個指定字段 127.0.0.1:6379> HDEL user2 cars (integer) 1 127.0.0.1:6379> HKEYS user2 1) "name" 2) "age" 3) "childrens" 4) "children" # hincrby 為哈希表中的字段值加上指定增量值。 127.0.0.1:6379> HINCRBY user2 age 5 (integer) 45 127.0.0.1:6379> HGET user2 age "45" # hsetnx 為哈希表中不存在的的字段賦值,不存在則成功寫入,存在返回false 0 127.0.0.1:6379> HSETNX user2 cars 20 (integer) 1 127.0.0.1:6379> HSETNX user2 age 39 (integer) 0
2.2?常用操作2 查
# hlen 獲取哈希表中字段的數量 # hexists 查看哈希表的指定字段是否存在 # hkeys 獲取哈希表中的所有域(field)。 # hvals 返回哈希表所有域(field)的值。 127.0.0.1:6379> hset user1 name alex age 35 (integer) 2 127.0.0.1:6379> HGET user1 name "alex" 127.0.0.1:6379> HLEN user1 (integer) 2 127.0.0.1:6379> HKEYS user1 1) "name" 2) "age" 127.0.0.1:6379> HVALS user1 1) "alex" 2) "35" 127.0.0.1:6379> HEXISTS user1 high #查詢某個key/字段 0 代表false (integer) 0 127.0.0.1:6379> HEXISTS user1 name (integer) 1
2.3 常用操作3 # hash特別適合用于存儲對象。存儲部分變更的數據,如用戶信息等, String更適合字符串
select concat("hmset city_",id," id ",id," name ",name) from world.city limit 10 into outfile '/data/backup/hmset.txt' mysql ---> cannal ---> redis
3? 列表List 所有命令都是l開頭 不區分大小寫
List 相當于 Java里的 LinkedList ,底層其實是 quicklist結構, 改結構是ziplist 壓縮列表,所有的元素壓縮在一起,分配連續內存存儲,當數據量變大時候才會變成 quicklist,
Redis將鏈表和ziplist結合起來組成了quicklist。也就是將多個ziplist使用雙向指針串起來使用, 這樣既滿足了快速的插入刪除性能,又不會出現太大的空間冗余
應用場景
消息隊列(左進右出), 棧結構(右進右出)
比如sina微博 微信朋友圈 最新的微博和朋友圈在Redis且一直更新 在一定范圍內都是訪問Redis,超出范圍(start/count)后 才訪問數據庫, SQL數據庫(或是硬盤上的其他類型數據庫)只是在用戶需要獲取“很遠”的數據時才會被觸發
3.1 常用命令1 增刪
# Lpush:將一個或多個值插入到列表頭部。(左) # rpush:將一個或多個值插入到列表尾部。(右) # lrange:返回列表中指定區間內的元素,區間以偏移量 START 和 END 指定。 # 其中 0 表示列表的第一個元素, 1 表示列表的第二個元素,以此類推。 # 也可以使用負數下標,以 -1 表示列表的最后一個元素, -2 表示列表的倒數第二個元素,以此類推。 # lpop 命令用于移除并返回列表的第一個元素。當列表 key 不存在時,返回 nil # rpop 移除列表的最后一個元素,返回值為移除的元素 # 右進左出 –模擬隊列(先進先出) 127.0.0.1:6379> rpush list2 k1 k2 k3 k4 k5 #新加入的值在隊列的尾部/ 往右邊加入 (integer) 5 127.0.0.1:6379> LLEN list2 (integer) 5 127.0.0.1:6379> LPOP list2 # 左邊彈出, 彈出的是K1 "k1" # 右進右出 –模擬棧(先進后出) 127.0.0.1:6379> RPUSH list3 k1 k2 k3 k4 (integer) 4 127.0.0.1:6379> LLEN list3 (integer) 4 127.0.0.1:6379> RPOP list3 "k4"
3.2常規操作2 查 lindex相當于 鏈表的 get(int index) 方法, 需要遍歷鏈表, 性能隨著index增大而增大
# Lindex,按照索引下標獲得元素(-1代表最后一個,0代表是第一個) # llen 用于返回列表的長度 127.0.0.1:6379> LRANGE list3 0 -1 1) "k1" 2) "k2" 3) "k3" 127.0.0.1:6379> LINDEX list3 1 "k2" 127.0.0.1:6379>
3.3 常規操作3改
# ltrim 類似截取保留, 參數 start_index , end_index 區間內保留,其余都砍掉 # lrem key 根據參數 COUNT 的值,移除列表中與參數 VALUE 相等的元素 # lset key index value 將列表 key 下標為 index 的元素的值設置為 value # linsert key before/after pivot value 用于在列表的元素前或者后插入元素 # rpoplpush
Redis 數據結構
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。