
Redis
文章平均质量分 83
吴声子夜歌
个人学习记录
展开
-
Redis——Info指令
当从库因为网络原因临 时断开了主库的复制,然后网络恢复了,又重新连上的时候,这段断开的时间内发生在 master 上的修改操作指令都会放在积压缓冲区中,这样从库可以通过积压缓冲区恢复中断的 主从同步过程。如果从库断开的时间过长,或 者缓冲区的大小设置的太小,都会导致从库无法快速恢复中断的主从同步过程,因为中间的 修改指令被覆盖掉了。在使用 Redis 时,时常会遇到很多问题需要诊断,在诊断之前需要了解 Redis 的运行状 态,通过强大的 Info 指令,你可以清晰地知道 Redis 内部一系列运行参数。原创 2023-04-17 16:56:11 · 916 阅读 · 0 评论 -
Redis——Stream
读到新消息后,对应的消息 ID 就会进入消费者的 PEL(正在处理的消息) 结构里,客户端处理完毕后使用 xack指令通知服务器,本条消息已经处理完毕,该消息 ID 就会从 PEL 中移除。Stream 在每个消费者结构中保存了正在处理中的消息 ID 列表 PEL,如果消费者收到 了消息处理完了但是没有回复 ack,就会导致 PEL 列表不断增长,如果有很多消费组的 话,那么这个 PEL 占用的内存就会放大。每个消费组都有一个 Stream 内唯一的名称,消费组不会自动创建,它需要单独的指令。原创 2023-04-17 16:48:09 · 514 阅读 · 0 评论 -
Redis——Scan
如果这个大 key 被删除,内存会一次性回收,卡顿现象会再一次产生。limit 参数就表示需要遍历的 槽位数,之所以返回的结果可能多可能少,是因为不是所有的槽位上都会挂接链表,有些槽 位可能是空的,还有些槽位上挂接的链表上的元素可能会有多个。为了避免对线上 Redis 带来卡顿,这就要用到 scan 指令,对于扫描出来的每一个key,使用 type 指令获得 key 的类型,然后使用相应数据结构的 size 或者 len 方法来得到 它的大小,对于每一种类型,保留大小的前 N 名作为扫描结果展示出来。原创 2023-04-17 15:51:03 · 299 阅读 · 0 评论 -
Redis——GeoHash
方格越 小,坐标越精确。我们知道,经度范围是东经180到西经180,纬度范围是南纬90到北纬90,我们设定西经为负,南纬为负,所以地球上的经度范围就是[-180, 180],纬度范围就是[-90,90]。这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点。命令返回的 geohash 的位置与用户给定的位置元素的位置一一对应。原创 2023-04-17 14:09:32 · 906 阅读 · 0 评论 -
Redis——构建简单限流和漏斗限流
但这种方案也有缺点,因为它要记录时间窗口内所有的行为记录,如果这 个量很大,比如限定 60s 内操作不得超过 100w 次这样的参数,它是不适合做这样的限流 的,因为会消耗大量的存储空间。限流算法在分布式领域是一个经常被提起的话题,当系统的处理能力有限时,如何阻止 计划外的请求继续对系统施压,这是一个需要重视的问题。同时,代码的 复杂度也跟着升高很多。为节省内存,我们只需要保留时间窗口内的行为记录,同时如果用户是冷用户,滑动时 间窗口内的行为是空记录,那么这个 zset 就可以从内存中移除,不再占用空间。原创 2023-04-17 02:58:05 · 707 阅读 · 0 评论 -
Redis——构建布隆过滤器
如果对应的 key 已经存在,bf.reserve 会报错。使用时不要让实际元素远大于初始化大小,当实际元素开始超出初始化大小时,应该对 布隆过滤器进行重建,重新分配一个 size 更大的过滤器,再将所有的历史元素批量 add 进 去 (这就要求我们在其它的存储器中记录所有的历史元素)。布隆过滤器的 initial_size 估计的过大,会浪费存储空间,估计的过小,就会影响准确 率,用户在使用之前一定要尽可能地精确估计好元素数量,还需要加上一定的冗余空间以避 免实际元素可能会意外高出估计值很多。原创 2023-04-16 23:45:05 · 1013 阅读 · 1 评论 -
Redis——位图
bitfield 有三个子指令,分别是 get/set/incrby,它们都可以对指定位片段进行读写,但是最多只能处理 64 个连续的位,如果 超过 64 位,就得使用多个子指令,bitfield 可以一次执行多个子指令。如果增加了正数,会出现上溢,如果增加的是负数,就会出现下溢出。为了解决这个问题,Redis 提供了位图数据结构,这样每天的签到记录只占据一个位, 365 天就是 365 个位,46 个字节 (一个稍长一点的字符串) 就可以完全容纳下,这就大大 节约了存储空间。原创 2023-04-16 15:31:03 · 268 阅读 · 0 评论 -
Redis——构建延时队列
我们将消息序列化成一个字符串作 为 zset 的 value,这个消息的到期处理时间作为 score,然后用多个线程轮询 zset 获取到期 的任务进行处理,多个线程是为了保障可用性,万一挂了一个线程还有其它线程可以继续处 理。Redis 的 zrem 方法是多线程多进程争抢任务的关键,它的返回值决定了当前实例有没有抢到任务, 因为 loop 方法可能会被多个线程、多个进程调用,同一个任务可能会被多个进程线程抢到,通过 zrem 来决定唯一的属主。所以编写客户端消费者的时候要小心,注意捕获异常,还要重试。原创 2023-04-16 15:01:10 · 193 阅读 · 0 评论 -
Redis——构建可重入分布式锁
可重入性是指线程在持有锁的情况下再次请求加锁,如果一个锁支持同一个线程的多次加锁,那么这个锁就是可重入的。比如 Java 语言里有个 ReentrantLock 就是可重入锁。Redis 分布式锁如果要支持可重入,需要对客户端的 set 方法进行包装,使用线程的 Threadlocal 变量 存储当前持有锁的计数。原创 2023-04-16 14:46:45 · 430 阅读 · 0 评论 -
Redis--哨兵实现原理
哨兵实现原理一个哨兵进程启动时会读取配置文件的内容,通过如下的配置找出需要监控的主数据库:sentinel monitor master-name ip redis-port quorummaster-name:主数据库名字(由大小写字母、数字和. - _组成),考虑到故障恢复后当前监控的主数据库地址和端口会产生变化,所以哨兵提供了命令可以通过名字获取当前系统的主数据库的地址和端口号;...原创 2020-04-24 17:26:02 · 286 阅读 · 0 评论 -
Redis--集群搭建
集群概述redis是一个开源的key value存储系统,受到了广大互联网公司的青睐。redis3.0版本之前只支持单例模式,在3.0版本及以后才支持集群,我这里用的是redis3.0.0版本;redis集群采用P2P模式,是完全去中心化的,不存在中心节点或者代理节点;redis集群是没有统一的入口的,客户端(client)连接集群的时候连接集群中的任意节点(node)即可,集群内部的节点...转载 2020-02-29 23:53:14 · 209 阅读 · 0 评论 -
Redis--主从复制
Redis主从复制一个Redis服务可以有多个该服务的复制品,这个Redis服务称为Master,其它复制称为Slaves如图中所示,我们将一台Redis服务器作主库(Matser),其他三台作为从库(Slave),主库只负责写数据,每次有数据更新都将更新的数据同步到它所有的从库,而从库只负责读数据。这样一来,就有了两个好处:读写分离,不仅可以提高服务器的负载能力,并且可以根据读请求的规...原创 2020-02-29 11:03:14 · 360 阅读 · 1 评论 -
Redis--配置文件详解
Redis配置文件详解Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程daemonize no当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定pidfile /var/run/redis.pid指定Redis监听端口,默认端口为6379,为什么选用6379作为...原创 2020-02-28 12:09:59 · 226 阅读 · 0 评论 -
SpringBoot--RedisTemplate详解(Hash、Set、ZSet)
Redis的Hash数据结构Redis的散列可以让用户将多个键值对存储到一个Redis键里面。public interface HashOperations<H,HK,HV>HashOperations提供一系列方法操作hash:初始数据://template.opsForHash().put("redisHash","name","tom"); //temp...原创 2020-02-05 13:29:13 · 4668 阅读 · 0 评论 -
SpringBoot--RedisTemplate详解(String,List)
RedisTemplateSpring封装了RedisTemplate对象来对redis进行各种操作,它支持所有的redis原生api。RedisTemplate在Spring代码中的结构如下:org.springframework.data.redis.coreClass RedisTemplate<K,V>java.lang.Object org.springfr...原创 2020-02-05 12:29:29 · 5528 阅读 · 0 评论 -
Redis--两种备份(持久化)方式:RDB和AOF
Redis的两种备份(持久化)方式:RDB和AOF在 Redis 中存在两种方式的备份:一种是快照恢复(RDB),通过快照(snapshotting)实现的,它是备份当前瞬间 Redis 在内存中的数据记录。另一种是只追加文件(Append-Only File,AOF),其作用就是当 Redis 执行写命令后,在一定的条件下将执行过的写命令依次保存在 Redis 的文件中,将来就可以依次执行那...原创 2019-11-15 17:00:40 · 514 阅读 · 0 评论 -
Redis--keys的通用操作
keys的通用操作keys pattern 获取所有与pattern匹配的key,返回所有与该key匹配的keys。 * 表示 任意一个或多个字符,?表示任意一个字符。**del key1 key2… ** 删除指定的keyexists key 判断该key是否存在,1代表存在,0代表不存在rename key newkey 为当前的key重命名expire k...原创 2019-11-15 15:46:22 · 309 阅读 · 0 评论 -
Redis--watch命令——监控事务
Redis watch命令——监控事务在 Redis 中使用 watch 命令可以决定事务是执行还是回滚。一般而言,可以在 multi 命令之前使用 watch 命令监控某些键值对,然后使用 multi 命令开启事务,执行各类对数据结构进行操作的命令,这个时候这些命令就会进入队列。当 Redis 使用 exec 命令执行事务的时候,它首先会去比对被 watch 命令所监控的键值对,如果没有发生...原创 2019-11-15 15:30:18 · 1341 阅读 · 0 评论 -
Redis--事务回滚
Redis事务回滚对于 Redis 而言,不单单需要注意其事务处理的过程,其回滚的能力也和数据库不太一样,这也是需要特别注意的一个问题——Redis 事务遇到的命令格式正确而数据类型不符合,如图 1 所示。从图 1 中可知,我们将 key1 设置为字符串,而使用命令 incr 对其自增,但是命令只会进入事务队列,而没有被执行,所以它不会有任何的错误发生,而是等待 exec 命令的执行。当 ...原创 2019-11-15 15:22:37 · 5100 阅读 · 1 评论 -
Redis--基础事务和常用操作
Redis的基础事务和常用操作和其他大部分的 NoSQL 不同,Redis 是存在事务的,尽管它没有数据库那么强大,但是它还是很有用的,尤其是在那些需要高并发的网站当中。使用 Redis 读/写数据要比数据库快得多,如果使用 Redis 事务在某种场合下去替代数据库事务,则可以在保证数据一致性的同时,大幅度提高数据读/写的响应速度。细心的读者也许可以发现笔者一直都很强调性能,因为互联网和传统...原创 2019-11-15 12:46:58 · 352 阅读 · 0 评论 -
Redis--HyperLogLog常用命令
Redis HyperLogLog常用命令基数是一种算法。举个例子,一本英文著作由数百万个单词组成,你的内存却不足以存储它们,那么我们先分析一下业务。英文单词本身是有限的,在这本书的几百万个单词中有许许多多重复单词,扣去重复的单词,这本书中也就是几千到一万多个单词而已,那么内存就足够存储它们了。比如数字集合 {1,2,5,7,9,1,5,9} 的基数集合为 {1,2,5,7,9} 那么基数(...原创 2019-11-15 10:55:02 · 283 阅读 · 0 评论 -
Redis--有序集合(sorted set)串数据结构和常用命令
有序集合(sorted set)串数据结构和常用命令有序集合和集合类似,只是说它是有序的,和无序集合的主要区别在于每一个元素除了值之外,它还会多一个分数。分数是一个浮点数,在 Java 中是使用双精度表示的,根据分数,Redis 就可以支持对分数从小到大或者从大到小的排序。这里和无序集合一样,对于每一个元素都是唯一的,但是对于不同元素而言,它的分数可以一样。元素也是 String 数据类型,也...原创 2019-11-14 18:31:56 · 427 阅读 · 0 评论 -
Redis--集合数据结构和常用命令
Redis集合数据结构和常用命令Redis 的集合不是一个线性结构,而是一个哈希表结构,它的内部会根据 hash 分子来存储和查找数据,理论上一个集合可以存储 2 的 32 次方减 1 个节点(大约 42 亿)个元素,因为采用哈希表结构,所以对于 Redis 集合的插入、删除和查找的复杂度都是 0(1),只是我们需要注意 3 点。对于集合而言,它的每一个元素都是不能重复的,当插入相同记录的时候...原创 2019-11-14 18:03:52 · 430 阅读 · 0 评论 -
Redis--哈希数据结构(Hash)和常用命令
Redis哈希数据结构和常用命令Redis 中哈希结构就如同 Java 的 map 一样,一个对象里面有许多键值对,它是特别适合存储对象的,如果内存足够大,那么一个 Redis 的 hash 结构可以存储 2 的 32 次方减 1 个键值对(40 多亿)。一般而言,不会使用到那么大的一个键值对,所以我们认为 Redis 可以存储很多的键值对。在 Redis 中,hash 是一个 String ...原创 2019-11-14 16:30:39 · 809 阅读 · 0 评论 -
Redis--链表(linked-list)数据结构和常用命令
Redis链表(linked-list)数据结构和常用命令链表结构是 Redis 中一个常用的结构,它可以存储多个字符串,而且它是有序的,能够存储 2 的 32 次方减 1 个节点(超过 40 亿个节点)。Redis 链表是双向的,因此即可以从左到右,也可以从右到左遍历它存储的节点,链表结构如图 1 所示。由于是双向链表,所以只能够从左到右,或者从右到左地访问和操作链表里面的数据节点。但是...原创 2019-11-14 11:49:46 · 647 阅读 · 0 评论 -
Redis--字符串数据结构和常用命令
Redis字符串数据结构和常用命令字符串是 Redis 最基本的数据结构,它将以一个键和一个值存储于 Redis 内部,它犹如 Java 的 Map 结构,让 Redis 通过键去找到值。Redis 字符串的数据结构如图 1 所示。Redis 会通过 key 去找到对应的字符串,比如通过 key1 找到 value1,又如在 Java 互联网中,假设产品的编号为 0001,只要设置 key 为...原创 2019-11-14 11:01:23 · 469 阅读 · 0 评论 -
Redis--6种数据类型
Redis的6种数据类型Redis 是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用 key 作为索引找到当前缓存的数据,并且返回给程序调用者。当前的 Redis 支持 6 种数据类型,它们分别是:字符串(String)列表(List)集合(set)哈希结构(hash)有序集合(zset)基数(HyperLogLog)使用 Re...原创 2019-11-14 10:39:16 · 509 阅读 · 0 评论 -
Redis--在Java Web中的应用
Redis在Java Web中的应用一般而言 Redis 在 Java Web 应用中存在两个主要的场景,一个是缓存常用的数据,另一个是在需要高速读/写的场合使用它快速读/写,比如一些需要进行商品抢购和抢红包的场合。由于在高并发的情况下,需要对数据进行高速读/写的场景,一个最为核心的问题是数据一致性和访问控制。缓存在对数据库的读/写操作中,现实的情况是读操作的次数远超写操作,一般是 1:9...原创 2019-11-13 23:45:15 · 375 阅读 · 0 评论 -
NoSQL概述、NoSQL数据库的分类、主流产品及特点
什么是NoSQLNoSQL(NoSQL = Not Only SQL),即“不仅仅是SQL”,是一项全新的数据库理念,泛指非关系型数据库。为什么需要NoSQL随着互联网web2.0网站的兴起,非关系型的数据库现在成了一个极其热门的新领域,非关系数据库产品的发展非常迅速。而传统的关系数据库在应付web2.0 网站,特别是超大规模和高并发的SNS类型的web2.0 纯动态网站已经显得力不从心,暴...原创 2019-10-04 22:28:51 · 4864 阅读 · 0 评论