![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
redis
文章平均质量分 58
这瓜保熟么
平常心
展开
-
缓存淘汰算法-LRU 实现原理
01、前言我们常用缓存提升数据查询速度,由于缓存容量有限,当缓存容量到达上限,就需要删除部分数据挪出空间,这样新数据才可以添加进来。缓存数据不能随机删除,一般情况下我们需要根据某种算法删除缓存数据。常用淘汰算法有 LRU,LFU,FIFO,这篇文章我们聊聊 LRU 算法。02、LRU 简介LRU是 Least Recently Used 的缩写,这种算法认为最近使用的数据是热门数据,下一次很大概率将会再次被使用。而最近很少被使用的数据,很大概率下一次不再用到。当缓存容量的满时候,优先淘汰最近很.转载 2021-09-10 12:32:01 · 590 阅读 · 1 评论 -
Redis集群搭建及原理
Redis集群搭建及原理 - 风止雨歇 - 博客园转载 2021-09-10 01:07:20 · 158 阅读 · 0 评论 -
Redis 的线程模型了解么?
Redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 Redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 Socket,根据 Socket 上的事件来选择对应的事件处理器进行处理。文件事件处理器的结构包含 4 个部分:多个 Socket IO 多路复用程序 文件事件分派器 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)多个 Socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO转载 2021-09-09 22:26:19 · 113 阅读 · 0 评论 -
Redis哨兵、持久化、主从、手撕LRU
小伙子你好,之前问过了你基础知识以及一些缓存的常见几个大问题了,那你能跟我聊聊为啥Redis那么快么?哦,帅气迷人的面试官您好,我们可以先看一下关系型数据库跟Redis本质上的区别Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库,由C语言编写,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。 完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。它的,数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1);转载 2021-09-09 21:19:55 · 139 阅读 · 0 评论 -
redis特点单进程单线程高性能服务器,Redis为什么是单线程?高并发响应快?
为什么 redis 单线程却能支撑高并发?纯内存操作核心是基于非阻塞的 IO 多路复用机制单线程反而避免了多线程的频繁上下文切换问题一、Redis的高并发和快速原因1.redis是基于内存的,内存的读写速度非常快(纯内存); 数据存在内存中,数据结构用HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)。2.redis是单线程的,省去了很多上下文切换线程的时间(避免线程切换和竞态消耗)。3.redis使用IO多路复用技术(IO multiplexing, 解转载 2021-09-09 20:57:33 · 362 阅读 · 0 评论 -
Redis跳表
1:Redis数据结构——跳跃表 - Mr于 - 博客园转载 2021-09-09 19:09:24 · 93 阅读 · 0 评论 -
Redis的底层数据结构
https://www.cnblogs.com/ysocean/p/9080942.html转载 2021-09-09 17:47:01 · 96 阅读 · 0 评论 -
Redis:有序集合类型zset实现原理
和上面的集合对象相比,有序集合对象是有序的。与列表使用索引下标作为排序依据不同,有序集合为每个元素设置一个分数(score)作为排序依据。①、编码有序集合的编码可以是 ziplist 或者 skiplist。ziplist 编码的有序集合对象使用压缩列表作为底层实现,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个节点保存元素的分值。并且压缩列表内的集合元素按分值从小到大的顺序进行排列,小的放置在靠近表头的位置,大的放置在靠近表尾的位置。//操作ZADD pri转载 2021-09-09 16:32:01 · 182 阅读 · 0 评论 -
Redis-Hash
哈希冲突Redis的哈希表使用的是链地址法解决键冲突,每个哈希表节点都有一个next指针,多个哈希表节点可以用next指针构成一个单向链表,Redis采用的是头插法。哈希表的扩容与收缩当满足以下两个条件中的任意一个条件的时候,程序会自动开始对哈希表进行扩展操作。服务器目前没有在执行BGSAVE命令或者BGREWRITEAOF命令时,并且哈希表的负载因子大于等于1. 服务器目前正在执行BGSAVE命令或者BGREWRITEAOF命令,并且哈希表的负载因子大于等于5其中哈希表的负载因为可以通转载 2021-01-27 15:45:41 · 99 阅读 · 0 评论 -
Redis-SDS
简单动态字符串Redis没有直接是使用C语言传统的字符串表示,而是自己构建了一种简单动态字符串(simple dynamic string SDS)的抽象类型,并将SDS用作Redis的默认字符串表示。SDS的定义struct sdshdr{ int len; //记录buf数组中已经使用的字节数量,等于SDS所保存的字符串长度 int free; //记录buf数组中未使用的字节的数量 char[] buf; //字节数组,用于保存字符串}SDS与C语言字符串的区别.转载 2021-01-27 15:40:18 · 111 阅读 · 0 评论 -
redis中的Zset原理
1.Zsetredis中有一个非常重要的数据结构,那就是Zset。它是一个有序集合,也就是说存储的数据是有序的。说到有序集合,很容易就能想到二叉搜索树,比如AVL树、红黑树、B树、B+树这些数据结构。而Zset底层使用的是什么数据结构呢,其实zset使用的是跳跃表(skipList)的数据结构。什么是跳跃表?它其实是一种随机化的数据结构,一个多层的有序链表,一种基于概率统计的插入算法。2.redis中的zset为什么不使用红黑树而使用跳跃表首先,在做范围查询的时候,平衡树的操作要比跳跃转载 2021-01-27 15:30:54 · 660 阅读 · 0 评论 -
Redis重新分片及迁移技术
https://blog.csdn.net/dreamvyps/article/details/84503123转载 2021-01-23 15:26:59 · 264 阅读 · 0 评论 -
Redis热点key问题
https://zhuanlan.zhihu.com/p/50668153转载 2021-01-23 15:05:08 · 114 阅读 · 0 评论 -
Redis的淘汰策略
目录第一种策略 noeviction 第二种策略 volatile-lru 第三种策略 volatile-lfu 第四种策略 volatile-ttl 第五种策略 volatile-random 第六种策略 allkey-lru 第七种策略 allkeys-lfu 第八种策略 allkeys-randomRedis 引入基于样本的 eviction pool,来提升剔除的准确性。当 Redis 内存占用超过阀值后,按策略从主 dict 或者带过期时间的 expire dict 中随机选择转载 2021-01-09 15:30:25 · 6106 阅读 · 0 评论 -
Pipeline详解
一、pipeline出现的背景:redis客户端执行一条命令分4个过程:发送命令-〉命令排队-〉命令执行-〉返回结果这个过程称为Round trip time(简称RTT, 往返时间),mget mset有效节约了RTT,但大部分命令(如hgetall,并没有mhgetall)不支持批量操作,需要消耗N次RTT ,这个时候需要pipeline来解决这个问题二、pepeline的性能1、未使用pipeline执行N条命令2、使用了pipeline执行N条命令3、..转载 2021-01-01 22:53:10 · 14938 阅读 · 0 评论 -
基于Redis bitmap实现签到功能
需求场景Bitmap 对于一些特定类型的计算非常有效。假设现在我们希望记录自己网站上的用户的上线频率,比如说,计算用户A上线了多少天,用户B上线了多少天,诸如此类,以此作为数据,从而决定让哪些用户参加beta测试等活动——这个模式可以使用SETBIT和BITCOUNT来实现。比如说,每当用户在某一天上线的时候,我们就使用SETBIT,以用户名作为key,将那天所代表的网站的上线日作为offset 参数,并将这个offset 上的为设置为1。举个例子,如果今天是网站上线的第100天,而用转载 2020-12-28 21:43:25 · 1005 阅读 · 2 评论 -
Redis跨机房双向同步实践
为什么需要异地多活?如:Redis\Mysql上海机房A、B ,A为主机房 ,B为从机房,为的就是同步A机房数据,防止A机房断网等原因,无法为系统提供服务,做的容灾备用方案,同一个机房内 master节点挂了 slave节点可以通过哨兵模式等其他选主方案,重新选出新的master节点,继续为应用系统提供服务,但是如果A机房整个机房瘫痪了,此时还得保证Redis\Mysq继续为应用系统提供服务,那么就想到了,机房互相备份方案,比如千岛湖的机房B是上海机房A的备份存储,A机房挂了,B机房继续为应用系统提.转载 2020-05-18 23:50:49 · 11256 阅读 · 3 评论 -
缓存穿透、缓存击穿、缓存雪崩概念及解决方案
缓存穿透概念访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉。解决方案采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤; 访问key未在DB查询到值,也将空值写进缓存,但可以设置较短过期时间。缓存雪崩概念大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。解决方案可以给缓存设置过期时间时加上一个随机值时间,使得每个key的过期时间分布开来,不会集原创 2020-05-16 16:27:43 · 135 阅读 · 0 评论 -
Redis持久化 - RDB和AOF
https://segmentfault.com/a/1190000016021217转载 2020-04-26 20:35:56 · 90 阅读 · 0 评论 -
redis数据类型List的安全队列和不安全队列
Redis本身没有锁的概念,Redis对于多个客户端连接并不存在竞争。Redis为单进程单线程模式,采用队列模式将并发访问变为串行访问。在学习RPOPLPUSH命令的时候,官方文档中有提到安全队列和不安全的队列,一开始没有看懂,现在理解了做个笔记。一般情况下,我们可以借助List来实现消息队列,比如一个客户端通过命令LPUSH(BLPUSH)把消息入队,另一个客户端通过命令RPOP(BRP...转载 2019-01-11 15:00:12 · 1042 阅读 · 0 评论 -
Redis lua简单应用
package com.jd.gateway.controller;import com.alibaba.fastjson.JSONObject;import com.jd.gateway.logger.ILogger;import com.jd.jim.cli.Cluster;import com.jd.redis.queue.ObjectUtil;import com.jd...原创 2019-01-17 10:52:54 · 160 阅读 · 0 评论 -
redis底层是单线程
一直有个错觉就是,redis底层命令是并发执行的,但今天查看若干资料后发现,redis底层是单线程的,也就是说多客户端向redis服务器发送操作命令,redis底层是串行执行的,这样不禁怀疑这样不是很慢吗?后经过进一步探究,得出结论: 1 单线程并不一定比多线程慢,多线程需要不停切换上下文,本身就有性能损失 2 内存型数据库的瓶颈在IO,因为其数据本身就是在内存里面,不需要频繁的与磁盘做交互,...转载 2019-01-17 10:55:00 · 136 阅读 · 0 评论 -
分布式缓存Redis之Script脚本
一、简介 Redis 脚本使用单个Lua 解释器来执行脚本,并且Redis 也保证脚本会以原子性(atomic)的方式执行:当某个脚本正在运行的时候,不会有其他脚本或 Redis 命令被执行。这和使用 MULTI / EXEC 包围的事务很类似。在其他别的客户端看来,脚本的效果(effect)要么是不可见的(not visible),要么就是已完成的(already completed)。 R...转载 2019-01-15 11:30:33 · 597 阅读 · 0 评论 -
在redis中使用Lua脚本如何判断变量是否为空
--在lua中,除了nil和false,其他的值都为真,包括0,可以通过nil为false这一点来判断是否为空local temp = redis.call('get',key)if temp then print('temp为非空') else print('temp为空值') ...转载 2019-01-15 14:32:54 · 4686 阅读 · 1 评论 -
redis的两种存储方式string和byte对比
转载 2019-01-16 16:45:22 · 1925 阅读 · 0 评论 -
Redis分布式锁的正确实现方式
Redis分布式锁的正确实现方式前言分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上已经有各种介绍Redis分布式锁实现的博客,然而他们的实现却有着各种各样的问题,为了避免误人子弟,本篇博客将详细介绍如何正确地实现Redis分布式锁。可靠性首先,为了...转载 2019-02-01 13:50:31 · 100 阅读 · 0 评论 -
redis用布隆过滤器解决缓存穿透
缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。这样就导致用户查询的时候,在缓存中找不到,每次都要去数据库再查询一遍,然后返回空(相当于进行了两次无用的查询)。这样请求就绕过缓存直接查数据库,这也是经常提的缓存命中率问题。有很多种方法可以有效地解决缓存穿透问题,最常见的则是采用布隆过滤器(见博客《详解布隆过滤器的原理、使用场景和注意事项》),将所有可能存在的数据哈希到一个足够大的...原创 2019-02-28 21:49:39 · 3383 阅读 · 0 评论 -
Redis中删除过期Key的三种策略
Redis对于过期键有三种清除策略:被动删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key 主动删除:由于惰性删除策略无法保证冷数据被及时删掉,所以Redis会定期主动随机淘汰一批已过期的key 当前已用内存超过maxmemory限定时,触发主动清理策略被动删除只有key被操作时(如GET),REDIS才会被动检查该key是否过期,如果过期则删除之并且...转载 2018-07-23 23:17:23 · 308 阅读 · 0 评论