高性能key-value 数据库,可每秒处理超过10w条数据读写!
redis在每60秒以此更新,若更改达到1W则dump到硬盘中!每次dump数据fork一个子进程!
redis单线程单进程
redis读写分离模型:
一个master + 多个slave,master能同步到slave,slave不能同步到master!
redis所有操作都是原子操作
二进制安全,存储的所有的数据都是有意义的,无任何格式符号,按二进制格式存储!
数据类型:
字符串:
redis所有字符串都是二进制安全的,可以存储任何数据(字符串,图片,音频...),上限512M
redis 127.0.0.1:6379> SET name "yiibai"
OK
redis 127.0.0.1:6379> GET name
"yiibai"
set key value
get key
APPEND key value
O(1) 因为redis用的动态字符串的库在每次分配空间的时候会增加一倍的可用空闲空间
redis> EXISTS mykey
(integer) 0
redis> APPEND mykey "Hello"
(integer) 5
redis> APPEND mykey " World"
(integer) 11
redis> GET mykey
"Hello World"
redis>
BITCOUNT key [start] [end]
计算给定字符串中,被设置为 1
的比特位的数量
redis> BITCOUNT bits
(integer) 0
redis> SETBIT bits 0 1 # 0001
(integer) 0
redis> BITCOUNT bits
(integer) 1
redis> SETBIT bits 3 1 # 1001
(integer) 0
redis> BITCOUNT bits
(integer) 2
返回位的值存储在关键的字符串值的偏移
当 offset
比字符串值的长度大,或者 key
不存在时,返回 0
。
BITOP
量对一个或多个保存二进制位的字符串 key
进行位元操作,并将结果保存到 destkey
上。
当 BITOP 处理不同长度的字符串时,较短的那个字符串所缺少的部分会被看作 0
。
空的 key
也被看作是包含 0
的字符串序列。
GET key
返回 key
所关联的字符串值。
如果 key
不存在那么返回特殊值 nil
。
假如 key
储存的值不是字符串类型,返回一个错误,因为 GET 只能用于处理字符串值
MGET key [key ...]
返回所有(一个或多个)给定 key
的值。
如果给定的 key
里面,有某个 key
不存在,那么这个 key
返回特殊值 nil
。因此,该命令永不失败。
redis> SET redis redis.com
OK
redis> SET mongodb mongodb.org
OK
redis> MGET redis mongodb
1) "redis.com"
2) "mongodb.org"
redis> MGET redis mongodb mysql # 不存在的 mysql 返回 nil
1) "redis.com"
2) "mongodb.org"
3) (nil)
MSET key value [key value ...]
同时设置一个或多个 key-value
对。
如果某个给定 key
已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令:它只会在所有给定 key
都不存在的情况下进行设置操作。
MSET 是一个原子性(atomic)操作,所有给定 key
都会在同一时间内被设置,某些给定 key
被更新而另一些给定 key
没有改变的情况,不可能发生。
MSETNX key value [key value ...]
同时设置一个或多个 key-value
对,当且仅当所有给定 key
都不存在。
即使只有一个给定 key
已存在, MSETNX 也会拒绝执行所有给定 key
的设置操作。
MSETNX 是原子性的,因此它可以用作设置多个不同 key
表示不同字段(field)的唯一性逻辑对象(unique logic object),所有字段要么全被设置,要么全不被设置。
# 对不存在的 key 进行 MSETNX
redis> MSETNX rmdbs "MySQL" nosql "MongoDB" key-value-store "redis"
(integer) 1
redis> MGET rmdbs nosql key-value-store
1) "MySQL"
2) "MongoDB"
3) "redis"
# MSET 的给定 key 当中有已存在的 key
redis> MSETNX rmdbs "Sqlite" language "python" # rmdbs 键已经存在,操作失败
(integer) 0
redis> EXISTS language # 因为 MSET 是原子性操作,language 没有被设置
(integer) 0
redis> GET rmdbs # rmdbs 也没有被修改
"MySQL"
SETEX key seconds value
将值 value
关联到 key
,并将 key
的生存时间设为 seconds
(以秒为单位)。
如果 key
已经存在, SETEX 命令将覆写旧值。
这个命令类似于以下两个命令:
不同之处是, SETEX 是一个原子性(atomic)操作,关联值和设置生存时间两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。
# 在 key 不存在时进行 SETEX
redis> SETEX cache_user_id 60 10086
OK
redis> GET cache_user_id # 值
"10086"
redis> TTL cache_user_id # 剩余生存时间
(integer) 49
# key 已经存在时,SETEX 覆盖旧值
redis> SET cd "timeless"
OK
redis> SETEX cd 3000 "goodbye my love"
OK
redis> GET cd
"goodbye my love"
redis> TTL cd
(integer) 2997
PSETEX key milliseconds value
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key
的生存时间,而不是像 SETEX 命令那样,以秒为单位。
redis> PSETEX mykey 1000 "Hello"
OK
redis> PTTL mykey
(integer) 999
redis> GET mykey
"Hello"
SETBIT key offset value
对 key
所储存的字符串值,设置或清除指定偏移量上的位(bit)。
位的设置或清除取决于 value
参数,可以是 0
也可以是 1
。
当 key
不存在时,自动生成一个新的字符串值。
字符串会进行伸展(grown)以确保它可以将 value
保存在指定的偏移量上。当字符串值进行伸展时,空白位置以 0
填充。
offset
参数必须大于或等于 0
,小于 2^32 (bit 映射被限制在 512 MB 之内)。
SETNX key value
将 key
的值设为 value
,当且仅当 key
不存在。
若给定的 key
已经存在,则 SETNX 不做任何动作。
SETNX 是『SET if Not eXists』(如果不存在,则 SET)的简写。
redis> EXISTS job # job 不存在
(integer) 0
redis> SETNX job "programmer" # job 设置成功
(integer) 1
redis> SETNX job "code-farmer" # 尝试覆盖 job ,失败
(integer) 0
redis> GET job # 没有被覆盖
"programmer"
SETRANGE key offset value
用 value
参数覆写(overwrite)给定 key
所储存的字符串值,从偏移量 offset
开始。
不存在的 key
当作空白字符串处理
# 对非空字符串进行 SETRANGE
redis> SET greeting "hello world"
OK
redis> SETRANGE greeting 6 "Redis"
(integer) 11
redis> GET greeting
"hello Redis"
# 对空字符串/不存在的 key 进行 SETRANGE
redis> EXISTS empty_string
(integer) 0
redis> SETRANGE empty_string 5 "Redis!" # 对不存在的 key 使用 SETRANGE
(integer) 11
redis> GET empty_string # 空白处被"\x00"填充
"\x00\x00\x00\x00\x00Redis!"
STRLEN key
返回 key
所储存的字符串值的长度。
当 key
储存的不是字符串值时,返回一个错误。
key
不存在时,返回
0
# 获取字符串的长度
redis> SET mykey "Hello world"
OK
redis> STRLEN mykey
(integer) 11
# 不存在的 key 长度为 0
redis> STRLEN nonexisting
(integer) 0
List
按插入顺序排列, push,pop,获取范围值list中存储字符串,按插入顺序排列, push,pop操作
最对2^32 -1 个元素
LPUSH命令插入一个新元素到列表头部,
RPUSH命令 插入一个新元素到列表的尾部
对一个空key执行其中某个命令时,将会创建一个新表
Redis列表主要的特性就是支持时间常数的 插入和靠近头尾部元素的删除
中间元素复杂度为 O(N)
- 列表可以用来当作消息传递的基元(primitive),例如,众所周知的用来创建后台任务的Resque Ruby库。
- 你可以使用列表做更多事,这个数据类型支持许多命令,包括像BLPOP这样的阻塞命令。请查看所有可用的列表操作命令获取更多的信息
set
数学中的集合概念,支持交、并、差!
SetZSet(Sorted Set)
每个有序集合 的成员都关联着一个评分,这个评分用于把有序集 合中的成员按最低分到最高分排列。
可以理解为一张一列存value,一列存顺序
(O(log(N)))完成添加,删除和更新元素的操作表
Hashes
Redis Hashes是字符串字段和字符串值之间的映射,所以它们是完美的表示对象(eg:一个有名,姓,年龄等属性的用户)的数据类型。
支持数据类型
String
List
Set
SortedSet
Hashes