Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1365887
  • 博文数量: 243
  • 博客积分: 888
  • 博客等级: 准尉
  • 技术积分: 2955
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-05 14:33
个人简介

漫漫长路,其修远兮!

文章分类

全部博文(243)

文章存档

2017年(2)

2016年(22)

2015年(32)

2014年(57)

2013年(107)

2012年(23)

分类: NOSQL

2013-06-13 15:15:41

RedisRemote Dictionary Server的缩写,他本质上一个Key/Value数据库,与Memcached类似的NoSQL型数据库。

1.       redis的数据类型:

string:最大上限是1G

lists(列表)

sets(集合)

sort sets(有序集合)

hash(哈希表)

2.       特性

?  持久化

?  主从同步

?  高性能

?  多种API接口

3.       适用场合

?  取最新的N个数据  list集合

?  排行榜应用       zsort

?  需要精准设定过期时间的应用 安装时间设定zsort

?  计数器的应用    

?  获取某段时间所有数据的排重值   set

?  实时系统,反垃圾系统   

Pub/sub构建实时消息系统

?  构建队列系统     list ,sorted set

?  缓存

4.       Key相关的操作命令

Exists key 检查指定的key值是否存在,返回1表示存在,返回0表示不存在

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

Type key 返回给定key值得类型,返回none表示不存在,stringlist,。。。

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

Rename(renamenx) oldkey newkey 重命名一个Key

Expire key seconds key指定过期的时间

Ttl key 返回设置过期时间key的剩余过期秒数

Select db-index 通过索引选择数据库,默认连接的数据库是0,默认数据库数是16个,

Move key db_index key从当前数据库移动到指定的数据库

5.       String类型数据操作指令(hash操作和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的值,如果对应不存在,则对应返回nil

Mset key1 key2…..keyN 一次设置多个key

Msetnx key1 key2….keyN 一次设置多个key值,但是不会覆盖已经存在的key

Incr key key的值做++操作,并返回新的值。注意incr一个不是intvalue会返回错误,incr一个不存在的key,则设置key 的值1

Incrby key integer key值加上指定的值

Decrby key integer key 值减去指定值

6.       List类型是一个双向链表,主要功能是pushpop,获得一个范围的所有值

Lpush key string key对应的list的头部添加字符串元素

Rpush key string key对应的尾部添加字符串元素

Llen key 返回key对应list的长度

Lrang key start end 返回指定区间内的元素,下标从0开始

Ltrim key start end 截取list指定区间的元素

Lset key index value 设置list中指定下标的元素值

Lrem key count value list的头部或者尾部删除一定数量匹配value的元素

Lpop  key list的头部删除并返回删除的元素

Rpop keylist的尾部删除并返回删除的元素

Blpop

7.       Set类型是无序集合,是通过hash table 实现的

Sadd key number 添加一个string元素到key对应set集合中

Srem key number key对应的set中移除指定的元素

Spop key 删除并返回key对应set中的随机的一个元素

Srandmember key 随机选择一个元素,但不删除元素

Smove srckey dstkey member srckey对应set中移除member并添加到dstkey对应的set中。

Scard key 返回set元素的个数

Sismember key member 判断member是否在set

Sinter key1 key2 返回所有给定key 的交集

Sinterstore dstkey key1….keyn  返回所有的交集,并保存交集到dstkey

Sunion

Sunionstore

Sdiff

Sdiffstore

Smembers key 返回key对应的所有元素

8.       Sort set

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

在集合中则返回0key 对应的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 中,存在返回10 表示不存在或者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 的所有元素,结果是无序的。

 

9.       安装配置

#redis-serverRedis服务器的daemon启动程序

#redis-cliRedis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作

#redis-benchmarkRedis性能测试工具,测试Redis在你的系统及配置下的读写性能

#redis-statRedis状态检测工具,可以检测Redis当前状态参数及延迟状况

 

daemonize yes #默认是no,改为yes让其后台运行.

pidfile#pid文件位置

port#监听的端口号

timeout#请求超时时间

loglevel#log信息级别

logfile#log文件位置

databases#开启数据库的数量

save * *#保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。

rdbcompression#是否使用压缩

dbfilename#数据快照文件名(只是文件名,不包括目录)

dir#数据快照的保存目录(这个是目录)

appendonly#是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。

appendfsync#appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步)

10.   配置文件信息

daemonize 是否以后台进程运行,默认为no

pidfile 如以后台进程运行,则需指定一个pid,默认为/var/run/redis.pid

bind 绑定主机IP,默认值为127.0.0.1(注释)

port 监听端口,默认为6379

timeout 超时时间,默认为300(秒)

loglevel 日志记录等级,有4个可选值,debugverbose(默认值),noticewarning

logfile 日志记录方式,默认值为stdout

databases 可用数据库数,默认值为16,默认数据库为0

save 指出在多长时间内,有多少次更新操作,就将数据同步到数据文件。这个可以多个条件配合,比如默认配置文件中的设置,就设置了三个条件。

save 900 1 

900秒(15分钟)内至少有1key被改变

save 300 10  300秒(5分钟)内至少有300key被改变

save 60 10000  60秒内至少有10000key被改变

rdbcompression 存储至本地数据库时是否压缩数据,默认为yes

dbfilename 本地数据库文件名,默认值为dump.rdb

dir 本地数据库存放路径,默认值为 ./

slaveof 当本机为从服务时,设置主服务的IP及端口(注释)

masterauth 当本机为从服务时,设置主服务的连接密码(注释)

requirepass 连接密码(注释)

maxclients 最大客户端连接数,默认不限制(注释)

maxmemory 设置最大内存,达到最大内存设置后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理后,任到达最大内存设置,将无法再进行写入操作。(注释)

appendonly 是否在每次更新操作后进行日志记录,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认值为no

appendfilename 更新日志文件名,默认值为appendonly.aof(注释)

appendfsync 更新日志条件,共有3个可选值。no表示等操作系统进行数据缓存同步到磁盘,always表示每次更新操作后手动调用fsync()将数据写到磁盘,everysec表示每秒同步一次(默认值)。

vm-enabled 是否使用虚拟内存,默认值为no

vm-swap-file 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

vm-max-memory 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据就是keys),也就是说,vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0   

11.   CAP思想

C: Consistency 一致性

A: Availability 可用性(指的是快速获取数据)

P: Tolerance of network Partition 分区容忍性(分布式)

CA:传统的关系型数据库

APkey-value数据库

BASE

说起来很有趣,BASE的英文意义是碱,而ACID是酸。真的是水火不容啊。

Basically Availble --基本可用

Soft-state --软状态/柔性事务

"Soft state" 可以理解为"无连接", "Hard state" "面向连接"

Eventual Consistency --最终一致性

最终一致性, 也是是 ACID 的最终目的。

BASE模型反ACID模型,完全不同ACID模型,牺牲高一致性,获得可用性或可靠性: Basically

Available基本可用。支持分区失败(e.g. sharding碎片划分数据库) Soft state软状态 状态可以有一

段时间不同步,异步。 Eventually consistent最终一致,最终数据是一致的就可以了,而不是时时一致。

BASE思想的主要实现有

1.按功能划分数据库

2.sharding碎片

BASE思想主要强调基本的可用性,如果你需要高可用性,也就是纯粹的高性能,那么就要以一致性或容错性为牺牲,BASE思想的方案在性能上还是有潜力可挖的。

 

五分钟法则:在内存中保持 1KB 的数据成本相当于硬盘中存储同样大小数据 400 秒的开销(接近五分钟)。在闪存时代,5 分钟法则依然有效,只不过适合更大的内存页(适合 64KB 的页,这个页大小的变化恰恰体现了计算机硬件工艺的发展,以及带宽、延时)。

就是说如果一个页面每五分钟就会被访问一次的话,就应该把它放到内存中去,否则就应该把它存储在磁盘上

12.   亚马逊:Dynamo

Facebook: Cassandra

Googel:bigtable(Hypertable)

新浪:redis

13.   传统MySQL+ Memcached架构遇到的问题

MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间

MemcachedMySQL数据库数据一致性问题

Memcached数据命中率低或down机,大量访问直接穿透到DBMySQL无法支撑

l  跨机房cache同步问题

 

Nosql应用场景

l  少量存储,高速读写访问。Redis

l  海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。

Dynamo, bigtable

Schema freeauto-sharding. Mongodb

14.   Redis常用命令

Keys:返回满足给定pattern的所有key

Exists:确认一个key是否存在

Del:删除一个key

Expire:设置一个Key的过期时间

Move:将当前数据库中key转移到其他数据库中

Randomkey:随机返回key空间的一个key

Rename:重命名key

Type:返回值得类型

Ping:测试连接是否存活

Select:选择数据库

Dbsize:返回当前数据库key的数目

Info:获取服务器的信息和统计

Config get *:得到所有的配置信息

Flushdb:删除当前数据库的所有key;

Flushall:删除所有数据库的所有key

 

 

15.   事务

Multi:开始事务

Exec:执行事务

Discard:回滚事务

Watch:对某个key值进行加锁

Save/bgsave:做持久化操作

Bgrewriteaof

16.   redis 的虚拟内存在设计上为了保证key 的查找速度,只会将value 交换到swap 文件中。redis 规定同一个页面只能保存一个对象。但是一个对象可以保存在多个页面中。

vm-enabled yes #开启vm 功能

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

vm-max-memory 1000000 #redis 使用的最大内存上限

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

vm-pages 134217728 #最多使用多少页面

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

17.   主要nosql数据库之间的比较

 

Bigtable

Cassandra

redis

mongoDB

设计理念

海量存储和处理

简单有效的扩展

高并发

全面

数据模型

Column-family

Column-family

Key-value

Document

分布式

Single-master

P2P

M/S备份

Replica sets

特色

支持海量数据

采用dynamoP2P

Listset的处理

全面

不足

不适用低延迟的应用

Dynamo机制收到限制

在分布式方面支持有限

在性能和扩展性方面有限

阅读(2798) | 评论(0) | 转发(2) |
给主人留下些什么吧!~~