zoukankan      html  css  js  c++  java
  • .NET中使用Redis(二)

    很久以前写了一篇文章 .NET中使用Redis 介绍了如何安装Redis服务端,以及如何在.NET中调用Redis读取数据。本文简单介绍如何设计NoSQL数据库,以及如何使用Redis来存储对象。

    和传统的关系型数据库不同,NoSQL大部分都是以键值对存储在内存中的,我们不能直接把RDBMS里面的一些做法直接移植到NoSQL中来,一个最主要的原因是,在NoSQL中缺少RDBMS中的一些诸如join ,union以及一些在关系型数据库中效率很高的执行语句,这些在NoSQL不能很好的支持,或者说效率低。

    下文首先通过例子介绍在SQLServer中设计一个DB系统以及与NoSQL环境中设计一个DB的区别,最后演示如何在Redis中对数据进行读写操作。

    一个简单的博客系统

    假设我们要设计一个简单的博客系统,用户可以注册一个博客(Blog),然后可以在上面写文章(Post),文章可以分类(Category)以及添加标签(Tag),用户可以对文章进行评论(Comment)。

    在该系统中,我们需要实现,如下基本功能:

    • 首页:显示所有人的博客
    • 首页:显示最近的所有发表的文章
    • 首页:显示所有的最近的评论
    • 首页:显示博客的标签云
    • 首页:显示所有的分类
    • 文章页面:显示文章以及所有的评论
    • 文章页面:添加评论
    • 标签页面:显示所有标签以及标签对应的文章
    • 分类页面:显示所有分类以及分类对应的文章

    如果在SQLServer中,相信很简单就可以设计出这样一个DB了。

    在NoSQL环境中,我们不能直接将上面的结构搬进来,所以需要根据需求重新设计我们的模型。

    定义实体

    在NoSQL环境下,所有的数据其实都是以key和value的形式存储在内存中的,value通常是序列化为字符串保存的。我们使用redis客户端的时候,可以直接将对象存储,这些客户端在内部实现上帮助我们进行了序列化。所以第一步就是需要定义实体模型:

    首先来看User实体:

    User实体中,包含了用户的Id,Name以及博客的Id。

    然后Blog实体:

    包含了标签Tag,以及文章Id列表。

    文章BolgPost实体:

    包含了一篇文章的基本信息,如文章分类,文章标签,文章的评论。

    最后看评论BlogPostComment实体:

    具体实现

    实体定义好了之后,我们就可以开始具体实现了。为了演示,这里通过单元测试的方式实现具体功能:

    首先要把Redis的服务端启动起来,然后在工程中新建一个Redis客户端,之后的所有操作都通过这个客户端进行。

    在单元测试的SetUp中,我们插入一些模拟数据,插入数据的方法为InsetTestData方法:

    在方法中,首先在Redis中创建了三个强类型的IRedisTypedClient类型的对象redisUsers,redisBlogs,redisBlogPosts来保存用户信息,博客信息,和文字信息。

    在新建用户的时候,因为Id是自增字段,所以直接调用redisUsers这个client的GetNextSequence()方法就可以获得一个自增的Id。

    创建完用户之后,接着创建博客信息:

    该博客有几个标签。

    在接着创建该博客上发表的若干篇文章:

    每一篇文章都有分类和标签,以及评论。

    然后需要给user的BlogsIds和blog的BlogPostIds赋值

    最后需要把这些信息保存到redis中。

    现在,利用Redis Desktop Manager,可以查看Reidis中存储的数据:

    数据准备好了之后,可以实现前面列出的一系列方法了:

    显示所有博客

    该方法在GetAllBlogs中,实现如下:

    只需要调用GetAll方法即可获取内存中的所有指定类型的对象。

    输出结果为:

    显示最近发表的文章和评论

    实现如下:

    方法中定义了两个key为urn:BlogPost:RecentPosts 和 urn:BlogPostComment:RecentComments的 List对象来保存最近发表的文章和评论:recentPosts.Prepend(newBlogPost)方法表示将新创建的文章插到recentPosts列表的最前面。

    Trim方法表示仅保留n个在集合中。

    显示博客的标签云

    显示博客的标签云方法如下:

    显示标签云的实现,用到了redis中的SortedSet,IncrementItemInSortedSet表示如果有相同的话,值加一,GetRangeWithScoresFromSortedSetDesc方法,获取某一key的前5个对象。

    显示所有的分类

    显示所有的分类用到了Set对象。

    显示文章以及其评论

    实现如下:

    只需要把postId传进去就可以通过GetById的方法获取内存中的对象.

    添加评论

    首先根据PostId获取BlogPost,然后在Comment属性中添加一个BlogPostComment对象,然后在保存改BlogPost.

    显示分类以及分类对应的文章

    这里首先把所有的文章按照标签新建Set,把相同的分类的文章放到一个Set中,最后根据key即可查找到相应的集合。

    总结

    本文利用一个简单的博客系统,简要介绍了如何利用Redis存储和获取复杂的数据。由于本文主要为了演示如何与Redis进行交互,所以实体设计的很简陋,没有按照DDD的思想进行设计,在某些设计方面没有遵循前文浅谈依赖注入中使用的原理和方法,后面会写文章对该系统进行重构以使之更加完善。

    希望本文对您了解如何利用Redis存储复杂对象有所帮助。

    参考资料

    1. Designing NoSql Database
    2. Migrations Using Schemaless NoSql
    3. That No SQL Thing: The relational modeling anti pattern in document databases
  • 相关阅读:
    【Hadoop报错】The directory item limit is exceeded: limit=1048576 items=1048576
    【Error】mysql的error.log中ranges: 268 max_threads: 4 split: 268 depth: 2是什么意思?
    【Hadoop】Hadoop集群组件默认端口
    【Python】用Python把从mysql统计的结果数据转成表格形式的图片并推送到钉钉群
    微信小程序 服务端shiro用户验证,偶然会出现验证失败的问题。
    微信小程序 数组复制 改变原数组 新数组也会自动变化
    Controller 在加入aop 后,@Autowired注入值为null
    gitblit仓库
    mybatis plus 增加数据后 返回主键id
    Shiro 访问 Swagger2报404 及 放行Swagger2
  • 原文地址:https://www.cnblogs.com/itjeff/p/6168937.html
Copyright © 2011-2022 走看看