文档章节

Redis原理介绍

沉淀岁月
 沉淀岁月
发布于 2016/09/08 08:19
字数 1427
阅读 36
收藏 2

 

Redis是一个基于key-value的高速缓存系统,类似于memcached,但是支持更复杂的数据结构List、Set、SortedSet,并且有持久化的功能。

由于近期工作很多地方都用到了它,所以花了不少时间来阅读文章、编码实验,了解一下Redis都能做些什么,能有什么样的性能表现。

首先遇到的第一个问题就是,Redis究竟是什么?

这个问题看似可笑,其实不然,我很赞同Timyang的观点,架构者对Redis的理解不同、定位也不同,决定了Redis在整个系统结构中会扮演什么样的角色。我总结一下,主流有3种理解:

1.key value store.是一个以key-value形式存储的数据库,定位直指MySQL,用来作为唯一的存储系统。

2.memory cache.是一个把数据存储在内存中的高速缓存,用来在应用和数据库间提供缓冲,替代memcachd。

3.data structrue server.把它支持对复杂数据结构的高速操作作为卖点,提供某些特殊业务场景的计算和展现需求。比如排行榜应用,Top 10之类的。

目前更多的人还是把它定位为一个memcached的升级版,提供更多的数据结构操作,仍然是一个cache。

传统的memcached在类似于SNS社区这样的业务场景下,有一些弊端。比如存储好友关系,不得不使用特殊字符分隔的长字符串来保存。在好友关系没有上限的业务需求下,操作性能低下,达不到缓存系统应有的性能水平。而且从数据库中的关系型结构映射到cache中的长字符串形式,很明显也是架构中很蹩脚的一个环节。

而Redis提供的List、Set和Sorted Set就可以很好的业务模型映射到相应的数据结构上,契合度很高。按我的理解,关系数据库理论几乎可以照搬到Redis的应用中来。

Redis官方教程中的仿Twitter案例就是一个非常好的入手点。用Set结构来存储follower和following,用List结构来保存每个人的所有post,再加上一些普通的key-value来存储用户基本信息,很直观和清晰。

我再来举一个好友关系的业务场景来描述一下我的理解,标准关系型数据库结构是怎么和Redis存储结构实现一一映射的。

数据库中有3张表:

1.用户表有两列:id、昵称

2.好友关系表有列:用户id、好友id、好友所属分组id、好友备注、添加好友时间

3.分组表:分组id、分组名称、所属用户id

增加、删除一个好友,就是在好友关系表里insert或delete一条记录。

获取某用户的所有好友分组,及分组内的好友数:

1

2

3

4

5

select g.gid, g.gname, count(f.fuid)

from groups g left join friends f

on g.gid=f.gid

where g.uid=#uid#

group by g.gid, g.gname

获取某用户某分组下的好友列表:

1

2

3

4

5

6

select f.fuid, u.nickname, f.remark, f.time

from friends f left join users u

on f.fuid=u.id

where f.uid=#uid# and f.gid=#gid#

order by f.time

limit #start#, #count#

再来看看Redis如何实现类似的业务场景。

用户昵称:uid:xxxxx:nickname,以String结构存储,相当于user表

分组名称:gid:yyyyy:gname,以String结构存储

用户所有分组:uid:xxxxx:groups,以Set结构存储gid的集合

分组下好友:gid:yyyyy:friends,以Set结构存储,保存fuid的集合

好友:uid:xxxxx:fuid:zzzzz:gid、uid:xxxxx:fuid:zzzzz:remark、uid:xxxxx:fuid:zzzzz:time各自使用String结构存储,相当于friends表的每个字段

添加一个好友需要把uid:xxxxx:fuid:zzzzz:gid、uid:xxxxx:fuid:zzzzz:remark、uid:xxxxx:fuid:zzzzz:time这三个字段set好,再sadd gid:yyyyy:friends zzzzz,把好友加到这个组的集合内

获取某用户的所有好友分组,及分组内的好友数,需要用smembers获取uid:xxxxx:groups集合中的gid,再用这些gid来分别scard gid:yyyyy:friends获取该分组下有多少好友。

获取用户123456在分组1001下的好友列表:

1

2

3

4

5

6

7

sort gid:1001:friends

by uid:123456:fuid:*:time

limit 0 10

get #

get uid:*:nickname

get uid:123456:fuid:*:remark

get uid:123456:fuid:*:time

