Redis的相关问题总结

Redis的相关问题总结

一、Redis的优缺点及适用场景

Redis 是一个基于内存的高性能key-value数据库。很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。它的优点如下:

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2) 支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除
Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

Redis最适合所有数据in-momory的场景,如:

(1)、会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。

(2)、全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

(3)、队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

(4),排行榜/计数器

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

(5)、发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。

 

二、redis的缓存失效策略和主键失效机制

  作为缓存系统都要定期清理无效数据,就需要一个主键失效和淘汰策略.
  在Redis当中,有生存期的key被称为volatile。在创建缓存时,要为给定的key设置生存期,当key过期的时候(生存期为0),它可能会被删除。
  1、影响生存时间的一些操作
  生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆盖原来的数据,也就是说,修改key对应的value和使用另外相同的key和value来覆盖以后,当前数据的生存时间不同。
  比如说,对一个 key 执行INCR命令,对一个列表进行LPUSH命令,或者对一个哈希表执行HSET命令,这类操作都不会修改 key 本身的生存时间。另一方面,如果使用RENAME对一个 key 进行改名,那么改名后的 key的生存时间和改名前一样。
  RENAME命令的另一种可能是,尝试将一个带生存时间的 key 改名成另一个带生存时间的 another_key ,这时旧的 another_key (以及它的生存时间)会被删除,然后旧的 key 会改名为 another_key ,因此,新的 another_key 的生存时间也和原本的 key 一样。使用PERSIST命令可以在不删除 key 的情况下,移除 key 的生存时间,让 key 重新成为一个persistent key 。
  2、如何更新生存时间
  可以对一个已经带有生存时间的 key 执行EXPIRE命令,新指定的生存时间会取代旧的生存时间。过期时间的精度已经被控制在1ms之内,主键失效的时间复杂度是O(1),
  EXPIRE和TTL命令搭配使用,TTL可以查看key的当前生存时间。设置成功返回 1;当 key 不存在或者不能为 key 设置生存时间时,返回 0 。
  最大缓存配置
  在 redis 中,允许用户设置最大使用内存大小
  server.maxmemory
  默认为0,没有指定最大缓存,如果有新的数据添加,超过最大内存,则会使redis崩溃,所以一定要设置。redis 内存数据集大小上升到一定大小的时候,就会实行数据淘汰策略。
  redis 提供 6种数据淘汰策略:
  . volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  . volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  . volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  . allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  . allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  . no-enviction(驱逐):禁止驱逐数据
  注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。
  使用策略规则:
  1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
  2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
  三种数据淘汰策略:
  ttl和random比较容易理解,实现也会比较简单。主要是Lru最近最少使用淘汰策略,设计上会对key 按失效时间排序,然后取最先失效的key进行淘汰

 

三、Redis是单进程单线程的,并发问题如何解决

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

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

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

 

四、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最好在同一个局域网内。

 

五、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文件的操作都是串行的.可能会造成比较长时间的延迟,但是对数据完整性有很好的保证.

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/112469.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 路由懒加载详解[通俗易懂]

    路由懒加载详解[通俗易懂]1.什么是路由懒加载?整个网页默认是刚打开就去加载所有页面,路由懒加载就是只加载你当前点击的那个模块。按需去加载路由对应的资源,提高首屏加载速度(tip:首页不用设置懒加载,而且一个页面加载过后再次访问不会重复加载)。实现原理:将路由相关的组件,不再直接导入了,而是改写成异步组件的写法,只有当函数被调用的时候,才去加载对应的组件内容。2.传统路由配置:importVuefrom’vue’importVueRouterfrom’vue-router’importLogi

    2022年10月7日
    4
  • springboot事物oracle,SpringBoot 事务管理

    springboot事物oracle,SpringBoot 事务管理事务管理是项目中必不可少的一部分,使用SpringBoot时,可以很方便的配置和使用事务管理器。1.导入依赖当导入jdbc或者jpa依赖后,SpringBoot会自动分别注入DataSourceTransactionManager或JpaTransactionManager。所以我们不需要任何配置就可以使用@Transactional注解来进行事务的使用。我习惯使用jdbc,虽然Jpa有各种…

    2022年5月29日
    35
  • Tips–解决BeatsX开机白灯闪三下无法连接问题(附拆机教程)[通俗易懂]

    Tips–解决BeatsX开机白灯闪三下无法连接问题(附拆机教程)[通俗易懂]解决BeatsX开机白灯闪三下无法连接问题(附拆机教程)问题描述解决方法BeatsX拆机教程问题描述BeatsX耳机用了有一年左右,但是突然有一天,开机的时候只有白灯闪三下,然后连接不上蓝牙,即使重启也没有办法。这个问题困扰了很久,我一度以为是因为里面的固件出了问题,然后在官网刷固件的时候发现固件是最新的无法在刷了,也因此意外收获了修改beatsX名字的方法,哈哈,算是因祸得福吧。最后通过咨…

    2022年6月27日
    124
  • 关于balun的一些仿真和思考[通俗易懂]

    关于balun的一些仿真和思考[通俗易懂]关于balun的一些仿真和思考1、错误的初始设计,电路图如下:2、来看看ADS里,理想balun的仿真结果3、将原电路的50ohm并接在balun的差分端,而非单端,再看看仿真结果。4、那么为什么出现上述情况呢?5、我们应该如何去做呢?6、总结:如有错误,还请留言区指出~为了提高共模抑制能力,很多芯片的输入输出口会设计成差分口,在射频电路中也是如此。最近在项目测试中,一个关于balun的问题困扰了我很久,迟迟没有想明白。我爸说:“当一个问题你久久思考却毫无头绪时,你就暂时放一放。也许有天突然开窍,你就想

    2025年8月1日
    3
  • 无线网络规划与设计案例_无线网络的发展前景

    无线网络规划与设计案例_无线网络的发展前景无线网络规划与设计随着WLAN技术的成熟和终端的普及,WLAN网络承载的业务与应用逐渐丰富,为越来越多的终端用户所喜爱,各大运营商与企业也不断加大对WLAN网络建设的投入,在各热点楼宇(写字楼、酒店、机场等)规划部署WLAN网络,以满足终端用户不断上涨的业务需求。本文将对无线网络的规划设计原则加以总结和分析,可作为无线网络部署的指导意见。无线网络规划与设计当前WLAN网络采

    2022年9月28日
    2
  • being搜索引擎用户体验[通俗易懂]

    being搜索引擎用户体验[通俗易懂]being的搜索引擎带有的自动区别全英(汉)来呈现不同内容的结果,使用户能更快找到需要的结果。它的取词翻译可以很快的使用户得到想要的讯息。但是它的取词翻译有很多地方有一些多余,如myusou

    2022年7月1日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号