您的位置:首页 > 理论基础 > 数据结构算法

Redis 的数据结构,持久化和主从同步

2013-09-04 09:43 253 查看
Redis 是一个开源的使用ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志

型、Key-Value 数据库。

数据类型

Redis 的Key

key 相关指令介绍

exits key 检测指定key 是否存在,返回1表示存在,0 不存在

del key1 key2 ...... keyN 删除给定key,返回删除key 的数目,0表示给定key都不存在

type key 返回给定key值的类型。返回none 表示key不存在,string字符类型,list 链表

类型set 无序集合类型......

keys pattern 返回匹配指定模式的所有key

randomkey 返回从当前数据库中随机选择的一个key,如果当前数据库是空的,返回空串

rename oldkey newkey 重命名一个key,如果newkey 存在,将会被覆盖,返回1 表示成功,

0 失败。可能是oldkey 不存在或者和newkey 相同。

renamenx oldkey newkey 同上,但是如果newkey存在返回失败。

expire key seconds 为key指定过期时间,单位是秒。返回1成功,0 表示key 已经设置过过

期时间或者不存在。

ttl key 返回设置过过期时间key的剩余过期秒数。-1表示key不存在或者未设置过期时间。

select db-index 通过索引选择数据库,默认连接的数据库是0,默认数据库数是16 个。返回1

表示成功,0 失败。

move key db-index 将key 从当前数据库移动到指定数据库。返回1 表示成功。0 表示key

不存在或者已经在指定数据库中。

Redis 的vaule

redis 提供五种数据类型:string,hash,list,set 及sorted set。

string 类型数据操作指令简介

set key value 设置key对应string 类型的值,返回1 表示成功,0失败。

setnx key value 如果key 不存在,设置key 对应string 类型的值。如果key 已经存在,返

回0。

get key 获取key对应的string值,如果key不存在返回nil

getset key value 先获取key的值,再设置key的值。如果key不存在返回nil。

mget key1 key2 ...... keyN 一次获取多个key 的值,如果对应key不存在,则对应返回nil。

mset key1 value1 ...... keyN valueN 一次设置多个key的值,成功返回1表示所有的值都设置

了,失败返回0 表示没有任何值被设置。

msetnx key1 value1 ...... keyN valueN 一次设置多个key的值,但是不会覆盖已经存在的key

incr key 对key 的值做++操作,并返回新的值。注意incr一个不是int 的value 会返回错

误,incr 一个不存在的key,则设置key 值为1。

decr key 对key的值做--操作,decr一个不存在key,则设置key值为-1。

incrby key integer 对key 加上指定值,key 不存在时候会设置key,并认为原来的value

是0。

decrby key integer 对key减去指定值。decrby完全是为了可读性,我们完全可以通过incrby

一个负值来实现同样效果,反之一样。

hash 类型数据操作指令简介

hash 是一个string 类型的field 和value 的映射表。添加,删除操作都是O(1)(平均)。

hash 特别适合用于存储对象。

hset key field value 设置hash field为指定值,如果key不存在,则创建

hget key field 获取指定的hash field。

hmget key filed1....fieldN 获取全部指定的hash filed。

hmset key filed1 value1 ...... filedN valueN 同时设置hash的多个field。

hincrby key field integer 将指定的hash filed 加上指定值。成功返回hash filed 变更后的

值。

hexists key field 检测指定field是否存在。

hdel key field 删除指定的hash field。

hlen key 返回指定hash的field 数量。

hkeys key 返回hash 的所有field。

hvals key 返回hash的所有value。

hgetall 返回hash的所有filed和value

List 类型数据操作指令简介

list 是一个链表结构,可以理解为一个每个子元素都是string 类型的双向链表。主要功

能是push、pop、获取一个范围的所有值等。操作中key 理解为链表的名字。

lpush key string 在key 对应list 的头部添加字符串元素,返回1 表示成功,0 表示key 存

在且不是list 类型。

rpush key string 在key对应list的尾部添加字符串元素。

llen key 返回key 对应list 的长度,如果key 不存在返回0,如果key 对应类型不是list

返回错误。

lrange key start end 返回指定区间内的元素,下标从0 开始,负值表示从后面计算,-1表示

倒数第一个元素,key 不存在返回空列表。

ltrim key start end 截取list指定区间内元素,成功返回1,key不存在返回错误。

lset key index value 设置list 中指定下标的元素值,成功返回1,key或者下标不存在返回

错误。

lrem key count value从List 的头部(count正数)或尾部(count负数)删除一定数量(count)

匹配value 的元素,返回删除的元素数量。count 为0 时候删除全部。

lpop key 从list的头部删除并返回删除元素。如果key对应list不存在或者是空返回nil,

如果key 对应值不是list 返回错误。

rpop key 从list的尾部删除并返回删除元素。

blpop key1 ...... keyN timeout 从左到右扫描,返回对第一个非空list进行lpop操作并返回,

比如blpop list1 list2 list3 0 ,如果list 不存在list2,list3 都是非空则对list2 做

lpop 并返回从list2 中删除的元素。如果所有的list 都是空或不存在,则会阻塞timeout

秒,timeout 为0 表示一直阻塞。当阻塞时,如果有client 对key1...keyN 中的任意key

进行push 操作,则第一在这个key 上被阻塞的client 会立即返回。如果超时发生,则返回

