一.通用命令
- key key + 類通配符
key命令一般不在生產環境使用,key多慢。
- dbsize
dbsize 時間複雜度爲O1級別,可以在生產環境中使用
- exists
exists 時間複雜度爲O1級別,可以在生產環境中使用
- del
可以同時刪除多個
- expire , ttl , persist
- type
- 時間複雜度
二. 數據結構和內部編碼
內部有一個redisObject
目的:使用更小的空間實現更優內存使用效果
- 單線程
(1) 單線程模型
(2)單線程快的原因
–純內存
–非阻塞IO
–避免線程切換和競態消耗
(3)單線程注意
–一次只運行一條命令
–拒絕長(慢)命令
keys,flushall,flushdb,slow lua script,mutil/exec,operate,big value
三.字符串
- 字符串鍵值結構
key 爲字符串
value 可以爲 字符串 數字 二進制 json對象 最大爲512M
- 使用場景
(1)緩存
(2)計數器
(3)分佈式鎖 …
- 命令
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(key)=-k
192.168.187.128:6382> get counter
(nil)
192.168.187.128:6382> incr counter
(integer) 1
192.168.187.128:6382> get counter
"1"
192.168.187.128:6382> incr counter
(integer) 2
192.168.187.128:6382> get counter
"2"
192.168.187.128:6382> incrby counter 99
(integer) 101
192.168.187.128:6382> get counter
"101"
- 實戰:記錄網站每個用戶個人主頁的訪問量
incr userid:pageview(單線程:無競爭)
- 緩存視頻的基本信息(數據源在MySQL中)
先在redis中查找,如果沒有就去數據庫中查找
public VideoInfo get(long id){
String redisKey = redisPrefix + id ;
Video videoInfo = redis.get(redisKey);
if(videoInfo == null){
videoInfo = mysql.get(id);
if(videoInfo != null){
//序列化
redis.set(redisKey,serialize(videoInfo));
}
}
}
set key value : 不管key是否存在 都設置
setnx key value : key不存在,才設置
set key value xx : key存在,才設置
192.168.187.128:6382> exists php
(integer) 0
192.168.187.128:6382> set php good
OK
192.168.187.128:6382> get php
"good"
192.168.187.128:6382> setnnx key java
(error) ERR unknown command 'setnnx'
192.168.187.128:6382> setnx key java
(integer) 1
192.168.187.128:6382> get php
"good"
192.168.187.128:6382> set key value java
(error) ERR syntax error
192.168.187.128:6382> set key java xx
OK
192.168.187.128:6382> get php
"good"
192.168.187.128:6382> set php java xx
OK
192.168.187.128:6382> get php
"java"
mget key1 key2 key3 : 批量獲取key,原子操作
mset key1 value1 key2 value2 key3 value3 : 批量設置key-value
- n次get操作和mget操作區別
getset key newvalue : set key newvalue 並返回舊的value
append key value : 將value追加到舊的value
strlen key : 返回字符串的長度(注意中文)
192.168.187.128:6382> get php
"java"
192.168.187.128:6382> getset php ffff
"java"
192.168.187.128:6382> get php
"ffff"
192.168.187.128:6382> append php ",java"
(integer) 9
192.168.187.128:6382> get php
"ffff,java"
192.168.187.128:6382> strlen php
(integer) 9
192.168.187.128:6382> set hello "足球"
OK
192.168.187.128:6382> strlen hello
(integer) 4
incrbyfloat key 3.5 : 增加key對應的值3.5
getrange key start end : 獲取字符串指定下標所有的值
setrange key index value : 設置指定下標所有對應的值
192.168.187.128:6382> incr counter
(integer) 102
192.168.187.128:6382> incr times
(integer) 1
192.168.187.128:6382> incrbyfloat times 1.1
"2.1"
192.168.187.128:6382> getrange times 0 2
"2.1"
192.168.187.128:6382> setrange php 4 p
(integer) 9
192.168.187.128:6382> get php
"ffffpjava"
192.168.187.128:6382>
- 字符串總結
四.Hash
-
哈希鍵值結構
-
field不能相同,value可以相同
-
所有的API以H開頭
-
hget hset hdel
hget key field : 獲取hash key 對應的field的Values
hset key field value : 設置hash key 對應的field的value
hdel key field : 刪除hash key 對應field的value
hgetall : 獲取所有的key和value
- hexists hlen
hexists key field : 判斷hash key 是否有field
hlen key : 獲取hash key field 的數量
192.168.187.128:6382> hexists user1 age
(integer) 0
192.168.187.128:6382> hexists user1 name
(integer) 1
192.168.187.128:6382> hash user1
(error) ERR unknown command 'hash'
192.168.187.128:6382> hlen user1
(integer) 1
- hmget hmset
hmget key field1 field2 ...fieldN : 批量獲取hash key 的一批field對應的值
hmset key field1 value1 field2 value2....fieldN valueN : 批量設置hash key 的一批field value
- 實戰 : 記錄網站每個用戶個人主頁的訪問量
hincrby user:1:info pageview count
- 緩存視頻的基本信息(數據源在mysal中)僞代碼
public VideoInfo get(long id){
String reidsKey = redisPrefix + id ;
Map<String,String> hashMap = redis.hgetAll(redisKey);
VideoInfo videoInfo = transferMapToVideo(hasMap);
if(videoInfo == null){
videoInfo = mysql.get(id);
if(videoInfo != null){
redis.hmset(redisKey,transferVideoToMap(videoInfo));
}
}
return videoInfo;
}
- hgetall hvals hkeys
hgetall key : 返回hash key對應所有的field和value
hvals key :返回hash key 對應所有field的value
hkeys key : 返回hash key對應所有的field
- 使用hgetall 小心使用牢記單線程
- 如何更新用戶屬性
(1)使用String : key 爲 用戶id value 爲用戶對象
(2)使用String : key 爲 每個用戶的屬性user:1:name value爲屬性的值world
(3)使用Hash : key爲用戶id , value 爲hash表 ,方便修改
- hsetnx hincrby hincrbyfloat
hsetnx key field value : 設置hash key對應field的value(如果field已經存在,則失敗)
hincrby key field intCounter : hash key對應的field的value自增intCounter
hincrbyfloat key field floatCounter : hincrby浮點數
五.List
- 列表結構
- 特點:有序,可以重複,左右兩邊插入彈出
- 以L開頭
- rpush
rpush key value1 value2 .. value3 : 從列表右端插入值
lpush key value1 value2 ...value3 : 從列表左端插入值
- linsert
linsert key before|after value newValue : 在list指定的值前|後插入newValue 例:linsert listkey before b java
- lpop
lpop key : 從列表左側彈出一個item
- rpop
rpop key : 從列表右側彈出一個item
- lrem
lrem key count value 根據count值 從列表中刪除所有value相等的項
(1)count >0 ,從左到右,刪除最多count個value相等的項
(2)count <0, 從右到左,刪除最多Maht.abs(count)個value相等的項
(3)count =0 ,刪除所有value相等的項
- ltrim
ltrim key start end : 按照索引範圍修剪列表
- lrange
lrange key start end (包含end) : 獲取列表指定索引範圍所有itme
索引從左: 0 - 5
索引從右:-1 - -6
- lindex
lindex key index : 獲取列表指定索引的item
- llen
llen key : 獲取列表長度
- lset
lset key index newValue : 設置列表指定索引值爲newValue
六. 集合Set
- 不能有重複值
- 集合的結構
- 特點:無序,無重複,集合間操作
- sadd srem
sadd key element : 向集合key添加element(如果element已經存在,添加失敗)
srem key element : 將集合key中的element移除掉
- scard sismember srandmember smembers spop
scard user:1:follow = 4 : 計算集合大小
sismember user:1:follow it = 1 :判斷it是否在集合中
srandmember user:1:follow count = his : 從集合中隨機挑選count個元素
spop user:1:follow = sports : 從集合中隨機彈出一個元素
smembers user:1:follow = music his sports it : 獲取集合所有元素
- spop從集合彈出
srandmenber不會破壞集合
- 實戰
抽獎系統
Like,贊,踩
標籤
- sdiff sinter sunion
sdiff user:1:follow user:2:follow = music his : 差集
sinter user:1:follow user:2:follow = it sports : 交集
sunion user:1:follow user:2:follow = it music his sports news end : 並集
sdiff|sinter|suion + store destkey : 將差集,交集,並集結果保存在destkey中
七.有序集合zset
- 有序集合結構
- 集合VS有序集合
- 列表VS有序集合
- zadd
zadd key score element (可以是多對) : 添加score 和 element
192.168.187.128:6382> zadd user:1:ranking 244 tom
(integer) 1
192.168.187.128:6382> zadd user:1:ranking 214 jinm
(integer) 1
192.168.187.128:6382> zadd user:1:ranking d j
(error) ERR value is not a valid float
-
zrem
(1)zrem key element(可以是多個) : zrem user:1:ranking 225 tom -
zscore
zscore key element : 返回元素的分數
192.168.187.128:6382> zscore user:1:ranking tom
"244"
- zincrby
zincrby key increScore element : 增加或減少元素的分數
192.168.187.128:6382> zincrby user:1:ranking 4 tom
"248"
- zcard
zcard key : 返回元素的總個數
192.168.187.128:6382> zcard user:1:ranking
(integer) 2
- zrange
zrange key start end [WITHSCORES] : 返回指定索引範圍內的升序元素(分值)
zrange user:1:ranking 1 3 withscores
- zrangebyscore
zrangebyscore key minScore maxScore [WITHSCORES] : 返回指定分數範圍內的升序元素
zrangebyscore user:1:ranking 90 210 withscores
- zcount
zcount key minScore maxScore : 返回有序集合內在指定分數範圍內的個數
zcount user:1:ranking 200 221
- zremrangebyrank
zremrangebyrank key start end : 刪除指定排名內的升序元素 索引
zremrangebyrank user:1:ranking 1 2
- zremrangebyscore key minScore maxScore : 刪除指定分數內的升序元素
zremrangebyrank user:1:ranking 90 210