很有意思是不是,很像sql语句,key中的*符号是个占位符,可以被sort出的结果替换,进而get到动态key里面的value。

我们可以总结一下,传统的关系型数据库,处理一对多的问题,需要把外键放在多的一端,因为RDBMS理论中没有集合这个直接概念。而使用Redis,我们可以很直觉的在一的一端来管理一对多的关系,使用Set。

这只是使用上的区别,而理论上,RDBMS的理论完全可以套用在Redis上,所有用关系型数据库理论可以描述的结构,用Redis的数据结构,都可以实现

最关键的是,如果使用MySQL,当数据规模非常大时,上面两个查询操作都需要借助表关联技术,而大表间的join在大型系统中是需要极力避免的操作。相反Redis的每个操作都会局限在一个较小的数据集范围内,而且key-value的存储形式,定位key只是一个复杂度为O(1)的操作。在very huge的数据量下,Redis性能效果非常优异,这就是NoSQL的优势所在!

本文转载自:​http://blog.sina.com.cn/s/blog_5a15b7d10101gizu.html

沉淀岁月
粉丝 27
博文 257
码字总数 91615
作品 0
朝阳
高级程序员
私信 提问
Redis 学习路线

学习和使用 Redis 一般可以分为以下四个阶段: 初学者入门 进阶实战 理解原理 贡献和开发 本文接下来将在四个小节里面分别对这四个阶段进行介绍。 初学者入门 如果你只是对 Redis 感兴趣, ...

JackFace
2016/06/17
80
0
《Redis设计与实现(第二版)》

《Redis 设计与实现》一书全面而完整地讲解了 Redis 的内部运行机制, 对 Redis 的大多数单机功能以及所有多机功能的实现原理进行了介绍, 展示了这些功能的核心数据结构以及关键的算法思想。...

ddddd8
2017/12/21
0
0
Java程序员从阿里面试回来,这些面试题你们会吗?

前不久刚从阿里面试回来,为了这场面试可以说准备了一个半月,做的准备就是刷题和看视频看书充实自己的技术,话说是真难啊,不过还算顺利拿到了offer,有很多面试题我已经记不起来了,这些是...

java填坑路
01/04
0
0
Java程序员从阿里拿到offer回来,这些面试题你会吗?

前不久刚从阿里面试回来,为了这场面试可以说准备了一个半月,做的准备就是刷题和看视频看书充实自己的技术,话说是真难啊,不过还算顺利拿到了offer,有很多面试题我已经记不起来了,这些是...

Ala6
2018/11/21
45
0
Redis压缩列表原理与应用分析

摘要 Redis是一款著名的key-value内存数据库软件,同时也是一款卓越的数据结构服务软件。它支持字符串、列表、哈希表、集合、有序集合五种数据结构类型,同时每种数据结构类型针对不同的应用...

Float_Luuu
2016/07/20
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

前嗅教程:如何获取精准客源,提高销量

经常有人问嗅嗅,我是XX行业的,大数据能帮我做什么? • 可以给我带来客源吗? • 可以提高我的销量吗? • 可以增加我的利润吗? 今天嗅嗅就以生鲜供货为例,为大家讲一讲外卖平台那些事~...

forespider
27分钟前
1
0
浮窗插件

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>移动窗口</title> <style> body { margin: 0; padding: 0; width: 100%; height: 1000px; background: #eee; } /*示......

流年那么伤
31分钟前
2
0
关于 Jenkins master 共享 JENKINS_HOME 目录的实验

本文首发于:Jenkins 中文社区 作者:翟志军 审校:王冬辉,linuxsuren Jenkins master 的高可用是个老大难的问题。和很多人一样,笔者也想过两个 Jenkins master 共享同一个 JENKINS_HOME 的...

Jenkins中文社区
39分钟前
3
0
【重构】Spring Cloud OAuth 无Token调用源码封装

背景 重构-改善既有代码的设计,重构的目的是是软件更容易被理解和修改。 书接上回Spring Security OAuth 微服务内部Token传递的源码解析,本篇主要无token 调用过程中,代码的不断完善及其重...

冷冷gg
45分钟前
26
0
watchOS更新后 Apple Watch 4心电图功能已开始支持欧洲用户

苹果在发布 Apple Watch 4 系列时也发布了 ECG(心电图)功能,但这项功能仅适用于在美版 Apple Watch。对于其他地区的用户来说,访问该功能的唯一途径是在美国购买该设备。不过当 watchOS ...

linuxCool
54分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部