![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Redis
小宇学编程
低调求发展,潜心学golang
展开
-
redis基础
redis:远程字典服务器中文文档:www.redis.cn三个特点:redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用redis不仅仅支持简单的key-value类型的数据,同时还提供string,list,set,zset,hash,等数据结构的存储redis支持数据的备份,即master-slave模式的数据备份redis索引都是从零...原创 2019-07-21 21:26:25 · 170 阅读 · 0 评论 -
PubSub
消息多播 消息多播允许生产者生产一次消息,中间件负责将消息复制到多个消息队列,每个消息队列由相应的消费组进行消费。它是分布式系统常用的一种解耦方式,用于将多个消费组的逻辑进行拆分。支持了消息多播,多个消费组的逻辑就可以放到不同的子系统中。PubSub 支持消息多播,这个模块的名字叫着 PubSub,也就是 PublisherSubscriber,发布者订阅者模型。 Redis PubSub 的生产者和消费者是不同的连接,使用了两个 Redis 的连接。这是必须的,因为 Redis 不允许原创 2020-06-14 17:14:11 · 374 阅读 · 0 评论 -
管道
Redis 管道 (Pipeline) 本身并不是 Redis 服务器直接提供的技术,这个技术本质上是由客户端提供的,跟服务器没有什么直接的关系。本质:两个连续的写操作和两个连续的读操作总共只会花费一次网络来回,就好比连续的 write 操作合并了,连续的 read 操作也合并了一样。这便是管道操作的本质,服务器根本没有任何区别对待,还是收到一条消息,执行一条消息,回复一条消息的正常的流程。客户端通过对管道中的指令列表改变读写顺序就可以大幅节省 IO 时间。管道中指令越多,效果越好。 对原创 2020-06-14 17:13:29 · 155 阅读 · 0 评论 -
redis持久化
Redis 的持久化机制有两种,第一种是快照,第二种是 AOF 日志。 快照是一次全量备份,AOF 日志是连续的增量备份。快照是内存数据的二进制序列化形式,在存储上非常紧凑,而 AOF 日志记录的是内存数据修改的指令记录文本。AOF 日志在长期的运行过程中会变的无比庞大,数据库重启时需要加载 AOF 日志进行指令重放,这个时间就会无比漫长。所以需要定期进行 AOF 重写,给 AOF 日志进行瘦身。快照原理多进程 Redis 在持久化时会调用 glibc 的函数fork产生一个子进程,快照持久原创 2020-06-14 17:11:30 · 125 阅读 · 0 评论 -
线程 IO 模型
一、Redis 单线程为什么还能这么快? 因为它所有的数据都在内存中,所有的运算都是内存级别的运算。正因为 Redis 是单线程,所以要小心使用 Redis 指令,对于那些时间复杂度为 O(n) 级别的指令,一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。Redis 单线程如何处理那么多的并发客户端连接? 多路复用二、非阻塞 IO 当我们调用套接字的读写方法,默认它们是阻塞的,比如read方法要传递进去一个参数n,表示最多读取这么多字节后再返回,如果一个字节都没有,那么线程就会原创 2020-06-14 17:09:36 · 201 阅读 · 0 评论 -
Scan
**keys:**Redis 提供了一个简单暴力的指令 keys 用来列出所有满足特定正则字符串规则的 key。127.0.0.1:6379> set codehole1 aOK127.0.0.1:6379> set codehole2 bOK127.0.0.1:6379> set codehole3 cOK127.0.0.1:6379> set code1hole aOK127.0.0.1:6379> set code2hole bOK127.0.0.1原创 2020-06-14 17:07:26 · 391 阅读 · 0 评论 -
GeoHash简单介绍
意味着我们可以使用 Redis 来实现摩拜单车「附近的 Mobike」、美团和饿了么「附近的餐馆」这样的功能GeoHash 算法将二维的经纬度数据映射到一维的整数,这样所有的元素都将在挂载到一条线上,距离靠近的二维坐标映射到一维后的点之间距离也会很接近。它的内部结构实际上只是一个 zset(skiplist)。通过 zset 的 score 排序就可以得到坐标附近的其它元素 (实际情况要复杂一些,不过这样理解足够了),通过将 score 还原成坐标值就可以得到元素的原始坐标。...原创 2020-06-14 17:03:41 · 252 阅读 · 0 评论 -
限流
简单限流如何限定用户的某个行为在指定的时间里只能允许发生 N 次?eg:一分钟内只允许最多回复 5 个帖子。整体思路就是:每一个行为到来时,都维护一次时间窗口。将时间窗口外的记录全部清理掉,只保留窗口内的记录。zset 集合中只有 score 值非常重要,value 值没有特别的意义,只需要保证它是唯一的就可以了。(设置 zset 过期时间,避免冷用户持续占用内存)漏斗限流Redis 4.0 提供了一个限流 Redis 模块,它叫 redis-cell。该模块也使用了漏斗算法,并提供了原子的限流指令原创 2020-06-14 17:02:37 · 142 阅读 · 0 评论 -
布隆过滤器
set 中会存储每个元素的内容,而布隆过滤器仅仅存储元素的指纹。概念:布隆过滤器可以理解为一个不怎么精确的 set 结构,当你判断某个对象是否存在时,它可能会误判。(只会误判那些没见过的元素)基本使用:布隆过滤器有二个基本指令,bf.add 添加元素,bf.exists 查询元素是否存在,它的用法和 set 集合的 sadd 和 sismember 差不多。注意 bf.add 只能一次添加一个元素,如果想要一次添加多个,就需要用到 bf.madd 指令。同样如果需要一次查询多个元素是否存在,就需要用到原创 2020-06-07 22:46:16 · 291 阅读 · 0 评论 -
HyperLogLog
PV、UV、IP概念:PV:访问量,网站的点击量或者浏览量,用户每打开一次页面就加1,刷新也加1UV:独立访客的意思,访问网站的一台设备是一个访客,网站判断是否为同一台电脑,主要是通过cookie的方式实现IP:独立IP数,统计有多少个ip访问了网站HyperLogLog 数据结构是 Redis 的高级数据结构需要占据一定 12k 的存储空间,标准误差是 0.81%使用场景:不适合统计单个用户相关的数据。如果你的用户上亿,可以算算,这个空间成本是非常惊人的。但是相比 set 存储方案,Hype原创 2020-06-07 22:44:30 · 192 阅读 · 0 评论 -
位图
场景:会有一些 bool 型数据需要存取,比如用户一年的签到记录,签了是 1,没签是 0,要记录 365 天。如果使用普通的 key/value,每个用户要记录 365 个,当用户上亿的时候,需要的存储空间是惊人的。Redis 提供了位图数据结构,这样每天的签到记录只占据一个位,365 天就是 365 个位,46 个字节 (一个稍长一点的字符串) 就可以完全容纳下,这就大大节约了存储空间。常用命令:setbit、getbitbitcount:统计指定位置范围内 1 的个数bitpos:查找指定范围原创 2020-06-07 22:40:06 · 135 阅读 · 0 评论 -
延时队列
异步消息队列:Redis 的 list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用lpop 和 rpop来出队列。队列空了怎么办?1.客户端就会陷入 pop 的死循环,可以sleep 1秒。2.使用阻塞读:阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。消息的延迟几乎为零。用blpop/brpop替代前面的lpop/rpop注意:闲置过久,服务器一般会主动断开连接,减少闲置资源占用。注意异常捕获。延时队列:通过 Redis原创 2020-06-07 22:38:15 · 186 阅读 · 0 评论 -
分布式锁
场景:一个操作要修改用户的状态,修改状态需要先读出用户的状态,在内存里进行修改,改完了再存回去。如果这样的操作同时进行了,就会出现并发问题,因为读取和保存状态这两个操作不是原子的。setnx(数据存在则返回错误) > expire(设置过期时间) > 解锁(删除数据)缺点:在 setnx 和 expire 之间服务器进程突然挂掉了,就会导致 expire 得不到执行,也会造成死锁进化:Redis 2.8 版本中作者加入了 set 指令的扩展参数,使得 setnx 和 expire 指令可以原创 2020-06-07 22:35:17 · 127 阅读 · 0 评论