如何实现根据配置来决定使用redis缓存还是本地缓存

如何实现根据配置来决定使用redis缓存还是本地缓存,第1张

因为Redis具有在数据存储中快速读写数据的能力,所以它比关系型数据库更具有性能优势。但是,关键值数据存储是简单的;它们没有一个类似于

SQL的查询语言或者结构化的数据模型。相反,它们有一个把键值作为与数值相关的标识符来使用的简单字典或哈希模式。管理员使用这些键来进行数值的存储和

检索。

键值存储是简单快速的,它可用于实现丰富数据模型和关系型数据库查询功能的良好匹配。但是,有时候还是使用键值与关系型数据库的组合为好。此外,还有很多商业支持的键值数据库,包括Redis、Riak和Areospike等。

为了运行一个优化热门查询性能的Redis缓存,首先应确定你希望缓存的查询结果。其中,应重点关注最常用的和最耗时的查询,然后确定应缓冲查询中的数据。为简便起见,缓存查询返回的所有列值。

为键值定义一个命名约定;可以使用行主键和列名的组合来构造密钥。例如,其主键ID为 198278的 产品描述可以‘198278:descry’的键值进行存储。确保你的命名规则是简单和规则驱动的,以便于使用最少的代码来实现键的程序化创建。

接下来,确定是运行Redis缓存作为自助管理服务还是运行亚马逊的ElastiCache。运行用户自己的Redis实例将赋予管理人员对缓存的完全控制权。而这一控制权意味着灵活性,例如当有超出容量的情况出现时,管理人员有使用现有保留实例的权力。

此外,当用户想要把应用程序从一家云计算供应商迁移至另一家时,他们会发现完整的管理控制权限是非常有用的。

如果用户选择运行一个自助管理的Redis实例,可下载服务器。Redis的客户端支持30种以上编程语言——从Java和Python到Prolog和Smalltalk。

已经使用AWS环境的企业可能会想要使用ElastiCache。除了诸如托管打补丁这样的优点之外,亚马逊ElastiCache支持一系列高速

缓存优化的节点类型,具体包括从中型到2X的m3节点、从大型到8X的r3节点以及从微型到中型的t2节点。ElastiCache还支持一些上一代的节

点类型,例如选择m1、m2、t1和c1节点。

ElastiCache还支持多个可用区。如果有一个节点发生故障,一个读操作复制节点将取代故障节点。任何需要确保应用程序运行的DNS变更都是

自动完成的,同时会创建一个新的读操作副本。ElastiCache允许基于单位时间使用率的按需定价模式,以及一年期或三年期预付费的节点使用条款。完

整定价清单可以在这里找到。

如果使用Redis缓存和亚马逊ElastiCache,那么就可以从AWS管理控制台启动一个集群。除了设置Redis服务外,还需要修改应用程

序代码以便于能够使用缓存。一个常用的模式就是,检查缓存中是否存在有一个键值,如果没有就执行一个SQL查询以检索数据,然后将其存储在缓存中。当缓冲

存满时,可以配置Redis删除旧数据,这样就不需要用户使用专门的代码来处理缓存存满的情况了。

本地缓存与redis缓存有以下几种不同:

1、读写速度,不考虑并发问题,本地缓存自然是最快的。但是如果本地缓存不加锁,那应并发了咋办呢?所以,我们以加锁方式再比较一次。

2、场景使用,同一数据,从数据库取出来,放到redis只要一次,而放到本地缓存,则需要n个集群次,本地缓存无法用于重复点击,重复点击会分发请求到多台服务器,而用本地缓存只能防止本机重复点击,redis则可以防止,但是时间间隔也需要在redis的读写差之外。

3、redis内存可能n多扩充,而本地扩大堆内存代价是很大的。

4、本地缓存需要自己实现过期功能,实现不好可能导致极其严重的后果,而redis经过大量的流量验证,许多漏洞无需考试,安全。

