一、簡介
REmote DIctionary Server(Redis) 是一個由Salvatore Sanfilippo寫的key-value存儲系統。
Redis是一個開源的使用ANSI C語言編寫、遵守BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。
它通常被稱爲數據結構服務器,因爲值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等類型。
二、String
命令
keys * | 查詢key列表 |
set 名稱 值 | 添加或修改值 |
get 名稱 | 獲取值 |
del 名稱 | 刪除值 |
mset 名稱 值 名稱 值 | 批量添加或修改 |
mget 名稱 名稱 | 批量獲取值 |
strlen 名稱 | 獲取值得長度 |
append 名稱 值 | 在原有值得基礎上追加新的內容,返回最終值的長度 |
incr 名稱 | 每執行一次對數值加一,,自增效果 |
decr 名稱 | 每執行一次對數值減一,,自減效果 |
incrby 名稱 數字值 | 對數值增加指定的整數值 命令數值可以爲負 |
decrby 名稱 數字值 | 對數值減少指定的整數值 命令數值可以爲負 |
incrbyfloat 名稱 數字值 | 對數值增加指定的浮點值 |
setex 名稱 有效時間 值 | 添加值並對此值設置有效時間 時間單位爲秒 |
psetex 名稱 有效時間 值 | 添加值並對此值設置有效時間 時間單位爲毫秒 |
String的應用場景
1.用於數據庫表的主鍵控制;
2.主頁高頻訪問信息控制,如新浪微博大V關注數
String類型數據操作注意事項
1.數據操作不成功的反饋與數據正常操作之間的差異
① 表示運行結果是否成功
(integer) 0 — false 失敗
(integer) 1 — true 成功
② 表示運行結果
(integer) 3 — 3 3 個
(integer) 1 — 1 1 個
2.數據未獲取到
(nil)等同於null
3.數據最大存儲值
512MB
4.數值計算最大識別範圍(java中的long的最大值)
9223372036854775807
5.key的設置約定
表名:主鍵名:主鍵值:字段名
三、Hash
命令
hset key field value | 添加修改數據 |
hget key field | 獲取數據 |
hdel key field1 [field2] | 刪除數據 |
hmset key field1 value field2 value | 批量添加修改數據 |
hget key field1 field2 | 批量獲取數據 |
hlen key | 獲取值的field的個數 |
hexists key field | 查詢是否存在此字段 |
hkeys key | 獲取哈希表中所有的字段 |
hvals key | 獲取哈希表中所有的字段的值 |
hincrby key field increment |
指定字段的數值增加指定的整數數值 |
hincrbyfloat key field increment | 指定字段的數值增加指定的浮點數或者整數數值 |
hgetall key | 獲取當前key下所有信息 |
hsetnx key field value | 當此key中存在插入的field時,會新增數據失敗,不存在時新增成功 |
應用場景
電商網站購物車的設計和實現
注意事項
hash類型下的value只能存儲字符串,不允許存其他數據類型,不存在嵌套現象.如果數據未獲取到,對應的值爲(nil)
每個hash可以存儲 2^23-1個鍵值對
hash類型十分貼近對象的數據存儲形式,並且可以靈活添加刪除對象屬性。但hash設計初衷不是爲了存
儲大量對象而設計的,切記不可濫用,更不可以將hash作爲對象列表使用
hgetall操作可以獲取全部屬性,如果內部field過多,遍歷整體數據效率就會很低,有可能成爲數據訪問瓶頸
四、list
數據存儲要求:存儲多個數據,並對數據存儲的順序進行區分
list類型:保存多個數據,底層使用雙向鏈表存儲結構實現
lpush key value1 [value2] | 左添加/修改 |
rpush key value1 [value2] | 右添加/修改 |
lrange key startindex stopindex | 獲取list的下標起始到結束的數據,下標根據需求填寫 |
lindex key index | 獲取所選下標的list的值 |
llen key | 獲取當前list的元素個數 |
lpop key | 獲取並刪除最左邊的數據 |
rpop key | 獲取並刪除最右邊的數據 |
blpop key1 [key2] timeout | 規定時間內獲取並刪除所有list其中一個list的最左邊的數據 |
brpop key1 [key2] timeout | 規定時間內獲取並刪除所有list其中一個list的最右邊的數據 |
lrem key count value | 刪除指定數據 count表示刪除value的個數 |
應用場景
微信朋友圈點贊
微博關注列表的順序顯示
依靠隊列解決多路信息彙總問題,如多服務器日誌彙總
list操作注意事項
保存的數據都是String類型的,最多存儲2^32-1個
具有索引概念,但操作數據是通常以隊列形式進行入隊出隊操作,或以棧的形式入棧出棧操作
獲取全部數據操作結束索引設置爲-1
list可以對數據進行分頁操作,通常第一頁的信息來自list
五、set
新的存儲需求,存儲大量的數據,在查詢方面提供更高的效率
需要的存儲結構:能夠保存大量的數據,高效的內部存儲機制,便於查詢
set類型:與hash存儲結構完全相同,僅存儲鍵,不存儲值,存儲的鍵不允許重複
命令
sadd key member1 [member2] | 添加修改數據 |
smembers key | 獲取數據 |
srem key member1 [member2] | 刪除數據 |
scard key | 獲取集合數據的個數 |
sismember key member | 校驗member是否存在,存在返回1,不存在返回0 |
srandmember key [count] | 隨機獲取集合中指定數量的數據 |
spop key | 隨機獲取集合中某個數據並刪除 |
sinter key1 [key2] | 獲取兩個集合的交集 |
sunion key1 [key2] | 獲取兩個集合的並集 |
sdiff key1 [key2] | 獲取兩個集合的差集 |
sinterstore destination key1 [key2] | 獲取兩個集合的交集且存儲到指定的集合,指定的集合如果原來有數據,則會被清空 |
sunionstore destination key1 [key2] | 獲取兩個集合的並集且存儲到指定的集合,指定的集合如果原來有數據,則會被清空 |
sdiffstore destination key1 [key2] | 獲取兩個集合的差集且存儲到指定的集合,指定的集合如果原來有數據,則會被清空 |
smove source destination member | 將指定數據從原始集合移動到目標集合 |
業務場景
用於隨機推介類的檢索,如QQ音樂每日推介
用於同類信息的關聯檢索,如支付寶中與好友擁有的共同好友顯示
統計網站的PV日訪問量,UV(cookie),IP
注意事項
set不允許重複添加
set的存儲結構與hash相同,單無法啓用hash的存儲空間