Redis 學習筆記1:數據類型
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)。
一、Redis 數據類型-STRING
1、常用命令
SET key value #存 GET key #取 Del key #刪除key INCR key #自增key對應的value的值,增量為1 INCRBY key increment #自增key對應的value的值,增量為 increment DECR key #遞減key對應的value的值,增量為-1 getset key value #命令用于設置指定 key 的值,并返回 key 的舊值。 當 key 沒有舊值時,即 key 不存在時,返回 nil 當 key 存在但不是字符串類型時,返回一個錯誤
2、實例
實例1: set key value
D:\Redis>redis-cli.exe -h 127.0.0.1 -p 6379 127.0.0.1:6379> set set:test 1 # 返回ok 說明成功 OK 127.0.0.1:6379> set set:test1 1 OK 127.0.0.1:6379> set set:test2 1 OK 127.0.0.1:6379> keys * # 列出所有的key 1) "set:test" 2) "set:test2" 3) "set:test1" 127.0.0.1:6379> set system:user 1 OK 127.0.0.1:6379> set system:role 1 OK 127.0.0.1:6379> set system:group 1 OK 127.0.0.1:6379> keys * 1) "system:role" 2) "set:test" 3) "set:test1" 4) "set:test2" 5) "system:group" 6) "system:user" 127.0.0.1:6379>
說明:
set system:user 1
key就是 system:user ;value就是1
實例2:切庫
127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * (empty list or set) 127.0.0.1:6379[1]> select 0 OK 127.0.0.1:6379> keys * 1) "system:role" 2) "set:test" 3) "set:test1" 4) "set:test2" 5) "system:group" 6) "system:user" 127.0.0.1:6379>
在 redis.conf 文件中,配置項 database 16 設置了數據庫的數量為16,默認數據庫是0。
可以使用select 命令在連接上指定數據庫id。
當我們沒有默認選擇庫時,默認使用 0 庫。
實例3:get key
127.0.0.1:6379> set a 1 OK 127.0.0.1:6379> get a "1" 127.0.0.1:6379> set b {a:b,1:2} OK 127.0.0.1:6379> get b "{a:b,1:2}" 127.0.0.1:6379>
實例4:del key
127.0.0.1:6379> keys * 1) "system:role" 2) "b" 3) "set:test" 4) "set:test1" 5) "set:test2" 6) "system:group" 7) "system:user" 8) "a" 127.0.0.1:6379> del a # 刪除成功 (integer) 1 127.0.0.1:6379> keys * 1) "system:role" 2) "b" 3) "set:test" 4) "set:test1" 5) "set:test2" 6) "system:group" 7) "system:user" 127.0.0.1:6379> 127.0.0.1:6379> del a #刪除失敗 (integer) 0
實例5:遞增key
127.0.0.1:6379> incr test (integer) 1 127.0.0.1:6379> get test "1" 127.0.0.1:6379> incr test (integer) 2 127.0.0.1:6379> get test "2" 127.0.0.1:6379> incr test (integer) 3 127.0.0.1:6379> get test "3" 127.0.0.1:6379> incrby test 3 (integer) 6 127.0.0.1:6379> get test "6"
當值(字符串)里是數字時,才可以自增。
實例6:遞減key
127.0.0.1:6379> DECR test (integer) 5
實例7:先取再設置(同時進行)
127.0.0.1:6379> getset test1 1 (nil) 127.0.0.1:6379> get test1 "1" 127.0.0.1:6379> getset test1 2 "1" 127.0.0.1:6379> get test1 "2" 127.0.0.1:6379>
redis getset 命令用于設定指定key的值,并返回key的舊值。
3、STRING 類型的實際場景
場景1:做商品詳情和緩存
127.0.0.1:6379> set spu:10001 '{"color":"red","struct":"glass","length":30,"width":25,"price":"1345.20"}' OK 127.0.0.1:6379> get spu:10001 "{\"color\":\"red\",\"struct\":\"glass\",\"length\":30,\"width\":25,\"price\":\"1345.20\"}" 127.0.0.1:6379>
說明:比如客戶端發起請求查詢 sup:10001 商品信息,api程序先去redis拿,拿到了就直接返回給api程序,api返回給客戶端,這樣就起到了做緩存的目的。
場景2:給數據做唯一編碼
有一些數據需要唯一的編碼去命名,如用例編碼。
使用redis 用incr 生成用例編碼
127.0.0.1:6379> incr test_case_no (integer) 1 127.0.0.1:6379> incr test_case_no (integer) 2 127.0.0.1:6379> incr test_case_no (integer) 3
場景3:做分布式鎖
1、什么是分布式鎖:針對多服務的情況,在外面加個分布式鎖,每個服務都要在獲得分布式鎖后進行操作。
2、Redis為什么可以做分布式鎖:因為redis是單線程運行的,沒有并發,所有請求都是一個一個操作。
3、redis怎么做分布式鎖:
expire [key] time #設置一個key有效期
exists [key] # 判斷key是否存在
偽代碼:
先判斷鎖是否存在(key存在,exists): 如果存在:pass 如果不存在:set key 'xxx' && 設置過期時間 操作
4、如何設置過期時間&如何判斷key是否存在
127.0.0.1:6379> set hqq2 'a' OK 127.0.0.1:6379> exists hqq2 #判斷key是否存在 (integer) 1 127.0.0.1:6379> expire hqq2 10 #設置過期時間為10s (integer) 1 10秒后再次操作 127.0.0.1:6379> exists hqq2 (integer) 0 127.0.0.1:6379>
5、設置過期時間的實際應用場景:
set key '限時活動' expire key 10 while get key: 繼續活動 活動結束
127.0.0.1:6379> set 618day 'huodong' OK 127.0.0.1:6379> expire 618day 100 (integer) 1 127.0.0.1:6379> get 618day "huodong" 127.0.0.1:6379> get 618day (nil)
4、總結STRING
1、一個key對應一個value
2、Redis的String可以包含任何數據,比如 jpg圖片或者序列的對象
3、一個key最大能存儲512MB
二、Redis 數據類型-HASH
1、什么是哈希值
哈希值是通常用一個短的隨機字母和數字組成的字符串來代表,是一組任意長度的輸入信息通過哈希算法得到的“數據指紋”。因為計算機在底層機器碼是采用二進制的模式。因此通過哈希算法得到的任意長度的二進制值映射為較短的固定長度的二進制值,即哈希值。此外,哈希值是一段數據唯一且極其緊湊的數值表示形式,如果通過哈希一段明文得到哈希值,哪怕只更改該段明文中的任意一個字母,隨后得到的哈希值都將不同。
Redis hash 是一個鍵值對集合;
Redis hash 是一個string類型的field 和 value 的映射表;
hash 適合存儲對象
3、設置
127.0.0.1:6379> hset htest1 key1 1 (integer) 1 127.0.0.1:6379> hget htest1 key1 "1" 127.0.0.1:6379> hset htest1 key2 2 (integer) 1 127.0.0.1:6379> hget htest1 key2 "2"
結構:

4、刪除
127.0.0.1:6379[1]> hdel htest1 key1 (integer) 1 127.0.0.1:6379[1]> hget htest1 key1 (nil)
5、是否存在
127.0.0.1:6379[1]> HEXISTS htest1 key1 (integer) 0 #不存在 127.0.0.1:6379[1]> HEXISTS htest1 key2 (integer) 1 #存在
6、展示key的所有的value(第二級的key)
127.0.0.1:6379[1]> hset htest1 key3 3 (integer) 1 127.0.0.1:6379[1]> hset htest1 key4 'a' (integer) 1 127.0.0.1:6379[1]> hkeys htest1 1) "key2" 2) "key3" 3) "key4"
結構:

7、展示key 的所有的最后一級value
127.0.0.1:6379[1]> hvals htest1 1) "2" 2) "3" 3) "a" 127.0.0.1:6379[1]>
8、獲取key下面的所有的鍵和值
127.0.0.1:6379[1]> hgetall htest1 1) "key2" 2) "2" 3) "key3" 4) "3" 5) "key4" 6) "a"
9、進階實例
127.0.0.1:6379[1]> hmset w3ckey name 'redis tutorial' description 'redis basic commands for caching' likes 20 visitors 23000 OK 127.0.0.1:6379[1]> hgetall w3ckey 1) "name" 2) "redis tutorial" 3) "description" 4) "redis basic commands for caching" 5) "likes" 6) "20" 7) "visitors" 8) "23000" 127.0.0.1:6379[1]>
說明:
設置了redis的一些描述信息(name,description,likes,visitors)到hash表的w3ckeys中。
10、redis hash 命令
|
序號
|
命令及描述
|
|
1
|
HDEL key field2 [field2] 刪除一個或多個哈希表字段
|
|
2
|
HEXISTS key field 查看哈希表 key 中,指定的字段是否存在。
|
|
3
|
HGET key field 獲取存儲在哈希表中指定字段的值/td>
|
|
4
|
HGETALL key 獲取在哈希表中指定 key 的所有字段和值
|
|
5
|
HINCRBY key field increment 為哈希表 key 中的指定字段的整數值加上增量 increment 。
|
|
6
|
HINCRBYFLOAT key field increment 為哈希表 key 中的指定字段的浮點數值加上增量 increment 。
|
|
7
|
HKEYS key 獲取所有哈希表中的字段
|
|
8
|
HLEN key 獲取哈希表中字段的數量
|
|
9
|
HMGET key field1 [field2] 獲取所有給定字段的值
|
|
10
|
HMSET key field1 value1 [field2 value2 ] 同時將多個 field-value (域-值)對設置到哈希表 key 中。
|
|
11
|
HSET key field value 將哈希表 key 中的字段 field 的值設為 value 。
|
|
12
|
HSETNX key field value 只有在字段 field 不存在時,設置哈希表字段的值。
|
|
13
|
HVALS key 獲取哈希表中所有值
|
|
14
|
HSCAN key cursor [MATCH pattern] [COUNT count] 迭代哈希表中的鍵值對。
|
三、Redis 數據類型-LIST
1、redis 列表是簡單的字符串列表,按照插入順序排序。
2、可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
3、redis list可以做什么:
1)列表可以做什么:index-value pop append
2)redis list同樣可以 pop
4、常用基本命令
5、實踐
實踐1:從左邊插入
127.0.0.1:6379[1]> lpush ltest 1 #從左邊插入 (integer) 1 127.0.0.1:6379[1]> lpush ltest 1 (integer) 2 #返回的是添加到第幾個數 127.0.0.1:6379[1]> lpush ltest 2 (integer) 3 127.0.0.1:6379[1]> llen ltest #看長度 (integer) 3 127.0.0.1:6379[1]> lrange ltest 0 -1 #第一個0,最后一個-1 1) "2" 2) "1" 3) "1"
得到的結構類似:ltest:[2,1,1]
實踐2:從右邊插入
127.0.0.1:6379[1]> rpush ltest 3 (integer) 4 127.0.0.1:6379[1]> lrange ltest 0 -1 1) "2" 2) "1" 3) "1" 4) "3"
得到的結構類似:ltest:[2,1,1,3]
實踐3:刪除
127.0.0.1:6379[1]> lpop ltest #從左邊刪除 "2" 127.0.0.1:6379[1]> lrange ltest 0 -1 1) "1" 2) "1" 3) "3" 127.0.0.1:6379[1]> rpop ltest #從右邊刪除 "3" 127.0.0.1:6379[1]> lrange ltest 0 -1 1) "1" 2) "1"
6、redis list 可以在實際工作中做什么?--消息隊列
在不使用消息隊列服務器的時候,用戶的請求數據直接寫入數據庫,在高并發的情況下數據庫壓力劇增,使得響應速度變慢。
四、Redis 數據類型-SET(集合)
127.0.0.1:6379[1]> sadd stest redis (integer) 1 127.0.0.1:6379[1]> sadd stest mongdb (integer) 1 127.0.0.1:6379[1]> sadd stest mysql (integer) 1 127.0.0.1:6379[1]> sadd stest mysql (integer) 0 127.0.0.1:6379[1]> smembers stest 1) "mysql" 2) "mongdb" 3) "redis" 127.0.0.1:6379[1]> srem stest redis #刪除某個元素 (integer) 1 127.0.0.1:6379[1]> smembers stest 1) "mysql" 2) "mongdb" 127.0.0.1:6379[1]> 127.0.0.1:6379[1]> scard stest #查看有幾個元素 (integer) 2 127.0.0.1:6379[1]> sadd stest hqq (integer) 1 127.0.0.1:6379[1]> scard stest (integer) 3 127.0.0.1:6379[1]> smembers stest 1) "hqq" 2) "mysql" 3) "mongdb" 127.0.0.1:6379[1]> 隨機刪除:(因為是無序的) 127.0.0.1:6379[1]> spop stest "mysql" 127.0.0.1:6379[1]> spop stest "mongdb"
5、實際應用場景
1)可以使用Redis的Set數據類型跟蹤一些唯一性數據
五、Redis 數據類型-SORTEDSET
4、實戰
127.0.0.1:6379[1]> zadd ztest 1 case1 (integer) 1 127.0.0.1:6379[1]> zadd ztest 2 case3 (integer) 1 127.0.0.1:6379[1]> zadd ztest 3 case2 (integer) 1 127.0.0.1:6379[1]> zrange ztest 0 -1 1) "case1" 2) "case3" 3) "case2" 127.0.0.1:6379[1]>
長度: 127.0.0.1:6379[1]> zcard ztest (integer) 3 刪除指定元素: 127.0.0.1:6379[1]> zrem ztest case1 (integer) 1 127.0.0.1:6379[1]> zrange ztest 0 -1 1) "case3" 2) "case2" 127.0.0.1:6379[1]> 返回索引: 127.0.0.1:6379[1]> zrank ztest case2 (integer) 1 127.0.0.1:6379[1]> zrank ztest case3 (integer) 0
5、實際應用場景
六、Redis 的數據庫操作
? select [index]
? keys [partten]
? del [key]
? type [key]
? exists [key] #判斷是否存在key
? expire [key] time #設置超時時間
? ttl a #查看key還剩多長時間
? flushdb #刪除指定db
? flushall #刪除所有db
浙公網安備 33010602011771號