Redis学习笔记

1.数据类型与API

Key 相关命令

常用命令

命令 含义 时间复杂度
keys 查找所有符合给定模式 pattern 的 key O(N), N 为数据库中 key 的数量
dbsize 计算key的总数 O(1)
exists 检查key是否存在 O(1)
del 删除指定的key-value O(1)
expire、ttl、persist 设置、查看、去掉key的过期时间 O(1)
type 查看key的类型 O(1)

keys (遍历key)

当key较多时,命令执行时间较长,会造成阻塞,慎用该命令。

  • keys * (遍历所有key)
  • keys [pattern] (遍历所有正则表达式匹配的key)

dbsize (计算key的总数)

127.0.0.1:6379> mset hello world hehe haha php good phe his
OK
127.0.0.1:6379> keys *
1) "hello"
2) "phe"
3) "php"
4) "hehe"
127.0.0.1:6379> keys he*
1) "hello"
2) "hehe"
127.0.0.1:6379> keys he[h-l]*
1) "hello"
2) "hehe"
127.0.0.1:6379> keys ph?
1) "phe"
2) "php"
127.0.0.1:6379> dbsize
(integer) 4

exists key (检查key是否存在)

del key [key2 key3 …] (删除指定的key-value,可一次删除多个)

127.0.0.1:6379> exists hello
(integer) 1
127.0.0.1:6379> del hello php
(integer) 2
127.0.0.1:6379> exists hello
(integer) 0
127.0.0.1:6379> get hello
(nil)

expire、ttl、persist (设置、查看、去掉key的过期时间)

  • expire key seconds (key在seconds秒后过期)
  • ttl key (查看key剩余过期时间)

    大于等于0时,表示剩余过期秒数
    -1 表示key存在,并且没有过期时间
    -2 表示key已经不存在了

  • persist key (去掉key的过期时间)

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) 12
127.0.0.1:6379> get hello
"world"
127.0.0.1:6379> ttl hello
(integer) -2
127.0.0.1:6379> get hello
(nil)

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) 14
127.0.0.1:6379> persist hello
(integer) 1
127.0.0.1:6379> ttl hello
(integer) -1
127.0.0.1:6379> get hello
"world"

type key (查看key的类型)

string
hash
list
set
zset
none

127.0.0.1:6379> set a 1
OK
127.0.0.1:6379> type a
string
127.0.0.1:6379> sadd myset 1 2 3
(integer) 3
127.0.0.1:6379> type myset
set

更多 Key 相关命令:http://www.redis.cn/commands.html#generic

String (字符串)

场景

  • 缓存 (key-value、存储json)
  • 分布式锁
  • 计数器
  • Bits

常用命令

命令 含义 时间复杂度
set、get、del 设置、获取、删除key-value O(1)
setnx、set xx 根据key是否存在设置key-value O(1)
incr、decr、incrby、decrby、incrbyfloat 计数 O(1)
mget、mset 批量操作key-value O(N),N 为给定 key 的数量
getset 为key设置新值,并返回旧值 O(1)
append 将value追加到旧的value后 O(1)
strlen 返回字符串的长度 O(1)
setrange、getrange 设置、获取字符串指定下标对应的值 O(1)

get、set、del

  • get key (获取key对应的value)
  • set key value (设置key-value)
  • del key (删除key-value)

incr、decr、incrby、decrby

  • incr key (key自增1,如果key不存在,自增后get(key)=1)
  • decr key (key自减1,如果key不存在,自增后get(key)=-1)
  • incrby key n (key自增n,如果key不存在,自增后get(key)=n)
  • decrby key n (key自减n,如果key不存在,自增后get(key)=-n)

set、setnx、set xx

  • set key value (不管key是否存在,都设置)
  • setnx key value (key不存在,才设置)
  • set key value xx (key存在,才设置)
127.0.0.1:6379> exists php
(integer) 0
127.0.0.1:6379> set php good
OK
127.0.0.1:6379> setnx php bad
(integer) 0
127.0.0.1:6379> set php best xx
OK
127.0.0.1:6379> get php
"best"
127.0.0.1:6379> exists java
(integer) 0
127.0.0.1:6379> setnx java best
(integer) 1
127.0.0.1:6379> exists lua
(integer) 0
127.0.0.1:6379> set lua hehe xx
(nil)

mget、mget

  • mget key1 key2 key3 … (批量获取key,原子操作)
  • mset key1 value1 key2 value2 key3 value3 … (批量设置key-value)

getset、append、strlen

  • getset key newvalue (为key设置新值,并返回旧值)
  • append key value (将value追加到旧的value后)
  • strlen key (返回字符串的长度(注意中文))
127.0.0.1:6379> get java
"best"
127.0.0.1:6379> getset java hello
"best"
127.0.0.1:6379> get java
"hello"
127.0.0.1:6379> append java world
(integer) 10
127.0.0.1:6379> get java
"helloworld"
127.0.0.1:6379> strlen java
(integer) 10

incrbyfloat、getrange、setrange

  • incrbyfloat key 3.5 (为key对应的值增加3.5)
  • getrange key start end (获取字符串指定下标所有的值)
  • setrange key index value (设置指定下标所对应的值)
127.0.0.1:6379> incr counter
(integer) 1
127.0.0.1:6379> incrbyfloat counter 1.1
"2.1"
127.0.0.1:6379> get counter
"2.1"
127.0.0.1:6379> set hello javabest
OK
127.0.0.1:6379> getrange hello 0 2
"jav"
127.0.0.1:6379> setrange hello 4 p
(integer) 8
127.0.0.1:6379> get hello
"javapest"

更多 String 相关命令:http://www.redis.cn/commands.html#string

实战

分布式ID生成器

Redis学习笔记_第1张图片

注意

  • 最大长度 512M

Hash (哈希)

常用命令

命令 含义 时间复杂度
hget、hset 设置、获取hash key对应的field的value O(1)
hdel 删除hash key对应的一个或多个field O(N),N 为要删除的域的数量
hexists 判断hash key是否有指定的field O(1)
hlen 获取hash key 的field的数量 O(1)
hmget、hmset 批量、获取hash key的一批field对应的值 O(N),N 为给定field的数量
hkeys、hvals、hgetall 返回hash key对应所有的field、value、field和value O(N),N 为哈希表的大小
hsetnx 设置hash key 对应field (如果field已存在,则失败) O(1)
hincrby、hincrbyfloat hash key 对应的field的value自增initCounter O(1)

hget、hset、hdel

  • hget key field (获取hash key对应的field的value)
  • hset key field value (设置hash key 对应field的value)
  • hdel key field (删除hash key 对应field的value)
127.0.0.1:6379> hset user:1:info age 23
(integer) 1
127.0.0.1:6379> hget user:1:info age
"23"
127.0.0.1:6379> hset user:1:info name ronaldo
(integer) 1
127.0.0.1:6379> hgetall user:1:info
1) "age"
2) "23"
3) "name"
4) "ronaldo"
127.0.0.1:6379> hdel user:1:info age
(integer) 1
127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "ronaldo"

hexists、hlen

  • hexists key field (判断hash key是否有指定的field)
  • hlen key (获取hash key 的field的数量)
127.0.0.1:6379> hgetall user:1:info
1) "name"
2) "ronaldo"
127.0.0.1:6379> hexists user:1:info name
(integer) 1
127.0.0.1:6379> hexists user:1:info age
(integer) 0
127.0.0.1:6379> hlen user:1:info
(integer) 1

hmget、hmset

  • hmget key field1 field2 field3 … (批量获取hash key的一批field对应的值)
  • hmset key field1 value1 field2 value2 … (批量设置hash key的一批field value)

hgetall、hvals、hkeys

  • hkeys key (返回hash key 对应所有field)
  • hvals key (返回hash key 对应所有field的value)
  • hgetall key (返回hash key 对应所有的field和value)
127.0.0.1:6379> hmset user:2:info age 30 name kaka page 50
OK
127.0.0.1:6379> hgetall user:2:info
1) "age"
2) "30"
3) "name"
4) "kaka"
5) "page"
6) "50"
127.0.0.1:6379> hkeys user:2:info
1) "age"
2) "name"
3) "page"
127.0.0.1:6379> hvals user:2:info
1) "30"
2) "kaka"
3) "50"

hsetnx、hincrby、hincrbyfloat

  • hsetnx key field value (设置hash key 对应field (如果field已存在,则失败))
  • hincrby key field initCounter (hash key 对应的field的value自增initCounter)
  • hincrbyfloat key field floatCounter (hincrby浮点数版)

更多 Hash 相关命令:http://www.redis.cn/commands.html#string

实战

记录网站每个用户个人主页的访问量

hincrby user:1:info pageview count

缓存视频对象基本信息

String vs Hash

相似的API

String Hash
get hget
set、setnx hset、hsetnx
del hdel
incr、incrby、decr、decrby hincrby
mset hmset
mget hmget

List (列表)

特点

  • 有序
  • 可以重复
  • 左右两边插入弹出
    Redis学习笔记_第2张图片
    Redis学习笔记_第3张图片

常用命令

命令 含义 时间复杂度
lrange 获取列表指定索引范围的所有item O(S+N),S 为偏移量 start,N 为指定区间内元素的数量。
lpush、rpush 从列表左/右侧插入1-N个值 O(1)
lpop、rpop 从列表左/右侧弹出1个值 O(1)
linsert 在list指定的值前/后插入newValue O(N), N 为寻找 pivot 过程中经过的元素数量。
lrem 从列表中删除value相等的项 O(N), N 为列表的长度。
ltrim 按照索引范围修剪列表 O(N),N 为被移除的元素的数量。
lindex 获取列表指定索引的item O(N), N 为到达下标 index 过程中经过的元素数量。因此,对列表的头元素和尾元素执行 LINDEX 命令,复杂度为O(1)。
llen 获取列表长度 O(1)
lset 设置列表指定索引值为newValue 对头元素或尾元素进行 LSET 操作,复杂度为 O(1)。其他情况下,为 O(N), N 为列表的长度。

lrange

  • lrange key start end (获取列表指定索引范围的所有item(包含start和end))
    a - b - c - d - e - f
    索引从左到右 0 ~ 5
    索引从右到左 -1 ~ -6
127.0.0.1:6379> rpush listkey a b c d e f
(integer) 6
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lrange listkey 0 2
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> lrange listkey 1 -2
1) "b"
2) "c"
3) "d"
4) "e"

lpush、rpush

  • lpush key value1 value2 value3 … (从列表左侧插入1-N个值)
  • rpush key value1 value2 value3 … (从列表右侧插入1-N个值)
127.0.0.1:6379> lpush listkey c b a
(integer) 3
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> rpush listkey c b a
(integer) 6
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
4) "c"
5) "b"
6) "a"

lpop、rpop

  • lpop key (从列表左侧弹出一个item)
  • rpop key (从列表右侧弹出一个item)
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
4) "c"
5) "b"
6) "a"
127.0.0.1:6379> lpop listkey
"a"
127.0.0.1:6379> lrange listkey 0 -1
1) "b"
2) "c"
3) "c"
4) "b"
5) "a"
127.0.0.1:6379> rpop listkey
"a"
127.0.0.1:6379> lrange listkey 0 -1
1) "b"
2) "c"
3) "c"
4) "b"

linsert

  • linsert key before|after value newValue (在list指定的值前|后插入newValue)
127.0.0.1:6379> lrange listkey 0 -1
1) "b"
2) "c"
3) "c"
4) "b"
127.0.0.1:6379> linsert listkey before b 0
(integer) 5
127.0.0.1:6379> lrange listkey 0 -1
1) "0"
2) "b"
3) "c"
4) "c"
5) "b"
127.0.0.1:6379> linsert listkey after c 1
(integer) 6
127.0.0.1:6379> lrange listkey 0 -1
1) "0"
2) "b"
3) "c"
4) "1"
5) "c"
6) "b"

lrem

  • lrem key count value (根据count的值,从列表中删除value相等的项)
    (1) count>0,从左到右,删除最多count个value相等的项
    (2) count<0,从右到左,删除最多abs(count)个value相等的项
    (3) count=0,从左到右,删除所有value相等的项
127.0.0.1:6379> lrange listkey 0 -1
1) "0"
2) "b"
3) "c"
4) "1"
5) "c"
6) "b"
127.0.0.1:6379> lrem listkey 1 b
(integer) 1
127.0.0.1:6379> lrange listkey 0 -1
1) "0"
2) "c"
3) "1"
4) "c"
5) "b"
127.0.0.1:6379> lrem listkey -1 c
(integer) 1
127.0.0.1:6379> lrange listkey 0 -1
1) "0"
2) "c"
3) "1"
4) "b"

ltrim

  • ltrim key start end (按照索引范围修剪列表)
127.0.0.1:6379> lrange listkey 0 -1
1) "c"
2) "b"
3) "a"
4) "a"
5) "b"
6) "c"
127.0.0.1:6379> ltrim listkey 1 3
OK
127.0.0.1:6379> lrange listkey 0 -1
1) "b"
2) "a"
3) "a"

lindex

  • lindex key index (获取列表指定索引的item)

llen

  • llen key (获取列表长度)
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lindex listkey 0
"a"
127.0.0.1:6379> lindex listkey -1
"f"
127.0.0.1:6379> llen listkey
(integer) 6

lset

  • lset key index newValue (设置列表指定索引值为newValue)
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "c"
127.0.0.1:6379> lset listkey 2 0
OK
127.0.0.1:6379> lrange listkey 0 -1
1) "a"
2) "b"
3) "0"

更多 List 相关命令:http://www.redis.cn/commands.html#list

Tips

lpush + lpop = Stack (栈)
lpush + rpop = Queue (队列)
lpush + ltrim = Capped Collection (定容集合)
lpush + brpop = Message Queue (消息队列)

Set(集合)

特点

  • 无序
  • 无重复
  • 集合间操作

常用命令

命令 含义 时间复杂度
sadd 将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略 O(N), N 是被添加的元素的数量。
srem 移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。 O(N), N 为给定 member 元素的数量
smove 将 member 元素从 A 集合移动到 B 集合 O(1)
scard 集合中元素的数量 O(1)
sismember 判断 member 元素是否集合 key 的成员 O(1)
smembers 返回集合 key 中的所有成员 O(N),N 为集合的基数
srandmember 从集合中随机挑选指定数量元素返回 O(N),N 为返回数组的元素个数
spop 移除并返回集合中的一个随机元素 O(1)
sdiff、sdiffstore 给定集合之间的差集(将结果保存到新的集合) O(N),N 是所有给定集合的成员数量之和。
sinter、sinterstore 给定集合之间的交集(将结果保存到新的集合) O(N * M),N 为给定集合当中基数最小的集合,M 为给定集合的个数。
sunion、sunionstore 给定集合之间的并集(将结果保存到新的集合) O(N), N 是所有给定集合的成员数量之和

sadd、srem

  • sadd key element1 element2 … (向集合key添加element(如果element已经存在,则添加失败))
  • srem key element1 element2 … (移除key中的element元素)

scard、sismember、srandmember、smembers

  • scard key (计算集合大小)
  • sismember key element (判断element是否在集合中)
  • srandmember key count (从集合中随机挑选count个元素)
  • spop key(从集合中随机弹出一个元素)
  • smembers key(获取集合中所有元素)
127.0.0.1:6379> sadd setkey go c c++ c# php java python
(integer) 7
127.0.0.1:6379> sadd setkey go
(integer) 0
127.0.0.1:6379> sadd setkey matlab c
(integer) 1
127.0.0.1:6379> smembers setkey
1) "php"
2) "python"
3) "go"
4) "c++"
5) "matlab"
6) "java"
7) "c"
8) "c#"
127.0.0.1:6379> srem setkey c c++
(integer) 2
127.0.0.1:6379> smembers setkey
1) "matlab"
2) "java"
3) "c#"
4) "go"
5) "python"
6) "php"
127.0.0.1:6379> scard setkey
(integer) 6
127.0.0.1:6379> sismember setkey c++
(integer) 0
127.0.0.1:6379> sismember setkey php
(integer) 1
127.0.0.1:6379> srandmember setkey 3
1) "go"
2) "python"
3) "java"
127.0.0.1:6379> srandmember setkey 3
1) "go"
2) "java"
3) "c#"
127.0.0.1:6379> spop setkey
"matlab"
127.0.0.1:6379> spop setkey
"java"
127.0.0.1:6379> smembers setkey
1) "go"
2) "python"
3) "c#"
4) "php"

