Redis基礎語法入門
阿新 • • 發佈:2019-01-09
通用命令
- 通用命令
- keys
- dbsize
- exists key
- del key [key…]
- expire key seconds
- type key
keys(一般不在生產環境中使用)
keys * # 遍歷所有key 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> set php good OK 127.0.0.1:6379> set java best OK 127.0.0.1:6379> keys * 1) "hello"
dbsize
dbsize #計算key的總數 127.0.0.1:6379> dbsize (integer) 5
exists
exists key #檢查key是否存在 127.0.0.1:6379> set a b OK 127.0.0.1:6379> exists a (integer) 1 (1代表存在) 127.0.0.1:6379> del a (integer) 1 127.0.0.1:6379> exists a (integer) 0 (0代表不存在)
del
del key #刪除指定的key-value 127.0.0.1:6379> set c d OK 127.0.0.1:6379> del a c (integer) 1 (1代表刪除成功) 127.0.0.1:6379> exists c (integer) 0
expire,ttl,persist
expire key seconds #key在seconds秒後過期 ttl key #檢視key剩餘的過期時間 persist key #清除key的過期時間 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> expire hello 10 (integer) 1 127.0.0.1:6379> ttl hello (integer) 7 127.0.0.1:6379> ttl hello (integer) -2 (-2代表已經過期,被刪除) 127.0.0.1:6379> set hello world OK 127.0.0.1:6379> expire hello 20 (integer) 1 127.0.0.1:6379> ttl hello (integer) 16 127.0.0.1:6379> persist hello (integer) 1 127.0.0.1:6379> ttl hello (integer) -1 (-1代表沒有設定過期時間)
type
type key #返回key的型別 127.0.0.1:6379> set str stri OK 127.0.0.1:6379> type str string 127.0.0.1:6379> sadd myset 1 2 3 (integer) 3 127.0.0.1:6379> type myset set redis的type有string,hash,list,set,zset,none
- 時間複雜度
命令 | 時間複雜度 |
---|---|
keys | O(n) |
dbsize | O(1) |
del | O(1) |
exists | O(1) |
expire | O(1) |
type | O(1) |
資料結構
字串
- 鍵值對 key-value
API
get key # 獲取key對應的value set key value # 設定key-value del key # 刪除key-value incr key # key自增1,如果key不存在,自增後get(key)=1 decr key # key自減1,如果key不存在,自減後get(key)=-1 incrby key k # key自增k,如果key不存在,自增後get(key)=k decr key k # key自減k,如果key不存在,自減後get(ke y)=-k set key value # 不管key是否存在,都設定 setnx key value # key不存在,才設定 set key value xx # 當key存在,才設定 mget key1 key2 key3 ... # 批量獲取key,原子操作(相較之於多次執行單次查詢, 每次查詢都會連線一次網路,批量操作節約了大量的網路時間) mset key1 value1 key2 value2 ... # 批量設定key-value getset key newvalue # set key newvalue並返回舊的value append key value # 將value追加到舊的value strlen key # 返回字串的長度(注意中文) incrbyfloat key 3.5 # 增加key對應的值3.5 getrange key start end # 獲取字串指定下標所有的值 setrange key index value # 設定指定下標所有對應的值
實戰:
- 記錄網站每個使用者個人主頁的訪問量
incr userid:pageview(單執行緒:無競爭)
快取視訊的基本資訊(資料來源在mysql中)虛擬碼
public VideoInfo get(long id){ String redisKey = redisPrefix + id; VideoInfo videoInfo = redis.get(redisKey); if(videoInfo == null){ videoInfo = mysql.get(id); if(videoInfo!=null){ //序列化 redis.set(redisKey,serialize(videoInfo)); } } }
分散式id生成器
incr id(原子操作)
- 記錄網站每個使用者個人主頁的訪問量
雜湊
- key-field-value(相當於map中存的是map)
API
hget key field # 獲取hash key對應的field的value hset key field value # 設定hash key對應的field的value hdel key field # 刪除hash key對應的field的value hexists key field # 判斷hash key是否有field hlen key # 獲取hash key field的數量 hmget key field1 field2... # 批量獲取hash key的一批field對應的值 hmset key field1 value1 field2 value2... # 批量設定hash key的一批field value hgetall key # 返回hash key對應所有field的和value hvals key # 返回hash key對應所有field的value hkeys key # 返回hash key對應所有的field hsetnx key field value # 設定hash key對應的field的value(如果field已經存在,則失敗) hincrby key field intCounter # hash key 對應的field的value自增intCounter hincrbyfloat key field floatCounter # 自增浮點數
實戰
- 記錄個人網站主頁訪問量
hincrby user:1:info pageview count
快取視訊的基本資訊(資料來源在mysql中)虛擬碼
public VideoInfo get(long id){ String redisKey = redisPrefix + id; Map<String,String> hashMap = redis.hgetAll(redisKey); VideoInfo videoInfo = transferMapToVideo(hashMap); if(videoInfo == null){ videoInfo = mysql.get(id); if(videoInfo!=null){ redis.hmset(redisKey,transferVideoToMap(videoInfo)); } } return videoInfo; }
list
- key-elements
API
rpush key value1 value2...valueN # 從列表右端插入值(1-N)個 lpush key value1 value2...valueN # 從列表左端插入值(1-N)個 lpop key # 從列表左側彈出一個item rpop key # 從列表右側彈出一個item lrem key count value # 根據count值,從列表中刪除所有value相等的項 (1)count>0,從左到右,刪除最多count個value相等的項 (2)count<0,從右到左,刪除最多Math.abs(count)個value相等的項 (3)count=0,刪除所有value相等的項 ltrim key start end # 按照索引範圍修剪列表 lrange key start end(包含end) # 獲取列表指定索引範圍所有item lindex key index # 獲取列表指定索引的item llen key #獲取列表長度 lset key index newValue # 設定列表指定索引值為newValue blpop key timeout # lpop阻塞版本,timeout是阻塞超市時間,timeout=0是永遠不阻塞 brpop key timeout # rpop阻塞版本,timeout是阻塞超市時間,timeout=0是永遠不阻塞
集合
- key-values(無序,不允許有重複元素,相當於set)
API
sadd key element # 向集合key新增element(如果element已經存在,新增失敗) srem key element # 將集合key中的element移出掉 scard key # 計算集合大小 sismember key item # 判斷item是否屬於集合(1存在,0不存在) srandmember key count # 從集合中隨機取出count個元素 spop key # 從集合中隨機彈出一個元素 smembers key # 取出集合中所有的元素(返回結果是無序的,涉及到遍歷,小心使用) 假設存在兩個集合: 1. s1:a,b,c 2. s2:a,c,d sdiff(差集): sdiff s1 s2 = b sdiff s2 s1 = d sinter(交集): sinter s1 s2 = a c sunion(並集): sunion s1 s2 = b a d c 將以上結果儲存在指定集合(destkey): sdiff|sinter|sunion + store destkey
有序集合
- key-value(score-value)本身無序,使用score排序
API
zadd key score element(可以是多對) # 新增score和element zrem key element(可以是多個) # 刪除元素 zscore key element # 返回元素的分數 zincrby key increScore element # 增加或減少元素的分數 zcard key # 返回元素的總個數 zrange key start end[WITHSCORES](zrevrange 倒序) # 返回指定索引範圍內的升序元素[分值] zrangebyscore key minScore maxScore[WITHSCORES](zrevrangebyscore 倒序) # 返回指定分數範圍的升序元素[分值] zcount key minScore maxScore # 返回有序集合內在指定分數範圍內的個數 zremrangebyrank key start end # 刪除指定排名內的升序元素 zremrangebyscore key minScore maxScore # 刪除指定分數內的升序元素 zrank key member # 獲取memeber元素對應的排名(升序,zrevrank倒序) zinterstore destination numkey key[key...] [WEIGHTS weight] [AGGREGATE sum|min|max] # 用於對給定的有序集合執行交集運算,運算結果集儲存到DESTINATION中 # numkey是有序集合的數量; # WEIGHTS選項,用於指定一個乘法因子,有序集合中每個成員的SCORE值乘以該因子後,結果傳遞給聚合函式。並且,乘法因子的設定需要根據有序集合的個數分別指定。預設為1。 # AGGREGATE選項,用於指定該交集的結果集的聚合方式。預設使用的是SUM。 ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX] # 求並集