全部博文(317)
分类: Mysql/postgreSQL
2012-11-15 11:05:47
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
redis是一种非关系型数据存储工具,这区别于传统的关系型数据库(像mysql等),类似于memcache,并且其内部集成了对list(链表)、set(集合)的操作,可以很方便快速的处理数据(像插入、删除list取交集 并集 差集等),这极大的减轻了底层数据库的压力,并且给用户更快的响应速度。
由于只是学习一下,没有应用在项目中,所以这里只是粗略的记一下自己在学习中感觉比较重要的东西,以及自己的一些心得。
文件包里的各项文件介绍如下:
redis-server 服务程序
redis.conf redis配置文件
redis-cli 命令行客户端,测试用
redis-check-dump 本地数据库检查
redis-check-aof 更新日志检查
redis-benchmark 性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache的 ab 工具)
安装完成之后,打开redis-server启动redis服务,我们可以打开redis-cli输入指令来测试redis。
------------------------------------------------------------------------------------
redis.conf配置文件注解(原文地址):
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。
vm-page-size 32
vm-pages 134217728
vm-max-threads 4
---------------------------ADVANCED CONFIG ---------------------------
glueoutputbuf yes
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
activerehashing yes 是否重置Hash表
注意:Redis官方文档对VM的使用提出了一些建议:
** 当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.
** 当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.
** 最好使用linux t3 等对稀疏文件支持比较好的文件系统保存你的swap文件.
** vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数.如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.
调整系统内核参数
如果内存情况比较紧张的话,需要设定内核参数:
echo 1 > /proc/sys/vm/overcommit_memory
这里说一下这个配置的含义:/proc/sys/vm/overcommit_memory
该文件指定了内核针对内存分配的策略,其值可以是0、1、2。
0,表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1,表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
2,表示内核允许分配超过所有物理内存和交换空间总和的内存
Redis在dump数据的时候,会fork出一个子进程,理论上 child进程所占用的内存和parent是一样的,比如parent占用的内存为8G,这个时候也要同样分配8G的内存给child, 如果内存无法负担,往往会造成redis服务器的down机或者IO负载过高,效率下降。所以这里比较优化的内存分配策略应该设置为 1(表示内核允许分配所有的物理内存,而不管当前的内存状态如何)
----------------------------------------------------------------------------------------benchmark工具测试信息:
测试命令:
redis-benchmark -n 100000 -c 60
向redis服务器发送100000个请求,每个请求附带60个并发客户端
结果(部分):
====== SET ======
对集合写入测试
100000 requests completed in 2.38 seconds
100000个请求在2.38秒内完成
60 parallel clients
每次请求有60个并发客户端
3 bytes payload
每次写入3个字节的数据
keep alive: 1
保持一个连接,一台服务器来处理这些请求
93.06% <= 15 milliseconds
99.96% <= 31 milliseconds
99.98% <= 46 milliseconds
99.99% <= 62 milliseconds
100.00% <= 62 milliseconds
所有请求在62毫秒内完成
42105.26 requests per second
每秒处理42105.26次请求
从结果我们可以看到,redis数据库在很高并发的情况下也可以很快速的处理数据并作出响应
redis命令列表:
连接控制
QUIT 关闭连接
AUTH (仅限启用时)简单的密码验证
适合全体类型的命令
EXISTS key判断一个键是否存在;存在返回 1;否则返回0;
DEL key删除某个key,或是一系列key;DEL key1 key2 key3 key4
TYPE key 返回某个key元素的数据类型( none:不存在,string:字符,list,set,zset,hash)
KEYS pattern 返回匹配的key列表(KEYS foo*:查找foo开头的keys)
RANDOMKEY随机获得一个已经存在的key,如果当前数据库为空,则返回空字符串
RENAME oldnamenewname更改key的名字,新键如果存在将被覆盖
RENAMENX oldnamenewname 更改key的名字,如果名字存在则更改失败
DBSIZE返回当前数据库的key的总数
EXPIRE设置某个key的过期时间(秒),(EXPIRE bruce1000:设置bruce这个key1000秒后系统自动删除)注意:如果在还没有过期的时候,对值进行了改变,那么那个值会被清除。
TTL查找某个key还有多长时间过期,返回时间秒
SELECT index选择数据库
MOVE key dbindex将指定键从当前数据库移到目标数据库 dbindex。成功返回1;否则返回0(源数据库不存在key或目标数据库已存在同名key);
FLUSHDB清空当前数据库中的所有键
FLUSHALL清空所有数据库中的所有键
处理字符串的命令
SET key value给一个键设置字符串值。SET keyname datalength data (SET bruce 10paitoubing:保存key为burce,字符串长度为10的一个字符串paitoubing到数据库),data最大不可超过1G。
GET key获取某个key的value值。如key不存在,则返回字符串“nil”;如key的值不为字符串类型,则返回一个错误。
GETSET keyvalue可以理解成获得的key的值然后SET这个值,更加方便的操作 (SET bruce 10paitoubing,这个时候需要修改bruce变成1234567890并获取这个以前的数据paitoubing,GETSETbruce 10 1234567890)
MGET key1 key2 … keyN一次性返回多个键的值
SETNX key valueSETNX与SET的区别是SET可以创建与更新key的value,而SETNX是如果key不存在,则创建key与value数据
MSET key1 value1 key2value2 … keyN valueN 在一次原子操作下一次性设置多个键和值
MSETNX key1 value1 key2value2 … keyN valueN在一次原子操作下一次性设置多个键和值(目标键不存在情况下,如果有一个以上的key已存在,则失败)
INCR key 自增键值
INCRBY key integer令键值自增指定数值
DECR key 自减键值
DECRBY key integer令键值自减指定数值
处理 lists 的命令
RPUSH key value 从 List尾部添加一个元素(如序列不存在,则先创建,如已存在同名Key而非序列,则返回错误)
LPUSH key value 从 List头部添加一个元素
LLEN key 返回一个 List的长度
LRANGE key startend从自定的范围内返回序列的元素 (LRANGE testlist 0 2;返回序列testlist前0 1 2元素)
LTRIM key startend修剪某个范围之外的数据 (LTRIM testlist 0 2;保留0 1 2元素,其余的删除)
LINDEX keyindex返回某个位置的序列值(LINDEX testlist 0;返回序列testlist位置为0的元素)
LSET key indexvalue更新某个位置元素的值
LREM key count value 从List的头部(count正数)或尾部(count负数)删除一定数量(count)匹配value的元素,返回删除的元素数量。
LPOP key 弹出 List的第一个元素
RPOP key 弹出 List的最后一个元素
RPOPLPUSH srckey dstkey弹出 _srckey_ 中最后一个元素并将其压入 _dstkey_头部,key不存在或序列为空则返回“nil”
处理集合(sets)的命令(有索引无序序列)
SADD keymember增加元素到SETS序列,如果元素(membe)不存在则添加成功 1,否则失败 0;(SADD testlist 3 \none)
SREM key member删除SETS序列的某个元素,如果元素不存在则失败0,否则成功 1(SREM testlist 3 \N one)
SPOP key从集合中随机弹出一个成员
SMOVE srckey dstkeymember 把一个SETS序列的某个元素 移动到 另外一个SETS序列 (SMOVE testlist test 3\ntwo;从序列testlist移动元素two到 test中,testlist中将不存在two元素)
SCARD key统计某个SETS的序列的元素数量
SISMEMBER key member获知指定成员是否存在于集合中
SINTER key1 key2 … keyN 返回 key1, key2, …, keyN 中的交集
SINTERSTORE dstkey key1key2 … keyN 将 key1, key2, …, keyN 中的交集存入 dstkey
SUNION key1 key2 … keyN返回 key1, key2, …, keyN 的并集
SUNIONSTORE dstkey key1key2 … keyN 将 key1, key2, …, keyN 的并集存入 dstkey
SDIFF key1 key2 … keyN依据 key2, …, keyN 求 key1 的差集。官方例子:
key1 = x,a,b,c
key2 = c
key3 = a,d
SDIFF key1,key2,key3=> x,b
SDIFFSTORE dstkey key1key2 … keyN 依据 key2, …, keyN 求 key1 的差集并存入 dstkey
SMEMBERS key返回某个序列的所有元素
SRANDMEMBER key随机返回某个序列的元素
处理有序集合(sorted sets)的命令 (zsets)
ZADD key score member添加指定成员到有序集合中,如果目标存在则更新score(分值,排序用)
ZREM key member从有序集合删除指定成员
ZINCRBY key incrementmember 如果成员存在则将其增加_increment_,否则将设置一个score为_increment_的成员
ZRANGE key start end返回升序排序后的指定范围的成员
ZREVRANGE key start end返回降序排序后的指定范围的成员
ZRANGEBYSCORE key minmax 返回所有符合score >= min和score <=max的成员 ZCARD key 返回有序集合的元素数量 ZSCORE key element 返回指定成员的SCORE值ZREMRANGEBYSCORE key min max 删除符合 score >= min 和score <= max 条件的所有成员
排序(List, Set, Sorted Set)
SORT key BY patternLIMIT start end GET pattern ASC|DESC ALPHA 按照指定模式排序集合或List
SORT mylist
默认升序 ASC
SORT mylist DESC
SORT mylist LIMIT 010
从序号0开始,取10条
SORT mylist LIMIT 0 10ALPHA DESC
按首字符排序
SORT mylist BYweight_*
SORT mylist BY weight_* GET object_*
SORT mylist BY weight_* GET object_* GET #
SORT mylist BY weight_*STORE resultkey
将返回的结果存放于resultkey序列(List)
持久控制
SAVE 同步保存数据到磁盘
BGSAVE 异步保存数据到磁盘
LASTSAVE返回上次成功保存到磁盘的Unix时间戳
SHUTDOWN 同步保存到服务器并关闭Redis 服务器(SAVE+QUIT)
BGREWRITEAOF当日志文件过长时重写日志文件
远程控制命令
INFO提供服务器的信息和统计信息
MONITOR实时输出所有收到的请求
SLAVEOF 修改复制选项
原文链接: