谈谈redis高性能缓存

谈谈个人的看法

Redis用于应用和数据库之间的一个高速缓存。一个应用的热点数据占总数据的百分之20,用有限的内存空间去存储这百分之20的数据就能提高系统的性能。

介绍一下Redis

Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI
C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。从2013年5月开始,Redis的开发由Pivotal赞助。

为什么说它是高性能缓存呢?

  1. 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);
  2. 数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的;
  3. 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;
  4. 使用多路I/O复用模型,非阻塞IO;
  5. 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求;

Redis五种数据类型

  1. string 字符串(可以为整形、浮点型和字符串,统称为元素)
  2. hash散列值(hash的key必须是唯一的)
  3. list 列表(实现队列,元素不唯一,先入先出原则)
  4. set 集合(各不相同的元素)
  5. zset 有序set集合

Redis数据持久化

  • RDB持久化:将Reids在内存中的数据库记录定时dump到磁盘上的RDB持久化

  • AOF持久化:将Reids的操作日志以追加的方式写入文件

  • 如何选择: 二者选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),还是选择性能更好但是实时性不强的(rdb)

使用Redis需要注意的问题

  1. 缓存和数据库双写一致性问题

    缓存跟数据库数据暂时不一致,使用缓存就无法保证数据的强一致性,如果业务需要强一致性,那就不能用缓存。但是最终是会保持数据库跟缓存数据一致的,如果业务只需要最终一致性的话大可使用缓存。

    首先,采取正确更新策略,先更新数据库,再删缓存。其次,因为可能存在删除缓存失败的问题,提供一个补偿措施即可,例如利用消息队列

  2. 缓存雪崩问题

    缓存中数据大批量到过期时间,而查询数据量巨大,引起数据库压力过大甚至down机。

    a.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
    b.如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。
    c.设置热点数据永远不过期。

  3. 缓存击穿问题

    某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。

    a.加互斥锁
    b.热点数据不过期

最后

缓存是一把双刃剑,用的好提升系统性能,用的不好可能会出现各种疑难杂症。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值