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 这个命令对每次访问这篇文章时增加文章的访问量,其实是增加打分。


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

redis 相关操作

  • xiaofan1988
  • xiaofan1988
  • 2016年08月10日 11:34
  • 309

Csdn上博文不见的原因

有时候写博文的时候,发现一篇博文需要修改,等你点击编辑后,在编辑的过程中,返回,或者长时间不用,或者发表,发现博文不存在的情况,询问工作人员结论是系统缓存没有刷新,需要等段时间。我是这个情况,发现博文...
  • u010742414
  • u010742414
  • 2015年05月22日 14:59
  • 856

安博-赵博文

将“我不会”转变为“我可以学”
  • ZeroBz
  • ZeroBz
  • 2017年12月29日 10:07
  • 121

Redis PHP连接操作

安装 在PHP程序中使用Redis,需要确保我们有Redis的PHP驱动程序和PHP安装设置在机器上。可以查看PHP教程教你如何在机器上安装PHP。现在,让我们来看看一下如何设置Redis的PH...
  • txj236
  • txj236
  • 2015年10月20日 20:05
  • 180

博文收藏

一些关于ACM的博文,有算法方面的,也有心得体会,大多读过但没能消化吸收。...
  • whyorwhnt
  • whyorwhnt
  • 2013年10月08日 20:30
  • 2582

CSDN发表博文十大注意事项

看了很多同学的作业,有待改进的地方很多;人生无处不在学习,如果我们能够做到“两人行,必有我师”的心态。发表博文,不仅仅是为了完成作业,更重要的是建立一个对外展示的窗口,让他人见博文,知其人;高质量的博...
  • dingyouzhuan0221
  • dingyouzhuan0221
  • 2014年04月14日 13:00
  • 1368

phpredis-api 中文说明

phpredis是php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有用;以下是redis官方提供的命令使用技巧: 下载地址如下: ht...
  • u010520490
  • u010520490
  • 2015年10月30日 13:53
  • 89

如何转载CSDN里的好博文?

前言  对于喜欢逛CSDN的人来说,看别人的博客确实能够对自己有不小的提高,有时候看到特别好的博客想转载下载,但是不能一个字一个字的敲了,这时候我们就想快速转载别人的博客,把别人的博客移到自己的空间里...
  • garvisjack
  • garvisjack
  • 2017年01月26日 08:25
  • 760

推荐优秀博文

索引 前端开发 1HTML5 LocalStorage 本地存储详解 HTML5 LocalStorage 本地存储详解 简要说明:页面之间数据交互的方式有cookie、request、sess...
  • BuquTianya
  • BuquTianya
  • 2015年10月20日 10:16
  • 1201

redis 札记 -- phpredis 中文说明

Redis 大名如雷贯耳,看官若不了解请百度~ phpredis是php的一个扩展,效率应该不会差 下载地址如下: https://github.com/owlient/phpredis(支持r...
  • songwenbinasdf
  • songwenbinasdf
  • 2014年02月10日 10:43
  • 335
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Redis-博文功能实现
举报原因:
原因补充:

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