Redis 可以用来做redis 查看数据库列表吗

Redis简单使用
Redis简单使用
Redis数据类型
redis常用五种数据类型:string,hash,list,set,zset(sorted set).
String类型
String是最简单的类型,一个key对应一个value
String类型的数据最大1G。
String类型的值可以被视作integer,从而可以让&INCR&命令族操作(incrby、decr、decrby),这种情况下,该integer的值限制在64位有符号数。
在list、set和zset中包含的独立的元素类型都是Redis String类型。
链表类型,主要功能是push、pop、获取一个范围的所有值等。其中的key可以理解为链表的名字。
在Redis中,list就是Redis String的列表,按照插入顺序排序。比如使用LPUSH命令在list头插入一个元素,使用RPUSH命令在list的尾插入一个元素。当这两个命令之一作用于一个空的key时,一个新的list就创建出来了。
List的最大长度是2^32-1个元素。
集合,和数学中的集合概念相似。操作中的key理解为集合的名字。
在Redis中,set就是Redis String的无序集合,不允许有重复元素。
Set的最大元素数是2^32-1。
Redis中对set的操作还有交集、并集、差集等。
ZSet(Sorted Set)类型
Zset是set的一个升级版本,在set的基础上增加了一个顺序属性,这一属性在添加修改元素时可以指定,每次指定后zset会自动安装指定值重新调整顺序。可以理解为一张表,一列存value,一列存顺序。操作中的key理解为zset的名字。
Zset的最大元素数是2^32-1。
对于已经有序的zset,仍然可以使用SORT命令,通过指定ASC|DESC参数对其进行排序。
hash是最接近关系结构的数据类型,可以将数据库一条记录或程序中一个对象转换成hashmap存放在redis中。
对value操作的命令
& & &exists(key):确认一个key是否存在
& & &del(key):删除一个key
& & &type(key):返回值的类型
& & &keys(pattern):返回满足给定pattern的所有key
& & &randomkey:随机返回key空间的一个key
& & &rename(oldname, newname):将key由oldname重命名为newname,若newname存在则删除newname表示的key
& & &dbsize:返回当前数据库中key的数目
& & &expire:设定一个key的活动时间(s)
& & &ttl:获得一个key的活动时间
& & &select(index):按索引查询
& & &move(key, dbindex):将当前数据库中的key转移到有dbindex索引的数据库
& & &flushdb:删除当前选择数据库中的所有key
& & &flushall:删除所有数据库中的所有key
对String操作的命令
& & &set(key, value):给数据库中名称为key的string赋予值value
& & &get(key):返回数据库中名称为key的string的value
& & &getset(key, value):给名称为key的string赋予上一次的value
& & &mget(key1, key2,&, key N):返回库中多个string(它们的名称为key1,key2&)的value
& & &setnx(key, value):如果不存在名称为key的string,则向库中添加string,名称为key,值为value
& & &setex(key, time, value):向库中添加string(名称为key,值为value)同时,设定过期时间time
& & &mset(key1, value1, key2, value2,&key N, value N):同时给多个string赋值,名称为key i的string赋值value i
& & &msetnx(key1, value1, key2, value2,&key N, value N):如果所有名称为key i的string都不存在,则向库中添加string,名称key i赋值为value i
& & &incr(key):名称为key的string增1操作
& & &incrby(key, integer):名称为key的string增加integer
& & &decr(key):名称为key的string减1操作
& & &decrby(key, integer):名称为key的string减少integer
& & &append(key, value):名称为key的string的值附加value
& & &substr(key, start, end):返回名称为key的string的value的子串
对List操作的命令
& & &rpush(key, value):在名称为key的list尾添加一个值为value的元素
& & &lpush(key, value):在名称为key的list头添加一个值为value的 元素
& & &llen(key):返回名称为key的list的长度
& & &lrange(key, start, end):返回名称为key的list中start至end之间的元素(下标从0开始,下同)
& & &ltrim(key, start, end):截取名称为key的list,保留start至end之间的元素
& & &lindex(key, index):返回名称为key的list中index位置的元素
& & &lset(key, index, value):给名称为key的list中index位置的元素赋值为value
& & &lrem(key, count, value):删除count个名称为key的list中值为value的元素。count为0,删除所有值为value的元素,count&0从头至尾删除count个值为value的元素,count&0从尾到头删除|count|个值为value的元素。
& & &lpop(key):返回并删除名称为key的list中的首元素
& & &rpop(key):返回并删除名称为key的list中的尾元素
& & &blpop(key1, key2,& key N, timeout):lpop命令的block版本。即当timeout为0时,若遇到名称为key i的list不存在或该list为空,则命令结束。如果timeout&0,则遇到上述情况时,等待timeout秒,如果问题没有解决,则对key i+1开始的list执行pop操作。
& & &brpop(key1, key2,& key N, timeout):rpop的block版本。参考上一命令。
& & &rpoplpush(srckey, dstkey):返回并删除名称为srckey的list的尾元素,并将该元素添加到名称为dstkey的list的头部
对Set操作的命令
& & &sadd(key, member):向名称为key的set中添加元素member
& & &srem(key, member) :删除名称为key的set中的元素member
& & &spop(key) :随机返回并删除名称为key的set中一个元素
& & &smove(srckey, dstkey, member) :将member元素从名称为srckey的集合移到名称为dstkey的集合
& & &scard(key) :返回名称为key的set的基数
& & &sismember(key, member) :测试member是否是名称为key的set的元素
& & &sinter(key1, key2,&key N) :求交集
& & &sinterstore(dstkey, key1, key2,&key N) :求交集并将交集保存到dstkey的集合
& & &sunion(key1, key2,&key N) :求并集
& & &sunionstore(dstkey, key1, key2,&key N) :求并集并将并集保存到dstkey的集合
& & &sdiff(key1, key2,&key N) :求差集
& & &sdiffstore(dstkey, key1, key2,&key N) :求差集并将差集保存到dstkey的集合
& & &smembers(key) :返回名称为key的set的所有元素
& & &srandmember(key) :随机返回名称为key的set的一个元素
对zset(sorted set)操作的命令
& & &zadd(key, score, member):向名称为key的zset中添加元素member,score用于排序。如果该元素已经存在,则根据score更新该元素的顺序。
& & &zrem(key, member) :删除名称为key的zset中的元素member
& & &zincrby(key, increment, member) :如果在名称为key的zset中已经存在元素member,则该元素的score增加increment;否则向集合中添加该元素,其score的值为increment
& & &zrank(key, member) :返回名称为key的zset(元素已按score从小到大排序)中member元素的rank(即index,从0开始),若没有member元素,返回&nil&
& & &zrevrank(key, member) :返回名称为key的zset(元素已按score从大到小排序)中member元素的rank(即index,从0开始),若没有member元素,返回&nil&
& & &zrange(key, start, end):返回名称为key的zset(元素已按score从小到大排序)中的index从start到end的所有元素
& & &zrevrange(key, start, end):返回名称为key的zset(元素已按score从大到小排序)中的index从start到end的所有元素
& & &zrangebyscore(key, min, max):返回名称为key的zset中score &= min且score &= max的所有元素
& & &zcard(key):返回名称为key的zset的基数
& & &zscore(key, element):返回名称为key的zset中元素element的score
& & &zremrangebyrank(key, min, max):删除名称为key的zset中rank &= min且rank &= max的所有元素
& & &zremrangebyscore(key, min, max) :删除名称为key的zset中score &= min且score &= max的所有元素
& & &zunionstore / zinterstore(dstkeyN, key1,&,keyN, WEIGHTS w1,&wN, AGGREGATE SUM|MIN|MAX):对N个zset求并集和交集,并将最后的集合保存在dstkeyN中。对于集合中每一个元素的score,在进行AGGREGATE运算前,都要乘以对于的WEIGHT参数。如果没有提供WEIGHT,默认为1。默认的AGGREGATE是SUM,即结果集合中元素的score是所有集合对应元素进行SUM运算的值,而MIN和MAX是指,结果集合中元素的score是所有集合对应元素中最小值和最大值。
对Hash操作的命令
& & &hset(key, field, value):向名称为key的hash中添加元素field&&&value
& & &hget(key, field):返回名称为key的hash中field对应的value
& & &hmget(key, field1, &,field N):返回名称为key的hash中field i对应的value
& & &hmset(key, field1, value1,&,field N, value N):向名称为key的hash中添加元素field i&&&value i
& & &hincrby(key, field, integer):将名称为key的hash中field的value增加integer
& & &hexists(key, field):名称为key的hash中是否存在键为field的域
& & &hdel(key, field):删除名称为key的hash中键为field的域
& & &hlen(key):返回名称为key的hash中元素个数
& & &hkeys(key):返回名称为key的hash中所有键
& & &hvals(key):返回名称为key的hash中所有键对应的value
& & &hgetall(key):返回名称为key的hash中所有的键(field)及其对应的value
String类型的应用场景
String是最常用的一种数据类型,普通的key/value存储.
list类型的应用场景
比较适用于列表式存储且顺序相对比较固定,例如:
省份、城市列表
品牌、厂商、车系、车型等列表
拆车坊专题列表...
set类型的应用场景
Set对外提供的功能与list类似,当需要存储一个列表数据,又不希望出现重复数据时,可选用set
zset(sorted set)类型的应用场景
zset的使用场景与set类似,区别是set不是自动有序的,而zset可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序.当你需要一个有序的并且不重复的集合列表,那么可以选择zset数据结构。例如:
根据PV排序的热门车系车型列表
根据时间排序的新闻列表
hash类型的应用场景
类似于表记录的存储
页面视图所需数据的存储
数据快照配置
save 900 1
save 300 10
save 60 10000
以上在redis.conf中的配置指出在多长时间内,有多少次更新操作,就将数据同步到数据文件,这个可以多个条件配合.上面的含义是900秒后有一个key发生改变就执行save,300秒后有10个key发生改变执行save,60秒有10000个key发生改变执行save
数据快照的缺点是持久化之后如果出现crash则会丢失一段数据,因此redis作者增加了另外一种追加式的操作日志记录,叫append only file,其日志文件以aof结尾,我们一般称为aof文件.要开启aof日志的记录,需要在配置文件中进行如下设置:
appendonly yes
appendonly配置如果不开启,可能会在断电时导致一段时间内的数据丢失.因为redis本身同步数据文件是按save条件来同步的,所以有的数据会在一段时间内只存在于内存中.
appendfsync no/always/everysec
1. no:表示等操作进行数据缓存同步到磁盘.
2. always:表示每次更新操作后手动调用fsync() 将数据写到磁盘.
3. everysec:表示每秒同步一次.一般用everysec
AOF文件只增不减会导致文件越来越大,重写过程如下
1. Redis通过fork产生子进程.
2. 子进程将当前所有数据写入一个临时文件.
3. 父子进程是并行执行的,在子进程遍历并写临时文件的时候,父进程在照常接收请求,处理请求,写AOF,不过这时他是把新来的AOF写在一个缓冲区中.
4. 子进程写完临时文件后就会退出.这时父进程会接收到子进程退出的消息,他会把自己现在收集在缓冲区中的所有AOF追加在临时文件中.
5. 最后把临时文件rename一下,改名为appendonly.aof, 这时原来的aof文件被覆盖.整个过程完成.
Redis数据恢复
当redis服务器挂掉时,重启时将按以下优先级恢复数据到内存种:
1. 如果只配置了AOF,重启时加载AOF文件恢复数据.
2. 如果同时配置了RBD和AOF,启动时只加载AOF文件恢复数据.
3. 如果只配置了㻾DB,启动时将加载dump文件恢复数据.
Redis主从复制
Redis主从复制配置
Master/Slave配置:
Master IP:175.41.209.118
Master Redis Server Port:6379
Slave配置很简单,只需要在slave服务器的redis.conf加入:
slaveof 175.41.209.118 6379
启动master和slave,然后写入数据到master,读取slave,可
以看到数据被复制到slave了
Redis主从复制过程
配置好slave后,slave与master建立连接,然后发送sync命令. 无论是第一次连接还是重新连接,master都会启动一个后台进程,将数据库快照保存到文件中,同时master主进程会开始收集新的写命令并缓存. 后台进程完成写文件后,master就发送文件给slave,slave将文件保存到硬盘上,再加载到内存中, 接着master就会把缓存的命令转发给slave,后续master将收到的写命令发送给slave. 如果master同时收到多个slave发来的同步连接命令,master只会启动一个进程来写数据库镜像, 然后发送给所有的slave
Redis主从复制特点
1. master可以拥有多个slave.
2. 多个slave可以连接同一个master外,还可以连接到其他slave.
3. 主从复制不会阻塞master,在同步数据时,master可以继续处理client请求.
4. 可以在master禁用数据持久化,注释掉master配置文件中的所有save配置,只需在slave上配置数据持久化.
5. 提高系统的伸缩性
推荐主从模式A --& B --& C单向链表式
A为master读写都直接对A操作,A节点不配置数据持久化
B 节点也不配置数据持久化
C 节点配置数据持久化
1. 当A节点出现故障,将读写操作切入到B节点,然后将A节点修复后追加到C节点后, 关闭C节点的数据持久化,将追加到C节点后的A节点开启数据持久化。
2. 当B节点或者C节点出现故障,直接修复该节点,并按照最初配置启动即可。
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'问题导读:
1.Redis 是什么?
2 Redis用来做什么?
3 Redis的优点?
4 Redis的缺点?
阅读目的: 对什么是内存型数据库有概念性的认知。?
Redis 是什么?
& & 通常而言目前的数据库分类有几种,包括 SQL/NSQL,,关系数据库,键值数据库等等 等,分类的标准也不以,Redis本质上也是一种键值数据库的,但它在保持键值数据库简单快捷特点的同时,又吸收了部分关系数据库的优点。从而使它的位置处于关系数据库和键值数 据库之间。Redis不仅能保存Strings类型的数据,还能保存Lists类型(有序)和Sets类型(无序)的数据,而且还能完成排序(SORT) 等高级功能,在实现INCR,SETNX等功能的时候,保证了其操作的原子性,除此以外,还支持主从复制等功能。
&&更为详细的描述请参考如下:
&&Redis官方也同样提供了一个名为Retwis的项目代码,可以对照着官方学习。
2 Redis用来做什么?
& && &&&通常局限点来说,Redis也以消息队列的形式存在,作为内嵌的List存在,满足实时的高并发需求。而通常在一个电商类型的数据处理过程之中,有关商品,热销,推荐排序的队列,通常存放在Redis之中,期间也包扩Storm对于Redis列表的读取和更新。
3 Redis的优点
性能极高 – Redis能支持超过 100K+ 每秒的读写频率。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
4 Redis的缺点
是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。
& & 总结: Redis受限于特定的场景,专注于特定的领域之下,速度相当之快,目前还未找到能替代使用产品。
本帖被以下淘专辑推荐:
& |主题: 23, 订阅: 2
欢迎加入about云群 、 ,云计算爱好者群,关注
主题帖子积分
高级会员, 积分 1924, 距离下一级还需 3076 积分
高级会员, 积分 1924, 距离下一级还需 3076 积分
最近项目正好用到这个了。。。。
主题帖子积分
高级会员, 积分 2402, 距离下一级还需 2598 积分
高级会员, 积分 2402, 距离下一级还需 2598 积分
不错,什么时候可以搞个redis和Memcache的比较。
主题帖子积分
中级会员, 积分 602, 距离下一级还需 398 积分
中级会员, 积分 602, 距离下一级还需 398 积分
学习了,感谢楼主的分享。
主题帖子积分
不错,什么时候可以搞个redis和Memcache的比较。
在使用缓存的时候,redis比memcached具有更多的优势,并且支持更多的数据类型。
Redis是什么?两句话可以做下概括:
1. 是一个完全开源免费的key-value内存数据库
2. 通常被认为是一个数据结构服务器,主要是因为其有着丰富的数据结构 strings、map、 list、sets、 sorted sets
Redis不是什么?同样从两个方面来做下对比:
1. 不是sql server、mySQL等关系型数据库,主要原因是:
& &&&. redis目前还只能作为小数据量存储(全部数据能够加载在内存中) ,海量数据存储方面并不是redis所擅长的领域
& &&&. 设计、实现方法很不一样.关系型数据库通过表来存储数据,通过SQL来查询数据。而Redis通上述五种数据结构来存储数据,通过命令 来查询数据
2.& &不是Memcached等缓存系统,主要原因有以下几个:
& &&&.网络IO模型方面:Memcached是多线程,分为监听线程、worker线程,引入锁,带来了性能损耗。Redis使用单线程的IO复用模型,将速度优势发挥到最大,也提供了较简单的计算功能
& &&&.内存管理方面:Memcached使用预分配的内存池的方式,带来一定程度的空间浪费 并且在内存仍然有很大空间时,新的数据也可能会被剔除,而Redis使用现场申请内存的方式来存储数据,不会剔除任何非临时数据 Redis更适合作为存储而不是cache
& &&&.数据的一致性方面:Memcached提供了cas命令来保证.而Redis提供了事务的功能,可以保证一串 命令的原子性,中间不会被任何操作打断
& &&&. 存储方式方面:Memcached只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能& &一句话小结一下:Redis是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。
Redis有什么用?只有了解了它有哪些特性,我们在用的时候才能扬长避短,为我们所用:
1. 速度快:使用标准C写,所有数据都在内存中完成,读写速度分别达到10万/20万
2. 持久化:对数据的更新采用Copy-on-write技术,可以异步地保存到磁盘上,主要有两种策略,一是根据时间,更新次数的快照(save 300 10 )二是基于语句追加方式(Append-only file,aof)
3. 自动操作:对不同数据类型的操作都是自动的,很安全
4. 快速的主--从复制,官方提供了一个数据,Slave在21秒即完成了对Amazon网站10G key set的复制。
5. Sharding技术: 很容易将数据分布到多个Redis实例中,数据库的扩展是个永恒的话题,在关系型数据库中,主要是以添加硬件、以分区为主要技术形式的纵向扩展解决了很多的应用场景,但随着web2.0、移动互联网、云计算等应用的兴起,这种扩展模式已经不太适合了,所以近年来,像采用主从配置、数据库复制形式的,Sharding这种技术把负载分布到多个特理节点上去的横向扩展方式用处越来越多。
这里对Redis数据库做下小结:
1. 提高了DB的可扩展性,只需要将新加的数据放到新加的服务器上就可以了
2. 提高了DB的可用性,只影响到需要访问的shard服务器上的数据的用户
3. 提高了DB的可维护性,对系统的升级和配置可以按shard一个个来搞,对服务产生的影响较小
4. 小的数据库存的查询压力小,查询更快,性能更好
& &写到这里,可能就会有人急不可待地想用它了,那怎么用呢?可以直接到官方文档,里面帮我们整理好了各个语言环境下的客户端,主要有Ruby、Python、 PHP、Perl、Lua、Java、C#....有几种语言,我也没见过,所以就不多说了,你懂的....
最后,把我使用过程中的一些 经验与教训,做个小结:
1. 要进行Master-slave配置,出现服务故障时可以支持切换。
2. 在master侧禁用数据持久化,只需在slave上配置数据持久化。
3. 物理内存+虚拟内存不足,这个时候dump一直死着,时间久了机器挂掉。这个情况就是灾难!
4. 当Redis物理内存使用超过内存总容量的3/5时就会开始比较危险了,就开始做swap,内存碎片大
5. 当达到最大内存时,会清空带有过期时间的key,即使key未到过期时间.
6. redis与DB同步写的问题,先写DB,后写redis,因为写内存基本上没有问题
欢迎加入about云群 、 ,云计算爱好者群,关注
主题帖子积分
中级会员, 积分 705, 距离下一级还需 295 积分
中级会员, 积分 705, 距离下一级还需 295 积分
在使用缓存的时候,redis比memcached具有更多的优势,并且支持更多的数据类型。
多谢你的经验分享
经常参与各类话题的讨论,发帖内容较有主见
经常帮助其他会员答疑
活跃且尽责职守的版主
为论坛做出突出贡献的会员
站长推荐 /6
about云|新出视频,openstack零基础入门,解决你ping不通外网难题
云计算hadoop视频大全(新增 yarn、flume|storm、hadoop一套视频
视频资料大优惠
大数据零基础由入门到实战
阶段1:hadoop零基础入门基础篇
阶段2:hadoop2入门
阶段3:大数据非hadoop系列课程
阶段4:项目实战篇
阶段5:大数据高级系列应用课程
阶段6:工作实用系列教程
等待验证会员请验证邮箱
新手获取积分方法
Powered by当前位置:&>&&>&
大公司使用redis数据库的经验
发布时间:
来源:服务器之家
去年下半年,在公司和同事一起做了并上线一个基于redis的的分布式cache系统,来统一替换公司历史上使用的各种各样的缓存系统。redis提供了高并发能力和丰富的数据结构供业务使用。系统中使用redis不做持久化,只当作cache使用,是经典的DB+cache结构,cache
miss会由db加载,redis掉电后cache数据就丢失了,分布式算法采用一致性hash,节点的信息放在zookeeper上。
系统的整体结构类似于twitter开源的tmemproxy,不过没有中间的proxy层,客户端直连redis,逻辑主要实现在客户端,优点是直连redis可以提高效率,缺点是逻辑分散在各个客户端而不是中间的proxy层,难于统一更改。
目前redis在公司内部的使用规模是:50+台96G内存机器,200+ redis
server实例,2T左右的总数据量。
对redis的使用会遇到很多各种各样的问题,业界很多其他公司都做过一个分享,这里结合自己在公司内部的使用经验,做一些总结。
redis的代码量并不大,刚开始接触redis的时候,总代码量一共2w多行(现在已经到4w多行了),结构也比较清晰,过一遍代码实现还是比较容易的。
redis需要将全部数据放在内存才能提供高性能的server表现,redis自身的vm内存管理用处不大,新版中已经去掉。因此,需要仔细注意redis的内存使用情况。
redis并没有使用特别的内存管理机制,只是简单包装了一下malloc,因此可能会有比较多的内存碎片。不过redis可以编入jemalloc或tcmalloc等优秀的开源内存管理库来管理内存。
要注意的是配置文件中的maxmemory
限制的并不是redis进程本身占用的内存,而是数据占用的内存,由于内存碎片的存在,redis进程本身占用的内存可能要大于这个值。
当内存占满之后,可以配置逐出机制,不过redis的lru机制和memcache并不相同,redis是随机采样一批key,在这批采样的key中进行lru。
另外,redis删除过期的key采用的是惰性删除,过期的key并不是过期后实时删除,而是在过期后的下次访问会被删除。每隔100ms,从eventloop醒来,还会随机采样一批key,删除采样到过期的key。如果采用出的key中过期的太多,高于一定比例,就会循环随机采样,删除采样采样到过期的key。
在bgsave或者bgrewriteaof会让redis fork一个子进程出来,这时占用内存会翻一倍。
三.单线程的redis
redis主要工作都是在一个线程内完成的。作者对此的解释是网卡内存才是瓶颈,而cpu并不是瓶颈。但实际使用中,还是会发现redis在某些情况下会阻塞住。例如如果pipeline地使用hgetall,就会观察到redis会慢。redis提供了slowslog的功能可以查看哪些命令执行的时间比较长。不过slowlog只能观察到单条命令的执行时间。一次eventloop可能会执行很多条命令(例如在大量使用pipeline的情况下),除了处理事件,redis还需要完成其他的一些工作,比如上面提到的删除过期key,如果每次采样,过期key都超过了一定比例,随机采样的循环可能要持续很久,也可能会阻塞redis。redis被短暂阻塞的原因非常多。除了slowlog之后,我们还可一使用strace观察redis的系统调用结合源码来猜测redis当时在执行什么。
官网上有一篇文章讲redis的延迟问题:http://redis.io/topics/latency
我们的系统中并没有开启redis的持久化,所以关于这方面的经验不是特别多。不过网上也有很多讲解这方面经验的资料。这里也稍提及一些。
首先,必读的是redis作者讲述持久化的一篇blog:/post/redis-persistence-demystified.html,讲解了redis持久化的机制和持久化安全性。
redis虽然会利用后台线程进行持久化,但仍有可能会引起阻塞。例如:在开了aof的Redis server上,
当执行bgrewriteaof对aof进行归并,按理,bgrewriteaof是在后台进行操作,
不应该影响Redis的正常服务。不过redis服务默认设置appendfsync everysec,
主进程每秒钟会调用fsync(), 但由于子进程同时也在写硬盘, 从而导致主进程磁盘io操作被阻塞。
redis目前版本没有官方的分布式支持。官方的主从目前也有比较大的问题,主从连接断开后重新连上需要重传所有数据而不是续传增量数据。
twitter开源的tmemproxy是一个比较流行的redis分布式方案。/twitter/twemproxy
redis官方说会在3.0版本推出官方的分布式方案RedisClient,目前的官方代码中提供了redis-sentinel来管理redis
另外,如果自己调用redis的客户端从分布式redis集群来批量取一批key时,也会遇到类似memcache muliget
hole的问题,这时,需要自己在客户端来实现并行化从各个redis server并发的调用mget,而不是依次从每台redis
server调用mget。
Copyright © . 版权所有

我要回帖

更多关于 redis数据库 的文章

 

随机推荐