文章来源:http://jingyan.baidu.com/article/db55b60996d0124ba30a2f92.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

 ong.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

 onf.fuid=u.id

 where f.uid=#uid#andf.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。

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

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

Redis的概述和简单使用(转载)的更多相关文章

  1. Redis数据库概述

    Redis数据库概述 Redis是什么 redis是一个高性能的key-value存储系统.支持的value类型相对更多,包括string,list,set,zset(sorted set --有序集 ...

  2. 图解Redis之数据结构篇——简单动态字符串SDS

    图解Redis之数据结构篇--简单动态字符串SDS 前言     相信用过Redis的人都知道,Redis提供了一个逻辑上的对象系统构建了一个键值对数据库以供客户端用户使用.这个对象系统包括字符串对象 ...

  3. redis的安装与简单使用

    redis的安装与简单使用: Redis简介: redis的应用场景: 1.关于关系型数据库和nosql数据库 关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据     ...

  4. JAVA中通过Jedis操作Redis连接与插入简单库

    一.简述 JAVA中通过Jedis操作Redis连接与插入简单库 二.依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis ...

  5. redis 哈希数据类型简单操作(实现购物车案例)

    这里不累赘如何安装redis和php  redis扩展,主要熟悉调用redis哈希数据类型 简单方法操作如下 1:hSet 2:hGet 4:hDel 5:hGetAll 4:hExists 5:hI ...

  6. Redis入门--(二)Redis的概述

    1.Redis的由来 创始人觉得Mysql不好用,就自己写了: 国内使用Redis的网站有新浪微博,知乎: 国外GitHub: VMWare也支持redis的开发 2.Redis的概述 官方提供的测试 ...

  7. AJPFX总结正则表达式的概述和简单使用

    正则表达式的概述和简单使用* A:正则表达式        * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用.        * 作用:比如注 ...

  8. redis集群cluster简单设置

    环境: 这里参考官方使用一台服务器:Centos 7  redis-5.0.4    192.168.10.10 redis集群cluster最少要3个主节点,所以本次需要创建6个实例:3个主节点,3 ...

  9. Linux概述及简单命令

    Linux概述及简单命令 转自https://www.cnblogs.com/ayu305/p/Linux_basic.html 一.准备工作 1.环境选择:VMware\阿里云服务器 2.Linux ...

随机推荐

  1. html 的radio单选框如何实现互斥------radio只是input的type属性

    先看看没有互斥的情况: <html> <body> 男性:<input type="radio" id="male" /> ...

  2. Python 爬虫 (五)

    # 头条街拍图片爬取 1 import re import requests from urllib import request import json import os i = 0 header ...

  3. 20145209 2016-2017-2 《Java程序设计》第10周学习总结

    20145209 2016-2017-2 <Java程序设计>第10周学习总结 教材学习内容总结 计算机网络概述 计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physi ...

  4. BZOJ1053_反素数_KEY

    题目传送门 初看这道题,以为是一道挺难的题目,但仔细看发现,不是只要爆搜就好了吗? 只需要对前12个素数进行爆搜即可. 一个数的因数个数=素数次数+1全部乘起来. code: /*********** ...

  5. connect by 语句

    create table tb_menu( id number(10) not null, --主键id titlevarchar2(50), --标题 parent number(10) --par ...

  6. AIX7.1删除大批量文件(百万级、千万级)

    假设/data/test目录下含有数百万上千万的文件需要删除,可以选择的方式如下: 1.如果文件名不包含空白符.引号等特殊字符,则可以使用如下命令: find /data/test -type f | ...

  7. create-react-app react-redux项目 配置模块热更新hmr

    HRM并不是create-react-app专属的,提供一篇博客介绍hrm http://chrisshepherd.me/posts/adding-hot-module-reloading-to-c ...

  8. 怎样通过Qt编写C/C++代码查询当前Linux的版本号?

    遇到一个问题:如题. 我的开发环境是:嵌入式ARM + Linux系统 + Qt 4.5 + C/C++ 现在需要查询 当前Linux系统的版本号. 问题: 1)Qt 4.5 提供怎样的API来获取? ...

  9. vuex -- vue的状态管理模式

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 状态管理模式.集中式存储管理 一听就很高大 ...

  10. 【springmvc+mybatis项目实战】杰信商贸-2.数据库配置

    首先我们来了解项目的架构 我们分别使用了MySql和Oracle数据库,即是异构数据库.我们做到一个平台支持多个数据库.数据库建模我们使用Sybase公司的PowerDesigner(以后简称PD), ...