
Redis
文章平均质量分 81
Redis缓存理解&实践
legendaryhaha
legendaryhaha的博客
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Redisson入坑篇
Redision基本用法及看门狗原理解析原创 2022-11-13 22:43:53 · 892 阅读 · 0 评论 -
基于Redission实现的延时队列
基于Redission实现的延时队列背景实现原理总结其它背景当前业务中存在着超时关闭各种类型的订单的场景。项目里已集成了RocketMq,可以基于此实现延时队列。由于采用RocketMq实现延时队列有个缺点,那就是它不能灵活的支持各个精度的延时,只能按照事先配置好的延时级别进行。基于以上三点考虑,并在对比各种实现延时队列的方案后,决定采用Redission(项目里也有集成Redission)+ RocketMq 进行实现。实现几个重要的APIRBlockingQueueRDelaye原创 2021-12-26 16:46:37 · 5724 阅读 · 0 评论 -
【redis键过期删除策略】很高兴再次认识你
【redis键过期删除策略】很高兴再次认识你三种删除策略redis采取的方式定期删除惰性删除三种删除策略在不考虑redis实现方式的情况下,我们自己手动设计一个删除有时间限制的key有几种策略?定时删除:在创建完一个key时,同时创建一个定时任务,监听key是否过期。定期删除:设置好周期之后,间断性的扫描key,然后删除过期的key。(这里的扫描方式拓展开来也可以划分为全部扫还是随机部分扫,随机的发方式又可以怎样设计)惰性删除:联想ThreadLocal的实现方式。前两两个都是主动去做原创 2021-05-02 22:35:03 · 206 阅读 · 0 评论 -
【跳跃表篇】Redis为什么快?你能回答出几个点呢?
【跳跃表篇】Redis为什么快?你能回答出几个点呢?前言何为跳跃表前言正如标题所诉,这算是一个比较常见的面试题了。小伙伴们在回答这个问题时,很多时候都会说单线程、基于内存的存储或者通过内部维护的字典可以使我们读取数据在O(1)的复杂度。其实,还可以进行拓展。譬如提一下redis的单线程并非真正意义上的单线程,此时,如果你对IO多路复用了然于心,则接下来是show time!又或者你可以提一下redis为了达到快的目的用了哪些数据结构(这里不是指redis提供的操作类型,如字符串、哈希、列表这些,原创 2021-04-30 00:05:26 · 428 阅读 · 0 评论 -
Redis中的SDS
SDS简单动态字符串结构redis操作数据为什么会快?在回答这个问题时,我们一般会说redis对数据的操作是基于缓存的,速度自然而然的快。二来redis在数据操作时通过单线程模型避免了线程切换产生的开销。除此之外,redis采用的合理的数据结构也是redis操作数据快的原因之一。简单动态字符串Redis支持字符串类型的操作,其底层实现却不是采用C语言表示字符串的方式,而是采用SDS(simple dynamic string,简单动态字符串) 抽象类型进行表示。结构在redis5.0的sds.原创 2021-02-20 22:32:20 · 728 阅读 · 0 评论 -
Redis哨兵(Sentinel)模式
Redis哨兵(Sentinel)模式例子哨兵模式之下如监听主机哨兵模式之下如选取主机关于领头Sentinel的说明在redis集群中,当主机宕机了,我们除了手动修复之外,也可以通过配置哨兵(Sentinel),让其自动选举出主机节点,保证集群的可靠性。例子哨兵可以 以独立进程的方式,监控着主机和从机的运行情况。如下在redis的配置目录中增加sentinel.conf文件,在文件内输入如下内容:# sentinel monitor 监视的主机名 ip地址 端口号 sentinel monito原创 2021-01-17 14:50:54 · 423 阅读 · 0 评论 -
Redis主从复制
Redis主从复制原理2.8之前的版本2.8及之后的版本集群相关配置原理2.8之前的版本2.8之前的版本的redis在主从复制的时候主要包括如下两个步骤:同步命令传播同步给我的感觉就是从服务器在初始化进行的流程,其流程图如上图所示:从服务器启动的时候,向主服务器发送sync命令。主服务器收到sync命令后,执行BGSAVE命令,生成RDB文件;在生成RDB文件的期间,对于源源不断写数据的命令会划分一个缓冲区进行存放。主服务器发送RDB文件,从服务器进行接收并进行更新。主服务器再将缓冲原创 2021-01-16 12:08:44 · 191 阅读 · 0 评论 -
Redis发布订阅模型及源码
Redis发布订阅模型发布订阅模型redis实现源码实现订阅发布其他应用场景缺点对一些数据量比较少,而又符合发布订阅模型的业务,我们可以尝试使用redis进行实现,而无需一上来就使用消息队列这么重的工具。发布订阅模型发布订阅模型如下图所示,3个消费者(consummer)订阅(subscribe)了频道channel-1,当生产者(producer)有内容需要群发给订阅频道channel-1的用户时,只需要将内容发布(publish)到频道channel-1上,订阅了频道channel-1的消费者们原创 2021-01-14 23:00:09 · 750 阅读 · 0 评论 -
Redis持久化策略
Redis持久化策略RDBAOF注意优缺点RDBRDB(Redis Database Backup file) 持久化策略采用的是快照模式,备份的是数据本身,redis默认的持久化策略。原理如图所示:何时出发RDB文件的写入勒?有如下5中情形:在redis.conf配置文件中,设置了SAVE选项,如:save 900 1,表示每900s至少有一个key被修改时,redis客户端会自动发送BGSAVE命令。客户端发送BGSAVE指令,父进程fork出子进程,子进程完成RDB文件的生成。内存不足原创 2021-01-13 22:31:41 · 2533 阅读 · 0 评论 -
布隆过滤器
布隆过滤器原理插入查询实现应用缺点及改进原理插入布隆过滤器(BloomFilter) 将待插入的元素通过预先设置的M个哈希函数进行运算,得到M个K值,每个K值表示事先初始化的一个长度为 N的比特位数组上的第K个位置(k<=N),最后将这M位置设置为1。查询将要查询的元素经过 M个哈希函数进行运算,得到对应于比特位数组上的 M 个位置,如果M 个位置有一个为 0,则元素肯定不存在,如果 M 个位置全部为 1,则可能存在。实现其中,关于M个函数的模拟可以采用如下这种技巧,用2个哈希函数来模原创 2021-01-12 22:25:46 · 266 阅读 · 0 评论 -
Redis缓存穿透/击穿/雪崩
Redis缓存穿透/击穿/雪崩缓存穿透/击穿缓存雪崩解决方案通用解决方案缓存穿透解决方案缓存击穿解决方案缓存雪崩解决方案考虑一个简单的场景,只有MySQL数据库和Redis在存放数据,然后用户发起查询请求,然后又下面几个问题。缓存穿透/击穿缓存穿透: 用户请求的数据在redis缓存里头和MySQL都没有,当大量用户并发请求,MySQL压力过大,容易奔溃。缓存击穿:redis缓存里头某个热点key失效时,大量用户并发请求直接来到MySQL数据库上,MySQL压力过大,容易奔溃。缓存雪崩当redi原创 2021-01-11 22:54:06 · 654 阅读 · 0 评论 -
redis中的乐观锁
redis中的乐观锁前言实践前言 上一篇的文章我们说了redis在运行异常的情况下没法回滚,编译错误的情况下会回滚,其实还有一种情况,即通过加了乐观锁的方式。乐观锁,一种轻量级的锁,通过cas(compare and swap)的操作对值进行修改或者不修改,cas会导致ABA问题,但通过引入版本号可以解决。实践 watch..unwatch进行加锁或者解锁。一开始设置sur...原创 2020-05-05 14:13:25 · 588 阅读 · 0 评论 -
redis中的事务
redis中的事务前言实践总结前言 在redis中,单条命令具有原子性,但它的事务没有原子性,不可回滚,其实现可以借助multi...exec命令,事务的取消可以借助discard命令。实践 multi开启后,接下来的命令都会进入队列中,而不会马上执行。 在新开的端口中连接进入后,get上图中key为test2的值,此时是取不到的。 提交事务后,才会执行(就...原创 2020-05-05 13:34:21 · 329 阅读 · 0 评论 -
Redis的寻址过程[理解]
Redis的寻址过程经常用Redis的道友是否有想过Redis如何寻址的呢?如果网上搜一下,发现很多答案不外乎如下例子,但对于答案中的每一条如何理解呢,有时甚至云里雾里,在这里记录一下我的理解Redis拿到一个 key 后,先判断当前库的 0 号和1号哈希表是否为空,如果为 true 直接返回 NULL。源码如下:if (d->ht[0].used + d->ht[1].u...原创 2019-10-19 17:23:49 · 1121 阅读 · 0 评论 -
Redis的基操
记录一下redis的基本操作redis的五种数据类型字符串的操作创建哈希表创建列表创建无序集合创建有序集合更多内容可查看菜鸟redis的五种数据类型string(字符串)hash(哈希)list(列表)set(集合)zset(sorted set有序集合)字符串的操作[ps:一个键最大空间为512M]set key(键的名称) value(键对应的值)get key(...原创 2019-04-20 21:48:39 · 231 阅读 · 0 评论