redis实战读书笔记
redis基础知识以及一些应用场景总结
基础
内存数据库
优于memcached,速度上功能上
基础数据结构:
- String,List,Set,Hash,ZSet
String
key-value
指令GET,SET,DEL
LIST
key-list
指令
- LPUSH,RPUSH 推入列表的左端和右端 LPUSH listname item 返回值为列表长度
- LPOP,RPOP,从左端和右端删除元素
- LINDEX,获取列表指定位置的元素 LINDEX listname 1
- LRANGE,获取给定范围内的所有元素 LRANGE listname 0 -1 0为开始索引,-1位结束索引
SET
key-set
SADD, SMEMBERS, SISMEMBER, SREM
HASH
key-hash table
内部也是key-value
HSET, HGET, HGETALL, HDEL
ZSET
key-zset
ZADD, ZRANGE, ZRANGEBYSCORE, ZREM
一个文章投票系统的设计
基础功能设计
根据文章的发布时间和投票数量计算一个评分,根据该评分来排序和展示文章
要求:如果有一篇文章符合有趣文章的要求(支持票至少200张),放在排行榜前100位至少一天
构造分数
$ score = up\ vote\ *C + post\ time $
常量C可以选择432
分析:一天的秒数为86400,文章达到有趣需要200票,可以利用86400/200=432来作为每个投票对得分的贡献
保存评分以及存储文章信息
使用hash结构存储文章的标题,文章的url,发布文章的用户,发布时间,得票数量等信息
关于key的设置,可以使用任意字符作为分隔符,如article:ID
使用两个zset,其中一个成员为文章id,分值为文章的发布时间,另一个成员为文章id,分值为文章的评分,使得网站可以按照发布时间和评分两种方式展示文章
防止用户重复投票,建立已投票用户名单,使用set结构,key为voted:article_id
需要用到的一些指令:
- ZSCORE 获取文章发布时间的有序集合,判断发布时间是否在一周内
- SADD 若可投票,将用户添加到已投票的set中,操作成功则说明用户未向该文章投过票
- ZINCRBY 将文章的评分增加432
- HINCRBY 对hash结构中的文章投票数量进行更新
发布获取文章
发布文章需要新增id,使用计数器,执行incr指令
|
|
可以得到计数器++之后的值
使用sadd将发布者id添加到文章投票的用户集合中(避免自己给自己投票)
集合的过期时间为一周,一周后自动释放expire
HMSET存储文章相关信息
执行zadd添加文章初始评分到保存评分的zset
执行zadd添加文章发布时间到保存时间的zset
使用HGETALL获取存储在hash中的文章结构
使用ZREVRANGE取出评分最高的文章和最新发布的文章:
- 使用ZREVRANGE获取文章的id
- 使用HGETALL获取详细内容
文章分组
TODO