redis 中的 AOF 持久化和 RDB 持久化

一、 AOF 持久化 1.1 实现机制 AOF(Append Only File) 是 redis 持久化方式的一种,它通过把所有 redis 执行过的命令都写入到文件来维持持久化。一旦服务崩溃,则可以重放这些命令来恢复服务数据。 例如,在 redis 上执行下面 2 条语句: [crayon-694915431ba6f ... 阅读更多

redis 中的键值淘汰策略

当使用的内存到达上限后,redis 提供了 6 种策略来淘汰键值: 策略 描述 volatile-lru 在所有设置了过期时间的键值中根据 LRU 算法淘汰最近最少使用的 allkeys-lru 对数据库中所有元素根据 LRU 算法淘汰最近最少使用的 volatile-random 从设置了过期时间的元素中随机淘 ... 阅读更多

redis 源码分析:链表实现

一、链表定义 链表在 redis 中的使用十分广泛,例如列表的底层实现之一就是链表,包括发布、订阅等等功能都是有用到链表的。 redis 中链表在 adlist.h 和 adlist.c 中实现,只用了 300+行代码,十分简单。 redis 中的链表是一个双向不循环的链表,两个核心的数据结构是 listNode 和 lis ... 阅读更多

redis 中的发布和订阅

一、发布和订阅

除了任务队列以外,redis 还有一种基于 「发布/订阅」 模式的消息传递,使得客户端可以订阅某个频道,当频道有消息产生时,会把消息传递到所有的订阅者。和列表不一样的是,发布和订阅可以是一对多的关系,即同一个消息可以同时传递到多个客户端 (订阅者) 。而列表只能允许一个客户端接收一个消息。

订阅和退订的命令是 PUBLISH/SUBSCRIBEPUBLISH 是向频道发送消息,SUBSCRIBE 是订阅频道。

1.1 发布

往指定频道发布消息的操作:

消息发送成功后,将会返回一个整数,表示收到这条消息的订阅者数量,如果没有任何客户端订阅频道,返回 0 。

一个要注意的问题是消息发布后不会被持久化,如果当前没有订阅者订阅频道,后续再订阅也不会收到订阅前的消息。

阅读更多

Redis 小案例 (二):redis 实现消息队列

一、任务队列概述 消息队列,顾名思义就是一个用来传递任务的队列。消息队列在开发中十分常见,经常用在页面后台处理需要很长时间的操作时,例如发送邮件、短信以及进行复杂数据运算操作等,这些操作通常会阻塞页面相当长的时间,为了避免用户等待太久,一般会先给用户页面进行相应,然后在后台使用独立的线程或者进程来处 ... 阅读更多

Redis 小案例 (一):实现网站访问频率限制

网站中经常需要用到网站限流,例如限制用户恶意爬虫获取网页信息以及在网站访问流量大时限制访问频率等等,这里使用 redis 做一个简单的网站登录限制案例。 一、使用 EXPIRE 进行访问频率限制 逻辑:用户登入网页,判断是否为第一次登入,如果是,创建一个新键记录访问次数为 1,并设置超时时间。后面再登入时先判 ... 阅读更多

Redis 设置键值过期时间

一、 expire 和 ttl 命令

1.1 基本用法

Redis 中的 EXPIER 命令可以给键值设置过期时间,相关的命令及其格式为:

两个命令分别表示设置秒级和毫秒级别的过期时间,到期之后系统会自动删除该键。

EXPIRE 命令返回 1 表示设置过期时间成功,返回 0 表示键不存在或者设置失败。

阅读更多

Redis 学习笔记:事务

一、事务的描述 和 MySQL 一样,Redis 中也有事务这一个概念,redis 中的事务也是可以用来执行一组命令的集合,同时也可以把事务当作一个命令。因为它的特性和命令无差,要么正确全部运行,要么错误都不运行。但是和 MySQL 的事务不同的是,redis 中的事务不支持回滚操作。也就是说,一旦事务出错,它没 ... 阅读更多

Redis 中的有序集合类型

一、基本操作

有序集合也是集合的一种,顾名思义,它和集合的不同之处在于它是有序的 ,而集合无序。它通过给集合中每一个元素都关联一个分数来是的元素有序,同时提供了多个方式获取排序之后的元素。

1.1 增加和删除元素

增加元素:

当 key 不存在时自动创建,分数支持整数和双精度浮点数,同时还可以使用+inf-inf 分别表示正无穷大和负无穷大。执行成功返回添加的元素个数。

删除元素:

移除元素,返回成功移除的个数。

阅读更多