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 学习笔记:事务

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

Golang redigo 使用笔记 (二):并发处理和连接池

一、并发问题 在 redigo 官方的文档描述中,Receive() 方法是不支持多并发的,原文为:

而 Do() 方法是间接调用了 Receive() 方法,所以 Do() 方法也是不支持多并发的。我们可以用一段代码来验证这一点: [crayon-6 ... 阅读更多

Redis 中的集合类型

一、概念和原理

集合是 redis 中的基本数据类型之一,redis 中的集合可以用来存储一堆无序的元素,集合内的元素不会重复,只有存在或者不存在两种属性。

redis 集合内部是由 intsethashtable 实现的,当条件不满足时 redis 会自动转换内部编码。集合中使用 intset 的条件:

  1. 集合的所有的元素都是整数
  2. 集合中元素的个数不超过 512 个

一旦两者的任一条件不满足时,就会转换成 hashtable 编码。

阅读更多