您的位置:首页 > 数据库 > Redis

redis 笔记

2015-08-29 22:34 639 查看
高性能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


GETBIT key
offset返回位的值存储在关键的字符串值的偏移

当 
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 命令将覆写旧值。
这个命令类似于以下两个命令:

SET key value
EXPIRE key seconds  # 设置生存时间


不同之处是, 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: