海南省交通建设局网站,简述网站建设及维护全过程,网站建设一级二级目录,传统的网站开发模式Redis 是完全开源免费的#xff0c;遵守BSD协议#xff0c;是一个高性能的key-value数据库。Redis本质上是一个Key-Value类型的内存数据库#xff0c;很像memcached#xff0c;整个数据库统统加载在内存当中进行操作#xff0c;定期通过异步操作把数据库数据flush到硬盘上… Redis 是完全开源免费的遵守BSD协议是一个高性能的key-value数据库。Redis本质上是一个Key-Value类型的内存数据库很像memcached整个数据库统统加载在内存当中进行操作定期通过异步操作把数据库数据flush到硬盘上进行保存。 因为是纯内存操作Redis的性能非常出色每秒可以处理超过 10万次读写操作是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能Redis最大的魅力是支持保存多种数据结构此外单个value的最大限制是1GB不像 memcached只能保存1MB的数据因此Redis可以用来实现很多有用的功能比方说用List来做FIFO双向链表实现一个轻量级的高性 能消息队列服务用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间因此也可以被当作一 个功能加强版的memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制不能用作海量数据的高性能读写因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。 总结来说使用Redis的好处如下 速度快因为数据存在内存中类似于HashMapHashMap的优势就是查找和操作的时间复杂度都是O1 支持丰富数据类型支持stringlistsetsorted sethash 支持事务操作都是原子性所谓的原子性就是对数据的更改要么全部执行要么全部不执行 丰富的特性可用于缓存消息按key设置过期时间过期后将会自动删除 Redis持久化的方式 redis提供了两种持久化的方式分别是RDBRedis DataBase和AOFAppend Only File。 1.RDB 简而言之就是在不同的时间点将redis存储的数据生成快照并存储到磁盘等介质上 2.AOF 换了一个角度来实现持久化那就是将redis执行过的所有写指令记录下来在下次redis重新启动时只要把这些写指令从前到后再重复执行一遍就可以实现数据恢复了。 其实RDB和AOF两种方式也可以同时使用在这种情况下如果redis重启的话则会优先采用AOF方式来进行数据恢复这是因为AOF方式的数据恢复完整度更高。如果你没有数据持久化的需求也完全可以关闭RDB和AOF方式这样的话redis将变成一个纯内存数据库持久化–就像memcache一样。 Redis常见性能问题和解决方案 Master最好不要做任何持久化工作如RDB内存快照和AOF日志文件 如果数据比较重要某个Slave开启AOF备份数据策略设置为每秒同步一次 为了主从复制的速度和连接的稳定性Master和Slave最好在同一个局域网内 尽量避免在压力很大的主库上增加从库 主从复制不要用图状结构用单向链表结构更为稳定即Master - Slave1 - Slave2 - Slave3…。这样的结构方便解决单点故障问题实现Slave对Master的替换。如果Master挂了可以立刻启用Slave1做Master其他不变。 Redis的适用场景 1.会话缓存Session Cache 最常用的一种使用Redis的情景是会话缓存session cache。用Redis缓存会话比其他存储如Memcached的优势在于Redis提供持久化。当维护一个不是严格要求一致性的缓存时如果用户的购物车信息全部丢失大部分人都会不高兴的现在他们还会这样吗 幸运的是随着 Redis 这些年的改进很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。 2.队列 Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作就类似于本地程序语言如Python对 list 的 push/pop 操作。 如果你快速的在Google中搜索“Redis queues”你马上就能找到大量的开源项目这些项目的目的就是利用Redis创建非常好的后端工具以满足各种队列需求。例如Celery有一个后台就是使用Redis作为broker你可以从这里去查看。 3.全页缓存FPC 除基本的会话token之外Redis还提供很简便的FPC平台。回到一致性问题即使重启了Redis实例因为有磁盘的持久化用户也不会看到页面加载速度的下降这是一个极大改进类似PHP本地FPC。 再次以Magento为例Magento提供一个插件来使用Redis作为全页缓存后端。此外对WordPress的用户来说Pantheon有一个非常好的插件 wp-redis这个插件能帮助你以最快速度加载你曾浏览过的页面。 4.排行榜/计数器 Redis在内存中对数字进行递增或递减的操作实现的非常好。集合Set和有序集合Sorted Set也使得我们在执行这些操作的时候变的非常简单Redis只是正好提供了这两种数据结构。所以我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”我们只需要像下面一样执行即可 当然这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数你需要这样执行ZRANGE user_scores 0 10 WITHSCORESAgora Games就是一个很好的例子用Ruby实现的它的排行榜就是使用Redis来存储数据的你可以在这里看到。 Redis的高可用策略单点故障避免策略 1.高可用High Availability 当一台服务器停止服务后对于业务及用户毫无影响。 停止服务的原因可能由于网卡、路由器、机房、CPU负载过高、内存溢出、自然灾害等不可预期的原因导致在很多时候也称单点问题。 2.主备方式 这种通常是一台主机、一台或多台备机在正常情况下主机对外提供服务并把数据同步到备机当主机宕机后备机立刻开始服务。 Redis HA中使用比较多的是keepalived它使主机备机对外提供同一个虚拟IP客户端通过虚拟IP进行数据操作正常期间主机一直对外提供服务宕机后VIP自动漂移到备机上。 优点是对客户端毫无影响仍然通过VIP操作。 缺点也很明显在绝大多数时间内备机是一直没使用被浪费着的。 3.主从方式 这种采取一主多从的办法主从之间进行数据同步。 当Master宕机后通过选举算法Paxos、Raft从slave中选举出新Master继续对外提供服务主机恢复后以slave的身份重新加入。 主从另一个目的是进行读写分离这是当单机读写压力过高的一种通用型解决方案。 其主机的角色只提供写操作或少量的读把多余读请求通过负载均衡算法分流到单个或多个slave服务器上。 缺点是主机宕机后Slave虽然被选举成新Master了但对外提供的IP服务地址却发生变化了意味着会影响到客户端。 解决这种情况需要一些额外的工作在当主机地址发生变化后及时通知到客户端客户端收到新地址后使用新地址继续发送新请求。 4.方案选择 主备keepalived方案配置简单、人力成本小在数据量少、压力小的情况下推荐使用。 如果数据量比较大不希望过多浪费机器还希望在宕机后做一些自定义的措施比如报警、记日志、数据迁移等操作推荐使用主从方式因为和主从搭配的一般还有个管理监控中心。 Redis的数据同步方式 无论是主备还是主从都牵扯到数据同步的问题这也分2种情况 同步方式当主机收到客户端写操作后以同步方式把数据同步到从机上当从机也成功写入后主机才返回给客户端成功也称数据强一致性。 很显然这种方式性能会降低不少当从机很多时可以不用每台都同步主机同步某一台从机后从机再把数据分发同步到其他从机上这样提高主机性能分担同步压力。 在redis中是支持这杨配置的一台master一台slave同时这台salve又作为其他slave的master。 异步方式主机接收到写操作后直接返回成功然后在后台用异步方式把数据同步到从机上。 这种同步性能比较好但无法保证数据的完整性比如在异步同步过程中主机突然宕机了也称这种方式为数据弱一致性。 Redis主从同步采用的是异步方式因此会有少量丢数据的危险。还有种弱一致性的特例叫最终一致性这块详细内容可参见CAP原理及一致性模型。 分布式与集群 1.集群时代 至少部署两台Redis服务器构成一个小的集群主要有2个目的 高可用性在主机挂掉后自动故障转移使前端服务对用户无影响。 读写分离将主机读压力分流到从机上。 可在客户端组件上实现负载均衡根据不同服务器的运行情况分担不同比例的读请求压力。 2.Redis集群 分布式 缓存数据量不断增加时单机内存不够使用需要把数据切分不同部分分布到多台服务器上。 可在客户端对数据进行分片数据分片算法详见一致性Hash详解、虚拟桶分片。 分布式集群 大规模分布式集群时代 当数据量持续增加时应用可根据不同场景下的业务申请对应的分布式集群。 这块最关键的是缓存治理这块其中最重要的部分是加入了代理服务。 应用通过代理访问真实的Redis服务器进行读写这样做的好处是 避免越来越多的客户端直接访问Redis服务器难以管理而造成风险。 在代理这一层可以做对应的安全措施比如限流、授权、分片。 避免客户端越来越多的逻辑代码不但臃肿升级还比较麻烦。 代理这层无状态的可任意扩展节点对于客户端来说访问代理跟访问单机Redis一样。 你可能也喜欢: Redis系列教程(二)详解Redis的存储类型、集群架构、以及应用场景Redis系列教程(六)Redis缓存和MySQL数据一致性方案详解Redis系列教程(七)Redis并发竞争key的解决方案详解Redis系列教程(三)如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题Redis系列教程(五)Redis哨兵、复制、集群的设计原理以及区别Redis系列教程(八)分布式锁的由来、及Redis分布式锁的实现详解