- 1、本文档共45页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
?
?
第三章 Redis设计实战笔记
?
?
一、基于Redis设计的投票网站实战
1、应用场景实战
文章投票功能模块需求
用户可以发表文章,发表时默认给自己的文章投了一票
用户在查看网站时可以按评分进行排列查看
用户也可以按照文章发布时间进行排序
为节约内存,一篇文章发表后,7天内可以投票,7天过后就不能再投票了
为防止同一用户多次投票,用户只能给一篇文章投一次票
2、关系数据库设计
文章基本信息表 t_article
article_id??title??content post_time user_id
文章票数与分值表 t_vote_data
article_id??votes??scores
文章投票详表 t_vote_details
article_id??vote_time??user_id
3、应用场景Redis实现
投票网站应用场景会使用到的Redis相关指令如下:
HASH类型命令:
hset ?hincrBy ?hgetAll ??expire
SET集合命令:
sadd ?smembers
ZSET集合命令:
zadd ??zscore ?zincrby ?zrevrange
4、redis的Key设计思路
Key-Value键值对:比如set key value
key的设计:一般以业务、功能模块或表名开头,后跟主键(或能表示数据唯一性的值)
例子:用户模块,其中用户ID 001,用户名称hankin,那么Key如何设计?
set user:001:name hankin
key为 user:001:name
5、记录已投票用户,防重投
已对002文章投票过的用户,使用SET存储(无序,不能重复)
?
6、记录文章分值
使用ZSET记录文章投票分数,和按文章发布的时间戳(有序列,不能重复)
?
7、Redis缓存设计实战
?
8、缓存数据变化
1)004号用户对文章article:002投了1张票,文章的评分增加了400
?
2)004号用户对article:002文章投票后,会被追加到已投票用户名单里
?
9、代码环节
代码参考:redis-vote模块,git地址:/hankin_chj/redis-platform.git
业务接口方法:
/**
?* 业务接口方法
?*/
public interface RedisArticleService {
?????public String postArticle(String title, String content, String link, String userId);
?????public MapString, String hgetAll(String key);
?????public void articleVote(String userId, String articleId);
?????public String hget(String key, String votes);
?????public ListMapString,String getArticles(int page, String order);
}
文章发布代码:
/**
* 文章发布使用redis技术
*/
@Service
public class RedisArticleServiceImpl implements RedisArticleService {
???@Resource
???private JedisUtils jedis;
???/**
???* 文章提交发布
???* @param title 标题 ?内容 ?链接 ?用户ID
???* @return 文章的ID
???*/
???@Override
???public String postArticle(String title, String content, String link, String userId) {
??????//article:001
????????String articleId = String.valueOf(jedis.incr(article:)); // articleId=1
????????//投票键: voted:
????????String voted = voted: + articleId;
????????jedis.sadd(voted, userId);
????????jedis.expire(voted, Constants.ONE_WEEK_IN_SECONDS);
????????long now = System.currentTimeMillis() / 1000;
????????Stri
文档评论(0)