周五上班的主要任务是在公司老平台上用redis处理一个队列问题,顺便复习了一下redis操作的基础知识,回来后就想着在自己的博客demo里,用redis来优化一些使用场景,学习一下golang开发下redis的使用。
Redis简单介绍
简介
关于Redis的讨论,其实在现在的后台开发中已经是个老生常谈的问题,基本上也是后端开发面试的基本考察点。其中 Redis的背景介绍和细节说明在这里就不赘述。不管怎么介绍,核心在于Redis是一个基于内存的key-value的多数据结构存储,并可以提供持久化服务。基于内存的特性决定了Redis天然适合高并发的数据读写缓存优化,同时也带来了内存开销过大的问题。所以在一些特定情景下,Redis是一把无往不利的大杀器,值得深入学习。
学习Redis的一个难点或者说入门点,我个人感觉在于对象存储理念的转变。刚接触 Redis 时,我刚从大学毕业,脑子里基本都是关系型数据存储的理念,使用时总想着靠数据内的关系来建立数据之间的联系,用起来很不顺手。后来慢慢入门了才感受到了一些操作的好处。举个栗子,比如查询用户在某个文章下的评论,用 sql 的思路就是搜索评论表里面用户ID和文章ID匹配的数据,有时还需要联合查询出其他信息,但是如果是 Redis 操作,以'前缀:文章ID:用户ID'为key,比如'comment:666:888'就可以快速取出用户评论,十分方便。 Redis 的强大远不仅如此,可以在实践中慢慢体会。
主要数据结构
Redis主要有五种基本数据结构,满足了绝大多数缓存结构的需要,如果你在使用一种结构存储时感觉别扭时,很有可能是选错了存储结构,可以考虑一下其他结构的正确实现。
-
String ,可以是字符串、整数和浮点数。如果是序列化数据,并涉及到修改操作的话,不推荐用 string ,可以考虑用 Hash
Hash, key-value 对象,可以存放对象数据,比如用户信息之类。
List,有序数据集合,元素可以重复,用
LPUSH 、 LPOP 、 RPUSH 、 RPOP 等指令组合可以实现栈和队列操作。
Set,无序集合,元素唯一。
Sorted Set,Sort的有序版,可以设定 Score 值来决定元素排序,适合用户排名这样的业务场景。
常见使用场景
-
高并发下数据缓存。 比如在某个场景下,大量日志同时写入数据库会给服务器带来巨大压力,这时可以先将数据写入 redis 中,再由 redis 写入数据库,减轻同时写入压力。
热点信息快速显示。假设现在有一个新闻首页,需要快速显示各栏目前20条热点新闻,如果直接查询数据库,在大量用户同时访问下,会消耗极大数量的数据库请求。这时就可以用 redis 来优化,在新闻录入的时候将标题、时间和来源写入 redis 中,客户端访问时,可以从内存中一次性取出当天热单新闻列表,极大地提高请求速度和节约了服务器开销。
保存会话信息。可以将登录后用户信息缓存入 redis 并同时设置 key 过期时间,这样后台 api 过滤请求时,就可以从内存中读取用户信息,而且 redis 的过期机制,天然支持用户身份有效期校验,用起来十分方便。
统计计数。比如系统中常见一个功能是限制同一用户固定时间段内的登录次数或者所有请求次数,这时就可以以用户id为key,次数值为value,将计数信息缓存起来,并且有 INCRBY 命令原生支持。
其他。Redis的应用场景十分广发,队列、发布订阅、统计分析等等,可以看看其他文章的介绍说明。









