redis
文章平均质量分 78
RealKeyboardMan
天不生我键盘侠,键道万古长如夜。
展开
-
Redis事务
事务的基本属性A(atomicity),原子性。C(consistency),一致性。I(isolation),隔离性。D(durability),持久性。Redis如何实现事务第一步、客户端要使用一个命令显式地表示一个事务的开启。在 Redis 中,这个命令就是 MULTI。第二步、客户端把事务中本身要执行的具体操作(例如增删改数据)发送给服务器端。这些操作就是 Redis 本身提供的数据读写命令,例如 GET、SET 等。不过,这些命令虽然被客户端发送到了服务器端,但 Redis原创 2021-01-22 10:25:17 · 81 阅读 · 0 评论 -
Redis:数据淘汰机制
设置多大的缓存容量如果把所有要访问的数据都放入缓存,性价比很低。一方面,1TB内存价格大概3.5万元,而1TB磁盘价格大约1000元;另一方面,数据的访问都是有局部性的。80%的请求可能只访问了20%的数据,所以把所有数据放入内存,并没有必要。实际应用中的数据访问是局部性的,以蓝线为例,80%的请求访问了20%的数据。然而当用户个性化数据较多时,可能表现为红线。所以容量设置需要根据数据实际访问特征和成本开销来考虑。建议把缓存容量设置为总数据量的 15% 到 30%,兼顾访问性能和内存空间开销。原创 2021-01-14 20:34:32 · 169 阅读 · 0 评论 -
删除数据后,为什么内存占用率还是很高
当数据删除后,Redis释放的内存空间由内存分配器管理,并不会立即返回给操作系统。所以操作系统仍然会记录着给redis分配了大量内存。Redis释放的内存空间可能并不是连续的,这些不连续的空间很可能处于闲置状态,Redis无法用这些空间来保存数据,不仅会减少Redis能够实际保存的数据量,还会降低运行机器的成本回报率。内存碎片操作系统的剩余内存空间总量足够,但是是分散的。而应用申请的是一块连续地址空间的N字节,在剩余的内存空间中,没有大小为N字节的连续空间了,这些剩余空间就是内存碎片。内存碎片.原创 2021-01-06 10:28:15 · 891 阅读 · 0 评论 -
CPU结构对redis性能的影响
主流CPU结构一个CPU处理器中一般有多个运行核心,一个运行核心称之为一个物理核。每个物理核都可以运行应用程序。每个物理核都拥有私有的一级缓存,包括一级指令缓存和一级数据缓存,以及私有的二级缓存。因为L1和L2缓存是每个物理核私有的,所以物理核访问他们的速度非常块,不到10纳秒。但是受限于制造技术,这些L1和L2缓存的大小一般只有KB级别。不同的物理核还会共享一个共同的三级缓存,能存储的资源较多,能达到几MB到几十MB,这样当L1和L2缓存中没有命中时,可以访问L3。避免访问内存。现在主流的CPU原创 2020-12-31 16:36:59 · 232 阅读 · 3 评论 -
如何避免单线程模型的阻塞
Redis实例有哪些阻塞点客户端:网络IO,键值对增删改查操作,数据库操作;磁盘:生成RDB快照,记录AOF日志,AOF重写。原创 2020-12-24 21:22:36 · 238 阅读 · 0 评论 -
缓存异常及解决方案
存在问题数据不一致;缓存雪崩;缓存击穿和缓存穿透。数据不一致一致指的是:缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;缓存中本身没有数据,那么,数据库中的值必须是最新值。不一致如何发生:对于读写缓存来说,写缓存时同步写数据库,需要使用事务保证缓存和数据库的更新具有原子性。弱一致性情况下,可以使用异步写回。对于只读缓存,删改数据需要既更新数据库,又删除缓存。如果不使用事务,就会出现数据不一致。比如先更新数据库,再删除缓存。更新成功,删除缓存失败,则缓存中为旧值。原创 2020-12-10 20:13:39 · 1651 阅读 · 0 评论 -
Redis变慢时的处理方法
如何诊断查看 Redis 的响应延迟大部分时候,Redis 延迟很低,但是在某些时刻,有些 Redis 实例会出现很高的响应延迟,甚至能达到几秒到十几秒,不过持续时间不长,这也叫延迟“毛刺”。这种方法是看 Redis 延迟的绝对值,但是,在不同的软硬件环境下,Redis 本身的绝对性能并不相同。基于当前环境下的 Redis 基线性能所谓的基线性能呢,也就是一个系统在低压力、无干扰下的基本性能,这个性能只由当前的软硬件配置决定。redis-cli --intrinsic-latency 12原创 2020-12-04 10:18:51 · 830 阅读 · 1 评论 -
Redis:消息队列
消息队列需要满足以下需求消息保序处理重复的消息(幂等)保证消息可靠性,如消费者宕机,消息不能丢基于List保序本身就是先入先出,LPUSH放入队列,RPOP从队尾取出。潜在性能风险:不会主动地通知消费者有新消息写入,消费者需要自己循环调用RPOP来监听。浪费CPU性能。可以使用BRPOP命令,也称为阻塞式读取,客户端在没有读到队列数据时,自动阻塞,直到有新的数据写入队列,再开始读取新数据。幂等List 本身是不会为每个消息生成 ID 号的,所以,消息的全局唯一 ID 号就原创 2020-11-13 10:27:17 · 184 阅读 · 0 评论 -
Redis:GEO类型
面向LBS(Location-Based Service,基于位置服务 )以叫车服务为例,每辆车有一个车辆id,以及当前所处的经纬度。用户叫车时,叫车服务根据用户当前经纬度,来查找附近的车辆,并进行匹配。匹配成功,叫车服务通过id查到车辆详情,并返回给用户。GeoHash 的编码方法二分区间,区间编码。当要对一组经纬度进行 GeoHash 编码时,要先对经度和纬度分别编码,然后再把经纬度各自的编码组合成一个最终编码。对于一个地理位置信息来说,它的经度范围是[-180,180]。GeoHa原创 2020-11-10 10:04:58 · 206 阅读 · 0 评论 -
Redis:统计相关
聚合统计所谓的聚合统计,就是指统计多个集合元素的聚合结果,包括:统计多个集合的共有元素(交集统计);把两个集合相比,统计其中一个集合独有的元素(差集统计);统计多个集合的所有元素(并集统计)。使用Set实现:SUNIONSTORE(并集)、SDIFFSTORE(差集)、SINTERSTORE(交集)Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞。所以,分享一个小建议:可以从主从集群中选择一个从库,让它专门负责聚合计算,或者是把数据原创 2020-10-22 10:22:39 · 270 阅读 · 0 评论 -
Redis:string类型带来的空间消耗过大的问题。
案例:使用Redis的string类型保存图像ID和图片存储对象 ID,图像ID为Key、图片存储对象ID为Value。两者均为10位纯数字。保存1亿对键值消耗空间6.4GB,平均1个键值对消耗64字节。问题:按理来说8个字节可以表示2的64次方-1,超过了10位数字,案例中键值对加起来消耗16字节也就罢了,为什么消耗了64字节?回答:除了记录实际数据,String 类型还需要额外的内存空间记录数据长度、空间使用等信息,这些信息也叫作元数据。当实际保存的数据较小时,元数据的空间开销就显得比较大了。St原创 2020-10-15 10:31:00 · 1550 阅读 · 0 评论 -
Redis哨兵机制
主库挂了,如何不间断服务?无论是写服务中断,还是从库无法进行数据同步,都是不能接受的。涉及到三个问题:主库真的挂了么?该选择哪个从库作为主库?怎么把新主库的相关信息通知给从库和客户端呢?在 Redis 主从集群中,哨兵机制是实现主从库自动切换的关键机制,它有效地解决了主从复制模式下故障转移的这三个问题。哨兵机制哨兵其实就是一个运行在特殊模式下的 Redis 进程,主从库实例运行的同时,它也在运行。哨兵主要负责的就是三个任务:监控、选主和通知。监控监控是指哨兵进程在运行时,原创 2020-09-23 09:48:17 · 148 阅读 · 2 评论 -
Redis数据同步
高可靠性数据尽量少丢失,AOF(Append Only File)日志和RDB(Redis DataBase)快照机制保证这一点。服务尽量少中断,Redis的做法是增加副本冗余量。Redis 提供了主从库模式,以保证数据副本的一致,主从库之间采用的是读写分离的方式。主从库间如何进行第一次同步启动多个 Redis 实例的时候,它们相互之间就可以通过 replicaof(Redis 5.0 之前使用 slaveof)命令形成主库和从库的关系,之后会按照三个阶段完成数据的第一次同步。例如,现在有原创 2020-09-10 10:26:23 · 1407 阅读 · 0 评论 -
Redis数据持久化:内存快照
AOF记录的是操作命令,如果日志很多,那么恢复时就比较慢。所谓内存快照,就是指内存中的数据在某一个时刻的状态记录。三个问题对哪些数据做快照?这关系到快照的执行效率问题。做快照时,数据还能被增删改吗?这关系到 Redis 是否被阻塞,能否同时正常处理请求。可以每秒做一次快照吗?给哪些内存数据做快照?Redis执行的是全量快照,一次性记录了所有数据,但是也会产生更大磁盘开销,因为产生的RDB文件更大。Redis提供了两个命令,save和bgsavesave:在主线程中执行,会导致阻.原创 2020-09-02 10:19:34 · 312 阅读 · 0 评论 -
Redis数据持久化:AOF日志
宕机了,如何恢复数据?从数据库恢复存在两个问题,1是频繁访问带来巨大压力,2是读取速度变慢。Redis持久化包括AOF日志和RDB快照两种机制。AOF日志数据库通常是先写日志再写数据,而AOF是先写数据再写日志。为什么呢,因为数据库的redo log记录的是修改的数据,而AOF记录的是命令,为了避免开销,写AOF日志时不会进行命令检查,只有命令执行成功了,才会写日志,不会阻塞当前写操作,这样是为了快速响应客户端请求。存在风险:1、若写了数据,还未来得及写日志,此时宕机,那么这个数据就有丢失的.原创 2020-09-01 09:53:13 · 218 阅读 · 0 评论 -
Redis的数据结构
值的数据类型String(字符串)、List(列表)、Hash(哈希)、Set(集合)和 Sorted Set(有序集合)底层实现Redis使用哈希表存储所有键值对。一个哈希表,其实就是一个数组,数组的每个元素称为一个哈希桶。一个哈希表是由多个哈希桶组成的,每个哈希桶中保存了键值对数据。哈希桶中的元素保存的并不是值本身,而是指向具体值的指针哈希表为什么变慢了当你往哈希表中写入更多数据时,哈希冲突是不可避免的问题。这里的哈希冲突,也就是指,两个 key 的哈希值和哈希桶计算对应关系时,正原创 2020-08-21 16:31:28 · 137 阅读 · 0 评论