Redis

什么是redis

    Redis 是一个基于内存的高性能key-value数据库。 具有丰富的数据结构,可以应用很多方面,例如数据库,缓存,消息队列。


Redis与其他key-value缓存产品有以下三个特点

        1,支持数据库持久化;可以将内存中的数据保存在磁盘中,重启的时候可以再次加载使用。

        2,支持的数据类型丰富;redis不仅仅支持简单的key-value类型数据,

同时还提供list,set,zset,hash等数据结构的存储。

        3,Redis支持数据的备份,即master-slave模式的数据备份



redis优点

            性能极高,

            丰富的数据类型,

            支持事物,redis所有的操作都是原子的,多个操作也支持事务,通过multi和exec指令包起来。

            丰富的特性,支持publish/subscribe,通知,key过期等特性

redis缺点

        数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,  redis的适用场景局限在少量数据的高性能读写上。

适用场景:

            1,全页面缓存(页面静态化的一种方式)

            2,排行榜,redis基于内存,可以非常快速高效的处理增加和减少等操作,相比SQL,性能提升巨大。

            3,Session存储,当缓存因出现问题而重启后,之前的缓存数据还在那儿,避免因为session突然消失带来的用户体验问题。

            4,队列,redis可以轻松创建一个搞笑的队列,列入email发送队列,等待被其他应用消费的队列

            5,发布/订阅, pub/sub是redis内置的一个非常强大的特性,可以创建一个实时聊天系统,社交网络中的通知出发系统等。




redis相比memcached有哪些优势?   

    (1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 

    (2) redis的速度比memcached快很多 (3) redis可以持久化其数据



Redis是单进程单线程的

    redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销


11.redis的并发竞争问题如何解决?

   Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争,但是在Redis客户端对Redis进行并发访问时会发生连接超时、数据转换错误、阻塞、客户端关闭连接等问题,这些问题均是

     由于客户端连接混乱造成。对此有2种解决方法:

   1.客户端角度,为保证每个客户端间正常有序与Redis进行通信,对连接进行池化,同时对客户端读写Redis操作采用内部锁synchronized。

            2.服务器角度,利用setnx实现锁。

注:对于第一种,需要应用程序自己处理资源的同步,可以使用的方法比较通俗,可以使用synchronized也可以使用lock;第二种需要用到Redis的setnx命令,但是需要注意一些问题。



6.redis常见性能问题和解决方案:   

   1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

   2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久

    化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

   3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

   4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内


watch命令

        在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能。假设我们通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务执行失败。




redis持久化的几种方式

1、快照(snapshots)

        缺省情况情况下,Redis把数据快照存放在磁盘上的二进制文件中,文件名为dump.rdb。你可以配置Redis的持久化策略,例如数据集中每N秒钟有超过M次更新,就将数据写入磁盘;或者你可以手工调用命令SAVE或BGSAVE。

工作原理

. Redis forks.

. 子进程开始将数据写到临时RDB文件中。

. 当子进程完成写RDB文件,用新文件替换老文件。

. 这种方式可以使Redis使用copy-on-write技术。

2、AOF

        快照模式并不十分健壮,当系统停止,或者无意中Redis被kill掉,最后写入Redis的数据就会丢失。这对某些应用也许不是大问题,但对于要求高可靠性的应用来说,

Redis就不是一个合适的选择。

Append-only文件模式是另一种选择。

你可以在配置文件中打开AOF模式

3、虚拟内存方式

            当你的key很小而value很大时,使用VM的效果会比较好.因为这样节约的内存比较大.

当你的key不小时,可以考虑使用一些非常方法将很大的key变成很大的value,比如你可以考虑将key,value组合成一个新的value.

vm-max-threads这个参数,可以设置访问swap文件的线程数,设置最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.

  自己测试的时候发现用虚拟内存性能也不错。如果数据量很大,可以考虑分布式或者其他数据库

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转载地址:http://gnucto.blog.51cto.com/3391516/998509 Redis与Me...
    Ddaidai阅读 21,468评论 0 82
  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    kelgon阅读 61,286评论 23 625
  • 本文将从Redis的基本特性入手,通过讲述Redis的数据结构和主要命令对Redis的基本能力进行直观介绍。之后概...
    团长plus阅读 1,266评论 0 15
  • 当我提起笔的一瞬间 心头的千言万语 在刹那间都消散而去 心头留下的只有 伤感与回忆 ...
    红尘求道阅读 390评论 0 2
  • 今天是3.8了,大家都在高兴的过节呢,现在不叫妇女节了,改叫女王节了,大家都是女王呢。都说女生要对自己好点,说的真...
    蓝莓书阅读 128评论 0 0