漫漫长路,其修远兮!
分类: NOSQL
2013-06-13 15:15:41
Redis是Remote 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表示不存在,string,list,。。。
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一个不是int的value会返回错误,incr一个不存在的key,则设置key 的值1
Incrby key integer 对key值加上指定的值
Decrby key integer 对key 值减去指定值
6. List类型是一个双向链表,主要功能是push,pop,获得一个范围的所有值
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 key从list的尾部删除并返回删除的元素
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,如果元素以及
在集合中则返回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 的所有元素,结果是无序的。
9. 安装配置
#redis-server:Redis服务器的daemon启动程序
#redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作
#redis-benchmark:Redis性能测试工具,测试Redis在你的系统及配置下的读写性能
#redis-stat:Redis状态检测工具,可以检测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个可选值,debug,verbose(默认值),notice,warning
logfile 日志记录方式,默认值为stdout
databases 可用数据库数,默认值为16,默认数据库为0
save
save 900 1
900秒(15分钟)内至少有1个key被改变
save 300 10 300秒(5分钟)内至少有300个key被改变
save 60 10000 60秒内至少有10000个key被改变
rdbcompression 存储至本地数据库时是否压缩数据,默认为yes
dbfilename 本地数据库文件名,默认值为dump.rdb
dir 本地数据库存放路径,默认值为 ./
slaveof
masterauth
requirepass 连接密码(注释)
maxclients 最大客户端连接数,默认不限制(注释)
maxmemory
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:传统的关系型数据库
AP:key-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架构遇到的问题
l MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间
l Memcached与MySQL数据库数据一致性问题
l Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑
l 跨机房cache同步问题
Nosql应用场景
l 少量存储,高速读写访问。Redis
l 海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。
Dynamo, bigtable
l Schema free,auto-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 |
特色 |
支持海量数据 |
采用dynamo和P2P |
List,set的处理 |
全面 |
不足 |
不适用低延迟的应用 |
Dynamo机制收到限制 |
在分布式方面支持有限 |
在性能和扩展性方面有限 |