srandmember 和 spop: spop 从集合中弹出;srandmember 不会破坏集合

sdiff、sinter、sunion

  • sdiff setkey1 setkey2 (setkey1 setkey2的差集)
  • sinter setkey1 setkey2 (setkey1 setkey2的交集)
  • sunion setkey1 setkey2 (setkey1 setkey2的并集)
  • sdiff|sinter|suion + store destkey setkey1 setkey2 (将差集、交集、并集结果保存到destkey中)

示例见下面 实战 中的 粉丝

更多 Set 相关命令:http://www.redis.cn/commands.html#set

实战

抽奖系统

  • spop

记录点赞,踩的用户

标签

  • 给用户添加标签
sadd user:1:tags tag1 tag2 tag5
sadd user:2:tags tag3 tag4 tag5
...
sadd user:n:tags tag1 tag3 tag5
  • 给标签添加用户
sadd tag:1:users user1 user3
sadd tag:2:users user3 user5 user6
...
sadd tag:n:users user1 user4

粉丝

  • 关注
127.0.0.1:6379> sadd user:1:follow 2 3 5 6 8 9
(integer) 6
127.0.0.1:6379> sadd user:2:follow 1 3 5 7 8 9
(integer) 6
  • 粉丝
127.0.0.1:6379> sadd user:1:fans 2 7 9
(integer) 3
  • 我关注他,他没关注我
127.0.0.1:6379> sdiff user:1:follow user:1:fans
1) "3"
2) "5"
3) "6"
4) "8"
  • 他关注我,我没关注他
127.0.0.1:6379> sdiff user:1:fans user:1:follow
1) "7"
  • 互粉
127.0.0.1:6379> sinter user:1:follow user:1:fans
1) "2"
2) "9"
127.0.0.1:6379> sinterstore user:1:mutual_fans user:1:follow user:1:fans
(integer) 2
127.0.0.1:6379> smembers user:1:mutual_fans
1) "2"
3) "9"
  • 共同关注
127.0.0.1:6379> sinter user:1:follow user:2:follow
1) "3"
2) "5"
3) "8"
4) "9"
  • 可能认识的人(用户1和用户2关注用户的并集)
127.0.0.1:6379> sunion user:1:follow user:2:follow
1) "1"
2) "2"
3) "3"
4) "5"
5) "6"
6) "7"
7) "8"
8) "9"

Tips

sadd = Tagging (标签)
spop/srandmember = Random item (随机成员)
sadd + sinter = Social Craph (社交平台关系)

Sorted Set (有序集合)

特点

  • 有序
  • 无重复
  • 集合间操作

集合 VS 有序集合

集合 有序集合
无重复元素 无重复元素
无序 有序
element element + score

列表 VS 有序集合

列表 有序集合
可以有重复元素 无重复元素
有序 有序
element element + score

常用命令

操作类型 命令
基本操作 zadd、zrem、zcard、zincrby、zscore
范围操作 zrange、zrangebyscore、zcount、zremrangebyrank
集合操作 zunionstore、zinterstore
命令 含义 时间复杂度
zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中 O( M * log(N) ), N 是有序集的基数, M 为成功添加的新成员的数量
zrem 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略 O(M*log(N)), N 为有序集的基数, M 为被成功移除的成员的数量。
zscore 元素的分数 O(1)
zincrby 增加或减少元素的分数 O(log(N))
zcard 元素的总个数 O(1)
zrange 返回指定索引范围内的升序元素【和分值】 O(log(N) + M),N 为有序集的基数,而 M 为结果集的基数
zrangebyscore 返回指定分数范围内的升序元素【和分值】 O(log(N) + M),N 为有序集的基数,而 M 为结果集的基数
zcount 返回有序结合内,在指定分数范围内的元素个数 O(log(N) + M),N 为有序集的基数, M 为值在 min 和 max 之间的元素的数量
zremrangebyrank 删除指定排名内的升序元素 O(log(N) + M),N 为有序集的基数,而 M 为被移除成员的数量
zremrangebyscore 删除指定分数内的升序元素 O(log(N) + M),N 为有序集的基数, M 为结果集的基数