5、本地缓存无法提供丰富的数据结构,redis可以。redis可以写磁盘,持久化,本地缓存不可以或者说很麻烦要考虑的东西太多。

6、使用本地缓存极有可能导致严重的线程安全问题,并发考虑严重。加本地缓存后,代码复杂度急剧上升,后面进来的开发很难一下领会原有开发想法。间接提升维护成本。

更多Redis相关技术文章,请访问Redis教程栏目进行学习!

1、Redis是一种内存高速cache,如果使用redis缓存,那经常被访问的内容会被缓存在内存中,需要使用的时候直接从内存调取,不知道比硬盘调取快了多少倍,并且支持复杂的数据结构,应用于许多高并发的场景中。

2、Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。zset是set的一个升级版本,他在set的基础上增加了一个顺序属性,这一属性在添加修改元素的时候可以指定,每次指定后,zset会自动重新按新的值调整顺序。可以理解了有两列的mysql表,一列存value,一列存顺序。操作中key理解为zset的名字。

  对于变化频率非常快的数据来说,如果还选择传统的静态缓存方式(Memocached、File System等)展示数据,可能在缓存的存取上会有很大的开销,并不能很好的满足需要,而Redis这样基于内存的NoSQL数据库,就非常适合担任实时数据的容器。

  但是往往又有数据可靠性的需求,采用MySQL作为数据存储,不会因为内存问题而引起数据丢失,同时也可以利用关系数据库的特性实现很多功能。

  所以就会很自然的想到是否可以采用MySQL作为数据存储引擎,Redis则作为Cache。而这种需求目前还没有看到有特别成熟的解决方案或工具,因此采用Gearman+PHP+MySQL UDF的组合异步实现MySQL到Redis的数据复制。

  MySQL到Redis数据复制方案

  无论MySQL还是Redis,自身都带有数据同步的机制,比较常用的MySQL的Master/Slave模式,就是由Slave端分析Master的binlog来实现的,这样的数据复制其实还是一个异步过程,只不过当服务器都在同一内网时,异步的延迟几乎可以忽略。

  那么理论上也可以用同样方式,分析MySQL的binlog文件并将数据插入Redis。但是这需要对binlog文件以及MySQL有非常深入的理解,同时由于binlog存在Statement/Row/Mixedlevel多种形式,分析binlog实现同步的工作量是非常大的。

  因此这里选择了一种开发成本更加低廉的方式,借用已经比较成熟的MySQL UDF,将MySQL数据首先放入Gearman中,然后通过一个自己编写的PHP Gearman Worker,将数据同步到Redis。比分析binlog的方式增加了不少流程,但是实现成本更低,更容易操作。

redis缓存其实就是把经常访问的数据放到redis里面,用户查询的时候先去redis查询,没有查到就执行sql语句查询,同时把数据同步到redis里面。redis只做读操作,在内存中查询速度快。

使用redis做缓存必须解决两个问题,首先就是确定用何种数据结构存储来自mysql的数据;确定数据结构之后就是需要确定用什么标识来作为数据的key。

mysql是按照表存储数据的,这些表是由若干行组成。每一次执行select查询,mysql都会返回一个结果集,这个结果是由若干行组成的。redis有五种数据结构:列表list,哈希hash,字符串string,集合set,sorted set(有序集合),对比几种数据结构,string和hash是比较适合存储行的数据结构,可以把数据转成json字符串存入redis。

全量遍历键: keys pattern keys

有人说 KEYS 相当于关系性数据的库的 select ,在生产环境几乎是要禁用的

不管上面说的对不对, keys 肯定是有风险的。那我们就换一种方案,在存数据的时候。把数据的键存一下,也存到redis里面选hash类型,那么取的时候就可以直接通过这个hash获取所有的值,自我感觉非常好用!

DABAN RP主题是一个优秀的主题,极致后台体验,无插件,集成会员系统
网站模板库 » 如何实现根据配置来决定使用redis缓存还是本地缓存

0条评论

发表评论

提供最优质的资源集合

立即查看 了解详情