Redis原理介绍
来源:互联网 发布:鬼吹灯故事解析 知乎 编辑:程序博客网 时间:2024/06/05 14:24
原文链接:http://blog.sina.com.cn/s/blog_5a15b7d10101gizu.html
Redis是一个基于key-value的高速缓存系统,类似于memcached,但是支持更复杂的数据结构List、Set、Sorted Set,并且有持久化的功能。
由于近期工作很多地方都用到了它,所以花了不少时间来阅读文章、编码实验,了解一下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一条记录。
获取某用户的所有好友分组,及分组内的好友数:
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
获取某用户某分组下的好友列表:
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下的好友列表:
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。
这只是使用上的
- Redis原理介绍
- Redis原理介绍
- Redis原理介绍
- Redis原理介绍
- Redis Cluster原理介绍和部署实战
- redis原理介绍、持久化机制和常用内存优化
- redis原理
- redis原理
- redis 原理
- redis原理
- Redis原理
- Redis原理
- redis介绍
- redis 介绍
- redis 介绍
- redis介绍
- Redis介绍
- Redis介绍
- 求集合的所有子集
- java 生成pdf文件
- 线上服务内存OOM问题定位三板斧
- Intellij IDEA入门到精通(一)课程发布了
- Wait函数详解
- Redis原理介绍
- es6链接
- jquery confirm3
- JAVA Map转List
- 求最长不下降序列
- 《C++ Primer》第五版课后习题解答_第二章(3)(21-29)
- ActoiveMQ主备环境搭建
- UVa1605 例题8-2 联合国大楼(Building for UN,ACM/ICPC NEERC 2007)
- 【stm32f103】USART RX实现(寄存器版)