nil。有点像unix 的select 或者poll。

brpop 同blpop,一个是从头部删除一个是从尾部删除。

set 类型数据操作指令简介

set 是无序集合,最大可以包含(2 的32 次方-1)个元素

sadd key member 添加一个string 元素到key 对应set 集合中,成功返回1,如果元素以及

在集合中则返回0,key 对应的set 不存在则返回错误。

srem key member 从key 对应set 中移除指定元素,成功返回1,如果member 在集合中不

存在或者key 不存在返回0,如果key 对应的不是set 类型的值返回错误。

spop key 删除并返回key 对应set 中随机的一个元素,如果set 是空或者key 不存在返回

nil。

srandmember key 同spop,随机取set中的一个元素,但是不删除元素。

smove srckey dstkey member 从srckey对应set中移除member并添加到dstkey对应set中,

整个操作是原子的。成功返回1,如果member 在srckey 中不存在返回0,如果key 不是set

类型返回错误。

scard key 返回set的元素个数,如果set是空或者key不存在返回0。

sismember key member 判断member 是否在set 中,存在返回1,0 表示不存在或者key 不

存在。

sinter key1 key2 …… keyN 返回所有给定key 的交集。

sinterstore dstkey key1 ....... keyN 返回所有给定key的交集,并保存交集存到dstkey下。

sunion key1 key2 ...... keyN 返回所有给定key的并集。

sunionstore dstkey key1 ...... keyN 返回所有给定key的并集,并保存并集到dstkey下。

sdiff key1 key2 ...... keyN 返回所有给定key 的差集。

sdiffstore dstkey key1 ...... keyN 返回所有给定key的差集,并保存差集到dstkey下。

smembers key 返回key 对应set 的所有元素,结果是无序的。

Sorted Set 类型数据操作指令简介

sorted set 是有序集合

add key score member 添加元素到集合,元素在集合中存在则更新对应score。

zrem key member 删除指定元素,1表示成功,如果元素不存在返回0。

zincrby key incr member 增加对应member 的score 值,然后移动元素并保持skip list 保持有

序。返回更新后的score 值。

zrank key member 返回指定元素在集合中的排名(下标),集合中元素是按score 从小到大

排序的。

zrevrank key member 同上,但是集合中元素是按score 从大到小排序。

zrange key start end 类似lrange 操作从集合中去指定区间的元素。返回的是有序结果

zrevrange key start end 同上,返回结果是按score逆序的。

zrangebyscore key min max 返回集合中score在给定区间的元素。

zcount key min max 返回集合中score在给定区间的数量。

zcard key 返回集合中元素个数。

zscore key element 返回给定元素对应的score。

zremrangebyrank key min max 删除集合中排名在给定区间的元素。

zremrangebyscore key min max 删除集合中score 在给定区间的元素

持久化

持久化有两种方式: 快照方式和日志追加方式

快照方式

客户端也可以使用save 或者bgsave 命令通知redis 做一次快照持久化。save 操作是在

主线程中保存快照的,由于redis 是用一个主线程来处理所有客户端的请求,这种方式会阻

塞所有客户端请求。所以不推荐使用。

每次快照持久化都是将内存数据完整写入到磁盘一次,并不是增量的只同步增量数据。

日志追加方式

这种方式redis 会将每一个收到的写命令都通过write 函数追加到文件中

appendonly yes //启用日志追加持久化方式

#appendfsync always //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全

的持久化,不推荐使用

appendfsync everysec //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折

中,推荐

#appendfsync no //完全依赖操作系统,性能最好,持久化没保证

Redis 虚拟内存简介

对于redis 这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis 服务器以外。另外的能够提高数据库容量的办法就是使用虚拟内存技术把那些不经常访问的数据交换到磁盘上。

Redis 虚拟内存相关配置

vm-enabled yes #开启虚拟内存功能

vm-swap-file /tmp/redis.swap #交换出来value 保存的文件路径/tmp/redis.swap

vm-max-memory 268435456 #redis 使用的最大内存上限(256MB),超过上限后

redis 开始交换value 到磁盘swap 文件中。建议设置为系统空闲内存的60%-80%

vm-page-size 32 #每个redis 页的大小32 个字节

vm-pages 134217728 #最多在文件中使用多少个页,交换文件的大小=

(vm-page-size * vm-pages)4GB

vm-max-threads 8 #用于执行value 对象换入换出的工作线程数量。0

表示不使用工作线程

主从同步

Redis 支持将数据同步到多台从库上,这种特性对提高读取性能非常有益。

1) master 可以有多个slave。

2) 除了多个slave 连到相同的master 外,slave 也可以连接其它slave 形成图状结构。

3) 主从复制不会阻塞master。也就是说当一个或多个slave 与master 进行初次同步数据

时,master 可以继续处理客户端发来的请求。相反slave 在初次同步数据时则会阻塞

不能处理客户端的请求。

4) 主从复制可以用来提高系统的可伸缩性,我们可以用多个slave 专门用于客户端的读

请求,比如sort 操作可以使用slave 来处理。也可以用来做简单的数据冗余。

5) 可以在master 禁用数据持久化,只需要注释掉master 配置文件中的所有save 配置,然

后只在slave 上配置数据持久化。

配置slave 服务器很简单,只需要在配置文件中加入如下配置

slaveof 192.168.1.1 6379 #指定master 的ip 和端口
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: