示例:给文章存储程序加上文章长度计数功能和文章预览功能
在前面的内容中,我们使用MSET、MGET等命令构建了一个存储文章信息的程序,在学习了STRLEN命令和GETRANGE命令之后,我们可以给这个文章存储程序加上两个新功能,其中一个是文章长度计数功能,另一个则是文章预览功能。
●文章长度计数功能用于显示文章内容的长度,读者可以通过这个长度值来了解一篇文章大概有多长,从而决定是否继续阅读。
●文章预览功能则用于显示文章开头的一部分内容,这些内容可以帮助读者快速地了解文章大意,并吸引读者进一步阅读整篇文章。
代码清单2-4 展示了这两个功能的具体实现代码,其中文章长度计数功能是通过对文章内容执行STRLEN命令来实现的,文章预览功能是通过对文章内容执行GETRANGE命令来实现的。
代码清单2-4 带有长度计数功能和预览功能的文章存储程序:/string/article.py
fromtimeimporttime # time()函数用于获取当前UNIX时间戳 class Article: # 省略之前展示过的__init__()、create()、update()等方法 defget_content_len(self): """ 返回文章内容的字节长度 """ returnself.client.strlen(self.content_key) defget_content_preview(self, preview_len): """ 返回指定长度的文章预览内容 """ start_index = 0 end_index = preview_len-1 returnself.client.getrange(self.content_key, start_index, end_index)
get_content_len()方法的实现非常简单直接,没有什么需要说明的。与此相比,get_content_preview()方法显得更复杂一些,让我们进行一些分析。
首先,get_content_preview()方法会接受一个preview_len参数,用于记录调用者指定的预览长度。接着程序会根据这个预览长度计算出预览内容的起始索引和结束索引:
start_index = 0 end_index = preview_len-1
因为预览功能要做的就是返回文章内容的前preview_len个字节,所以上面这两条赋值语句要做的就是计算并记录文章前preview_len个字节所在的索引范围,其中start_index的值总是0,而end_index的值则为preview_len -1。举个例子,假如用户输入的预览长度为150,那么start_index将被赋值为0,而end_index将被赋值为149。
最后,程序会调用GETRANGE命令,根据上面计算出的两个索引,从存储着文章内容的字符串键里面取出指定的预览内容:
self.client.getrange(self.content_key, start_index, end_index)
以下代码展示了如何使用文章长度计数功能以及文章预览功能:
>>> fromredisimportRedis >>> fromarticleimportArticle >>> client = Redis(decode_responses=True) >>> article = Article(client, 12345) >>> title = "Improving map data on GitHub" >>> content = "You've been able to view and diff geospatial data on GitHub for a while, but now, in addition to being able to collaborate on the GeoJSON files you upload to GitHub, you can now more easily contribute to the underlying, shared basemap, that provides your data with context." >>> author = "benbalter" >>> article.create(title, content, author) # 将一篇比较长的文章存储起来 True >>> article.get_content_len() # 文章总长273字节 273 >>> article.get_content_preview(100) # 获取文章前100字节的内容 "You've been able to view and diff geospatial data on GitHub for a while, but now, in addition to bei"