Redis-博文功能实现

原创 2015年07月08日 11:58:08

Redis-博文功能实现

以编写一个博客功能为例,实现最基本的一个博客的增删改查功能。
定义类:
Article[id,title,slug,content,Set<标签>,List<评论>,pviews,author,time] = [ID,标题,缩略名,内容,标签(集合,无重复元素),评论(列表),访问次数,操作员,操作时间]

  • 生成一个文章的ID
    设置一个自增的序列INCR article.id,自增产生一个ID作为文章的ID

  • 文章的主要内容采用散列方式存放
    article:[id] -> [title,slug,content,author,time],其中[id]为生成的文章的ID,如:
    HMSET article:1 title 第一篇文章 slug my1st content 这是我的第一篇文章 author szg time 2015070714:25:12
    加粗的部分为字段名称,可以使用HGETALL key 获取此key下面的所有字段的value值

  • 文章的缩略名
    文章的缩略名有一个需求即:不能与其他重复,因为我们会将缩略名作为url地址的一部分,且根据缩略名我们可以很方便的查出对应的文章
    我们将所有文章的缩略名放到slug.to.id散列中,它的字段是随着文章增加、删除而变化的
    当文章添加时先调用HEXISTS key field 命令来判断此字段是否存在,存在会返回1,否则返回0,此部分过程示例如下:
    HEXISTS slug.to.id my1st 返回结果若为1,表示存在此缩略名,则不能添加,否则可以添加
    HSET slug.to.id my1st 1 ,其中1表示的是文章的ID,我们使用的是散列

  • 文章列表
    目前已添加的所有的文章的ID需要存储起来,因为在列表页面查看时需要根据ID,罗列出所有的文件列表,当然也可以不罗列,不罗列的情况下我们可以使用两种方 式解决问题:
    1)根据article.id的MAX值,逐个过滤,获取对应article:[id] 的内容,但是此时无法获取目前已有多少文章,因为自增的ID在后来有可能被删除,且我们分页的逻辑处理会比较复杂。当然除非把整个article:[id]全部过滤一遍,这样效率就是一个问题
    2)可以使用KEYS 命令过滤出所有article:[id]的值,然后计算总数,做分页处理,但是KEYS命令效率非常低,基本很难适用。
    LIST(列表)提供了非常多的列表操作,它是一个有序的集合,可用于处理上述问题,处理方法:
    将所有的目前存在的文章ID放到article.id.list中,当新添加文章时可以使用LPUSH key value,删除文章时可使用LREM key count value实现。
    查看文章分页时,可以使用LLEN key 获得所有的目前存在的文章数量,及共计x条记录,之后可以根据分页的需求使用LRANGE key start stop获取所有的分页的ID列表,然后采用遍历的方式使用HGETALL获得所有的文件列表内容
    根据需要一般来说后添加的文章需要显示在前面,因此示例如下:
    LPUSH article.id.list 1;将ID为1的文章增加到列表中

    上述解决方案仅仅是按照文章的ID进行排序,它无法支持用户按照某个时间范围进行检索,并且文章的修改时间可能是可以调整的,因此后续我们会引入有序集合处理文章的ID列表,和列表一样,我们使用有序集合也是将文章的ID放到集合中,但是我们用Unix时间作为每个元素的打分,这样我们不仅可以按照时间进行排序筛选,同时也可以根据打分的多少进行打分范围的筛选。
    获取范围的文章ID列表:ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

  • 文章的评论
    对于文章的评论,评论一般具有如下的属性:评论的内容、评论者和评论时间,这些的评论可以采用列表的方式解决,列表中存放的是格式化的数据,例如用”|”将评论内容、评论者和评论时间等序列化分开,获取显示的时候切割处理(通用的jar支持多种方式),采用列表还有一个原因是:一般来讲评论在发布后是不允许更新的,如果允许更新的话就需要采用更复杂的方式,比如需要给每个评论编号,重置评论中的内容等。
    我们对每个文章用一个key标示,例如:article:1:comments ,这样可以使用LPUSH或者RPUSH的方式决定最近发表的还是最晚发表的评论首先显示,并且可以用LRANGE命令选择初次呈现的评论数量。

  • 文章的标签
    截止到此,文章还有两个字段未处理,第一个字段是文章的标签,第二个字段就是文章的访问量,本部分处理文章的标签。
    在实际使用中,一篇文章可以有多个标签,比如java、WEB、后台等,且这些标签是不能重复的;第二,文章应该是可以支持按照标签进行检索的,即一个标签下又包含非常多的文章,为了实现此部分功能,使用了Redis的集合概念。
    集合与列表非常接近,但集合是无序且不能重复的,同时,集合可以有交集、并集和差集等操作的行为。
    为每篇文章设置一个标签的key,article:1:tags,可以使用SADD key member [member1 member2 … ]进行添加,也可以使用SREM key member [member1 member2 …]进行删除。
    当我们需要显示一篇文章目前包含的所有的标签时,可以使用SMEMBERS key,这样会显示所有的这个key集合中的内容,即对应了文章中的所有标签。
    当然,如果此文章的标签仅仅是给文章做一个标示,那么也可以使用String类型作为文章的标签内容,不同的标签下可通过分隔符分割。
    而在博文的实际应用中我们也可能会遇到这样一个需求,那就是通过标签对文章进行检索,比如我们有三个标签:Java、C++、MySql,不同的标签下的文章可能是不一样的,需要支持按照这些标签检索,这个时候也比较适合使用集合的方式,以Java为例,我们可以将文章的ID存在放Java的集合中,例如:
    tag:java:articles -> [1, 2, 3],表示java标签下有1、2、3这三篇文章,这样在我们对文章的标签进行变更修改的时候需要同时对article:1:tags这个集合和tag:java:articles集合进行修改。

  • 文章的访问量
    文章的访问量是指在一定的时间段内对文章的访问次数,这个访问量虽然只是一个数值,但是却可以通过访问量进行排序,按照访问量排序也是博文中非常常见的一个需求。
    对于文章的访问量处理,(主要是因为涉及到排序的问题),我们通常采用有序集合的数据类型。有序集合,顾名思义,就是一个具有顺序的集合。它可以看做是集合的高级版,因为它的建立需要给集合的每个元素增加一个分数,这个分数就是用来有序的依据。
    我们将文章的ID和分数作为一个有序集合,例如:article:pview,集合中的主元素是文章的ID,对每个ID的打分是这篇文章的访问量。
    我们可以使用 ZINCRBY article:pview 1 文章ID 这个命令对每次访问这篇文章时增加文章的访问量,其实是增加打分。


本人能力有限,有不足之处敬请指正!

相关文章推荐

Twitter概念功能“mark as error” 给错误博文划上删除线

当你发现自己放发布的一条微博中有错误的时候,你是会选择将它删除,还是转发更正? 曾因推出最小限度文本编辑器IA而著称的位于日本东京的设计公司Information Architects(IA)近...

【JEECG技术博文】JEECG简单实例讲解自定义表单功能

JEECG简单实例讲解自定义表单功能作者:任杰 http://blog.csdn.net/renjie0520/article/details/50286503一、自定义表单功能简介    自定义表单...

【博客专家】新功能:优秀博文直推极客头条

【福利简介】尊敬的博客专家们,又新增一项福利。福利是这样子的: 您可以将自己发现的优秀博文推荐到极客头条,一键分享,实时显示! 福利使用指南在CSDN博文下方的分享按钮,您都会看到“推荐到极客头条...

软件设计本质论(Essential Design) —白话面向对象 (转注:关于c语言实现封装继承多态的一堆博文)

软件设计本质论(Essential Design) —白话面向对象 分类: 23.设计本质论系列 2006-08-15 21:424361人阅读 评论(11)收藏 举报 软件设计本质论(E...

关于《Android照片墙应用实现,再多的图片也不怕崩溃 》博文中的Bug修复

最近一直在研究http://my.csdn.net/sinyu890807的博文,其中讲到的图片缓存系列文章还是很有内涵的,值得学习,从中学到了不少~~~   当看到其中http://blog.c...
  • zeq9069
  • zeq9069
  • 2013年09月08日 12:52
  • 1053

jQuery实现简单的导航按钮焦点背景更换(代替css hover)以及弹出子菜单 我的第一篇博文

这是我的第一篇博文,我对计算机网络和web编程开发感兴趣,有时也试着写一点java,目前在上大学,知识学习刚刚起步。以后打算经常写一些自己遇到的问题和知识,记录的同时接受指点,不仅日后方便查阅,也有个...
  • as66t
  • as66t
  • 2012年12月08日 19:32
  • 3023

写篇博文记录下自己实现maven自动化部署到服务器的心得

第一次写博客,心情激动,在公司加班时心血来潮,学习喜爱maven自动化部署. 一.首先应该明确tomcat 权限分配是否完成. 二.检查并修改t...

利用堆实现优先级队列博文

算法研究(四)                  用堆实现优先级队列    首先声明:本人只是一个菜鸟而已。。。。。。。 由于以后很多地方都会用到优先级队列的知识,所以在这里先给大家讲解一下。只...
  • xinali1
  • xinali1
  • 2012年08月28日 22:55
  • 2900

极客 - 博文28 - 动态数组实现链表各种操作

动态数组实现链表各种操作
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis-博文功能实现
举报原因:
原因补充:

(最多只允许输入30个字)