Redis设计

Posted by Wang Gang on 2019-08-21

前言

  • redis采用key-value的形式对数据进行存储;
  • redis总共分为五种存储模式,(string、hash、list、set、sort set)和一种对key的操作
  • 那么这是一种非关系型数据库,通过这五种存储模式可以实现将非关系数据库设计成关系数据库

1 五种存储模式对应的存储内容;

  • string:用于存储普通数据,int,string等等类型的基本类型数据
  • hash:通常用于存储数据对象类型
  • list:则用于存储一些有序列表
  • set:用于存储无需集合
  • sort set:存储一些后面增加内容后需要排序的集合

2 非关系型数据库

在我们开发的过程中,我们希望把数据存储到sql数据库中,但是sql数据库中就会面临读写压力太大,根本不能满足我们的额需求,我们考虑使用redis作为中间的缓存处理,这就面临这一个问题,mysql是关系型数据库,redis是非关系型数据库,两者要通过什么样的方式去组合;

  • 非关系型数据库的实质:非关系型数据库产品是传统关系型数据库的功能阉割版本,通过减少用不到或很少用的功能,来大幅度提高产品性能。
  • 目前基本上大部分主流的非关系型数据库都是免费的。而比较有名气的关系型数据库,比如Oracle、DB2、MSSQL是收费的。虽然Mysql免费,但它需要做很多工作才能正式用于生产。
  • 实际开发中,有很多业务需求,其实并不需要完整的关系型数据库功能,非关系型数据库的功能就足够使用了。这种情况下,使用性能更高、成本更低的非关系型数据库当然是更明智的选择

3 设计

  • 一对一:在使用sql数据库对象的CRDU操作,尝尝在redis中存储[key:id]作为redis的key,存储于hash表中,比如我一个id为1的user对象就可以设key为[user:1]

  • 一对多:在一对多的情况中,常常采用两种对象分别才用hash方式做存储,单独提出一个list或set用于存储两种对应关系的key,key为一对多中的一,value为set中的多的所有id;比如用户和文章,一个用户可以发出多篇文章,但一篇文章只能属于一个用户,将用户和文章对象分别存储于redis中,在set(无序)或者是list(有序)存储key存储为[user:id]的方式value为文章id组
    这样,就很容易拿到某个用户所有文章,谋篇文章是否属于某一个用户,ps:如果是要通过文章去查用户,在文章对象中就可以拿到

  • 多对多:和一对多方式类似,多对多只是需要列出两个类型的set或者list,例如文章和标签,一个文章可以有多个标签,一个标签有多篇文章,分别用key,value存储文章id 标签id

  • sort set的使用:通常我们在某一个已经存在的数据中要增加一条数据,减少一条数据,我们就采用sort set的方式存储数据
    在存储过程中给定一个权值(score),当某一个数据要往前排,或者玩后排,只需要更改这个值得权值,就可以实现

redis基本命令操作