zadd

  • zadd key score element(可以是多对)(向有序集合key添加score和element)

zrem

  • zrem key element(可以是多个) (删除指定元素)

zscore

  • zscore key element (返回元素的分数)

zincrby

  • zincrby key increScore element (增加或减少元素的分数)

zcard

  • zcard key (返回元素的总个数)

zrange

  • zrange key start end [withscores] (返回指定索引范围内的升序元素【和分值】)

zrangebyscore

  • zrangebyscore key minScore maxScore [withscores] (返回指定分数范围内的升序元素【和分值】)

zcount

  • zcount key minScore maxScore (返回有序结合内,在指定分数范围内的元素个数)

zremrangebyrank

  • zremrangebyrank key start end (删除指定排名内的升序元素)

zremrangebyscore

  • zremrangebyscore key minScore maxScore (删除指定分数内的升序元素)
127.0.0.1:6379> zadd report 100 xiaoming 98 xiaohong 85 laowang 60 zhangsan 55 lisi
(integer) 5
127.0.0.1:6379> zscore report laowang
"85"
127.0.0.1:6379> zcard report
(integer) 5
127.0.0.1:6379> zrank report xiaohong
(integer) 3
127.0.0.1:6379> zrank report xiaoming
(integer) 4
127.0.0.1:6379> zrem report lisi
(integer) 1
127.0.0.1:6379> zrange report 0 -1 withscores
1) "zhangsan"
2) "60"
3) "laowang"
4) "85"
5) "xiaohong"
6) "98"
7) "xiaoming"
8) "100"
127.0.0.1:6379> zrangebyscore report 85 100 withscores
1) "laowang"
2) "85"
3) "xiaohong"
4) "98"
5) "xiaoming"
6) "100"
127.0.0.1:6379> zcount report 85 100
(integer) 3
127.0.0.1:6379> zremrangebyrank report 1 1
(integer) 1
127.0.0.1:6379> zrange report 0 -1 withscores
1) "zhangsan"
2) "60"
3) "xiaohong"
4) "98"
5) "xiaoming"
6) "100"
127.0.0.1:6379> zremrangebyscore report 85 98
(integer) 1
127.0.0.1:6379> zrange report 0 -1 withscores
1) "zhangsan"
2) "60"
3) "xiaoming"
4) "100"

其他命令

  • zrevrank
  • zrevrange
  • zrevrangebyscore
  • zinterstore
  • zunionstore

更多 Sorted Set 相关命令:http://www.redis.cn/commands.html#sorted_set

实战

  • 排行榜:新书榜、畅销榜、关注榜等。

2. 数据结构和内部编码

RedisObject

  • 数据类型(type)

string
hash
list
set
sorted set

  • 编码方式(encoding)

raw
int
ziplist
linkedlist
hashmap
intset

  • 数据指针(ptr)
  • 虚拟内存(vm)
  • 其他信息
    Redis学习笔记_第4张图片

其他

基本配置

# 配置redis作为守护进程运行
daemonize yes
# 端口号为6379
port 6379
# 数据文件存储目录
dir "/opt/soft/redis/data"
# 日志文件
logfile "redis-6379.log"

单线程

  • 1.一次只运行一条命令
  • 2.拒绝长(慢)命令

    keys, flushall, flushdb, slow lua script, mutil/exec, operate big value(collection)

  • 3.其实不是单线程

    fysnc file descriptor
    close file descriptor

你可能感兴趣的:(redis)