redis实战
阅读本书可以让你学到很多小技巧、小窍门以及使用Redis解决某些常见问题的方法。
redis五大数据类型
string 字符串
list 列表
hash 散列(哈希)
set 集合
zset 有序集合
五种数据类型介绍
有序集合:有序集合的键被称为成员(member),每个成员都是不相同的;有序集合的值被称为分值(score),分值必须为浮点数。有序集合是Redis里唯一既可以根据成员访问元素,又可以根据分值以及分值的排序顺序来访问元素的结构。
问一问
聊一聊关于String的底层实现
常用命令
redis硬盘持久化的方式
如何用Redis构建一个简单的文章投票网站的后端
TODO
- 文章投票代码实现部分
答一答
1. 聊一聊关于String的底层实现
其实说在问SDS(Simple Dynamic String)
2. 常用命令
更多请移步:总结整理:Redis命令整理
String常用命令
get 查询对应键值
set 添加键值对
append 将给定的 追加到原值的末尾
strlen 获得值的长度
setnx 只有在 key 不存在时设置 key 的值
incr 将 key 中储存的数字值增1。只能对数字值操作,如果为空,新增值为1
decr 将 key 中储存的数字值减1。只能对数字值操作,如果为空,新增值为-1
incrby / decrby <步长> 将 key 中储存的数字值增减。自定义步长。
List常用命令
RPUSH LINDEX LRANGE LPOP
#读取所有列表元素
lrange keyname 0 -1
Set常用命令
sadd sismember smembers(该命令会很慢,慎用!) srem
sinter sunion sdiff
Hash常用命令
HSET hash-key field val
HSET hash-key field
HEXISTS hash-key field
HGETALL hash-key
HDEL hash-key field
HINCRBY hash-key field incrnumber
HLEN hash-key
Zset常用命令
ZADD zset-key score member
ZRANGE zset-key 0 -1 member
ZRANGEBYSCORE zset-key 0 800 withscores
ZREM
Server相关命令
dbsize 返回当前库中的key的个数
bgsave //异步??把数据存储到磁盘-dump.rdb[true]
info
4. redis硬盘持久化的方式
有两种:一种是时间点转储;一种是AOF:从不同步、每秒同步一次、每个命令同步一次。
如何用Redis构建一个简单的文章投票网站的后端
要构建一个文章投票网站,我们首先要做的就是为了这个网站设置一些数值和限制条件:
如果一篇文章获得了至少200张支持票(up vote),那么网站就认为这篇文章是一篇有趣的文章;
假如这个网站每天发布1000篇文章,而其中的50篇符合网站对有趣文章的要求,那么网站要做的就是把这50篇文章放到文章列表前100位至少一天;另外,这个网站暂时不提供投反对票(down vote)的功能。
为了产生一个能够随着时间流逝而不断减少的评分,程序需要根据文章的发布时间和当前时间来计算文章的评分,具体的计算方法为:将文章得到的支持票数量乘以一个常量,然后加上文章的发布时间,得出的结果就是文章的评分。
我们使用从UTC时区1970年1月1日到现在为止经过的秒数来计算文章的评分,这个值通
常被称为Unix时间。之所以选择使用Unix时间,是因为在所有能够运行Redis的平台上面,使用编程语言获取这个值都是--件非常简单的事情。另外,
计算评分时与支持票数量相乘的常量为432, 这个常量是通
过将一天的秒数( 86 400 )除以文章展示一天所需的支持票
数量(200)得出的:文章每获得- -张支持票,程序就需要
将文章的评分增加432分。
构建文章投票网站除了需要计算文章评分之外,还需要
使用Redis结构存储网站,上的各种信息。对于网站里的每篇
文章,程序都使用一个散列来存储文章的标题、指向文章的
网址、发布文章的用户、文章的发布时间、文章得到的投票
数量等信息,图1-8展示了一个使用散列来存储文章信息的
例子。
图1-8
--- article:912 ----- hash ---
______________________________
title : article title
link : http://article.cn
poster : user:10174
pub_time : 1584411973.34
upvote : 518
------------------------------
我们的文章投票网站将使用两个有序集合来有序地存储文章:第-一个有序集合的成员为文
章ID,分值为文章的发布时间;第二个有序集合的成员同样为文章ID,而分值则为文章的评分。
通过这两个有序集合,网站既可以根据文章发布的先后顺序来展示文章,又可以根据文章评分的
高低来展示文章,图1-9展示了这两个有序集合的一个示例。
为了防止用户对同- -篇文章进行多次投票,网站需要为每篇文章记录一个已投票用户名单。
为此,程序将为每篇文章创建-一个集合,并使用这个集合
来存储所有已投票用户的ID,图1-10展示了一一个这样的集
合示例。
为了尽量节约内存,我们规定当一-篇文章发布期满
- .周之后,用户将不能再对它进行投票,文章的评分将
被固定下来,而记录文章已投票用户名单的集合也会被
删除。
既然我们已经知道了网站计算文章评分的方法,也知道了网站存储数据所需的数据结构,
那么现在是时候实际地实现这个投票功能了!当用户尝试对一-篇文章进行投票时,程序需要使
用ZSCORE命令检查记录文章发布时间的有序集合,判断文章的发布时间是否未超过一周。如
果文章仍然处于可以投票的时间范围之内,那么程序将使用SADD命令,尝试将用户添加到记
录文章已投票用户名单的集合里面。如果添加操作执行成功的话,那么说明用户是第-一次对这
篇文章进行投票,程序将使用ZINCRBY命令为文章的评分增加432分( ZINCRBY命令用于对
有序集合成员的分值执行自增操作),并使用HINCRBY命令对散列记录的文章投票数量进行更
新( HINCRBY命令用于对散列存储的值执行自增操作),代码清单1-6展示了投票功能的实现。
Redis事务从技术 上来讲,要正确地实现投票功能,我们需要将代码清单1-6 里面的SADD、
ZINCRBY和HINCRBY这3个命令放到一个事务里面执行,不过因为本书要等到第4章才介绍Redis
事务,所以我们暂时忽略这个问题。
代码。
1.3.2发 布并获取文章
发布一-篇新文章首先需要创建一个新的文章ID,这项工作可以通过对一个计数器( counter )
执行INCR命令来完成。接着程序需要使用SADD将文章发布者的ID添加到记录文章已投票用
户名单的集合里面,并使用EXPIRE命令为这个集合设置-一个过期时间,让Redis在文章发布期
满一周之后自动删除这个集合。之后,程序会使用HMSET命令来存储文章的相关信息,并执行
两个ZADD命令,将文章的初始评分( initial score )和发布时间分别添加到两个相应的有序集合
里面。代码清单1-7展示了发布新文章功能的实现代码。
好了,我们已经陆续实现了文章投票功能和文章发布功能,接下来要考虑的就是如何取出评分
最高的文章以及如何取出最新发布的文章了。为了实现这两个功能,程序需要先使用ZREVRANGE
命令取出多个文章ID,然后再对每个文章ID执行- -次HGETALL命令来取出文章的详细信息,这个
方法既可以用于取出评分最高的文章,又可以用于取出最新发布的文章。这里特别要注意的一一点是,
因为有序集合会根据成员的分值从小到大地排列元素,所以使用ZREVRANGE 命令,以“分值从大
到小”的排列顺序取出文章ID才是正确的做法,代码清单1-8 展示了文章获取功能的实现函数。
虽然我们构建的网站现在已经可以展示最新发布的文章和评分最高的文章了,但它还不具备
目前很多投票网站都支持的群组(group)功能:这个功能可以让用户只看见与特定话题有关的
文章,比如与“可爱的动物”有关的文章、与“政治”有关的文章、与“Java 编程”有关的文章
或者介绍“Redis 用法”的文章等等。接下来的一-节将向我们展示为文章投票网站添加群组功能
的方法。.
1.3.3
对文章进行分组
群组功能由两个部分组成, - -个部分负责记录文章属于哪个群组,另一个部分负责取出群组
里面的文章。为了记录各个群组都保存了哪些文章,网站需要为每个群组创建-一个集合, 并将所
有同属一个群组的文章ID都记录到那个集合里面。代码清单1-9 展示了将文章添加到群组里面
的方法,以及从群组里面移除文章的方法。
5.2 计数器和统计数据
正如第2章所述,通过记录各个页面的被访问次数,我们可以根据基本的访问计数信息来决
定如何缓存页面。但第2章中展示的只是-一个非常简单的例子,现实情况很多时候并非是如此简
单的,特别是在涉及实际网站的时候,尤为如此。
知道我们的网站在最近5分钟内获得了10 000次点击,或者数据库在最近5秒内处理了200
次写人和600次读取,是非常有用的。通过在- - 段时间内持续地记录这些信息,我们可以注意到
流量的骤增或渐增情况,预测何时需要对服务器进行升级,从而防止系统因为负荷超载而下线。
这一节将分别介绍使用Redis来实现计数器的方法以及使用Redis来进行数据统计的方法,
并在最后讨论如何简化示例中的数据统计操作。本节展示的例子都是由实际的用例和需求驱动
的。首先,让我们来看看,如何使用Redis来实现时间序列计数器( time series counter),以及如
何使用这些计数器来记录和监测应用程序的行为。
5.2.1将计数 器存储到Redis里面
在监控应用程序的同时,持续地收集信息是一件非常重要的事情。那些影响网站响应速度以及网
站所能服务的页面数量的代码改动、新的广告营销活动或者是刚刚接触系统的新用户,都有可能会彻
底地改变网站载人页面的数量,并因此而影响网站的各项性能指标。但如果我们平时不记录任何指标
数据的话,我们就不可能知道指标发生了变化,也就不可能知道网站的性能是在提高还是在下降。
为了收集指标数据并进行监视和分析,我们将构建一个能够持续 创建并维护计数器的工具,
这个工具创建的每个计数器都有自己的名字(名字里带有网站点击量、销量或者数据库查询字样
的计数器都是比较重要的计数器)。这些计数器会以不同的时间精度(如1秒、5秒、1分钟等)
存储最新的120个数据样本,用户也可以根据自己的需要,对取样的数量和精度进行修改。
实现计数器首先要考虑的就是如何存储计数器信息,接下来将说明我们是如何将计数器信息
存储到Redis里面的。
1.对计数器进行更新
为了对计数器进行更新,我们需要存储实际的计数器信息。对于每个计数器以及每种精度,
如网站点击量计数器和5秒,我们将使用一个散列来存储网站在每个5秒时间片( time slice) 之
内获得的点击量,其中,散列的每个键都是某个时间片的开始时间,而键对应的值则存储了网站
在该时间片之内获得的点击量。图5-1展示了一个点击量计数器存储的其中一部分数据,这个计
数器以每5秒为一个时间片记录着网站的点击量。
posted on 2020-03-13 14:16 aworkstory 阅读(220) 评论(0) 编辑 收藏 举报