一、通用命令
- keys:顯示所有符合條件的鍵(一般不在生產(chǎn)環(huán)境使用,時間復(fù)雜度O(n)速度慢)
- dbsize:計算key的總數(shù)(內(nèi)部計數(shù)器,時間復(fù)雜度O(1)
- exists key:判斷鍵是否存在(O(1))
- del key
-
expire key seconds:設(shè)置鍵的有效期,-1代表永久
+type key
image.png
二、數(shù)據(jù)結(jié)構(gòu)和內(nèi)部編碼

image.png
三、單線程
單線程為什么這么快?
1.純內(nèi)存:所有的數(shù)據(jù)都存在內(nèi)存中
2.使用多路I/O復(fù)用模型,非阻塞IO
多路I/O復(fù)用模型是利用 select、poll、epoll 可以同時監(jiān)察多個流的 I/O 事件的能力,在空閑的時候,會把當(dāng)前線程阻塞掉,當(dāng)有一個或多個流有 I/O 事件時,就從阻塞態(tài)中喚醒,于是程序就會輪詢一遍所有的流(epoll 是只輪詢那些真正發(fā)出了事件的流),并且只依次順序的處理就緒的流,這種做法就避免了大量的無用操作。
3.避免了不必要的上下文切換和競爭,不用考慮鎖的問題
單線程需要注意的問題:
1.一次只運(yùn)行一條命令
2.拒絕長(慢)命令
四、數(shù)據(jù)結(jié)構(gòu)
1.String
結(jié)構(gòu)和命令:
key-value:value最大為512MB
應(yīng)用場景:
- 緩存
- 計數(shù)器
- 分布式鎖
常用命令:
- get、set、del
- incr:incr key 自增1,如果key不存在,自增后get(key)=1
- decr:自減
- incrby:incrby key k 自增k
- decrby
- setnx:key不存在,才設(shè)置(添加鍵值)
- setxx:key存在才設(shè)置(更新鍵值)
-
mget、mset:get、set多個
n次get

1次mget節(jié)省了網(wǎng)絡(luò)時間
- getset、append、strlen
應(yīng)用:
1.記錄網(wǎng)站每個用戶個人主頁的訪問量:
incr userid:pageview
2.緩存視頻的基本信息(數(shù)據(jù)源在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));
}
}
return videoInfo;
}
3.分布式id生成器
2.哈希
結(jié)構(gòu):

hash結(jié)構(gòu)
filed不能相同
命令:
- hget、hset、hdel / 例:hget key field
- hexists、hlen
- hmget、hmset
- hgetall、hvals、hkeys O(n)
應(yīng)用:
1.記錄網(wǎng)站每個用戶訪問量
hincrby user pageViewCount
3.list
有序、可以重復(fù)、可以從左右彈出
命令:
- rpush:從右邊插入 lpush
- rpop、lpop
- rinsert、linsert
- lrem O(n)
lrem key count value
//根據(jù)count值,從列表中刪除所有value相等的項
(1) count>0,從左到右,刪除最多count個value相等的項
(2)count<0,從右到左,刪除最多Math.abs(count)個value相等的項
(3)count=0,刪除所有value相等的項
- ltrim
ltrim key start end
//按照索引范圍修剪列表
- lrange
- lindex
- llen
- lset
應(yīng)用:
1.時間線(微博)

image.png
4.set
無序,不能重復(fù),集合間操作
命令:
- sadd,srem
- 可以做集合間的操作,sinter(交),sdiff(差),sunion(并)
- scard:計算集合大小
- sismember:是否是集合中的元素
- srandmember:從集合中隨機(jī)挑count個元素,但是不會彈出
- spop:從集合中隨機(jī)彈出一個元素
- smembers:從集合中取出所有的元素
5.有序集合

有序集合結(jié)構(gòu)

集合VS有序結(jié)合
命令:
- zadd、zrem
- zscore
- zcard
- zrange、zrangebyscore
- zcount
- zremrangebyscore、zremrangebyrank

