.Net Redis实战——实现文章投票并排序
本系列文章为学习Redis实战一书记录的随笔。
软件和环境版本:Redis:5.0.7 .Net 5.0
文中不会对Redis基础概念做过多介绍。
Redis数据类型和命令可在菜鸟教程学习:https://www.runoob.com/redis/redis-tutorial.html 。
示例介绍
实现一个简单的文章投票功能,并根据文章投票得分进行排序展示。
功能设计
使用散列来存储文章信息
article:92617中的冒号只是作为分隔符,可以根据个人信号替换成 | , / 等符号
使用两个有序集合来有序地存储文章:第一个有序集合的成员为文章 ID,分值为文章的发布时间;第二个有序集合的成员同样为文章 ID,而分值则为文章的评分。通过这两个有序集合,网站既可以根据文章发布的先后顺序来展示文章,又可以根据文章评分的高低来展示文章。
同时为了防止一个用户对一篇文章进行多次投票,需要为每篇文章增加一个投票用户集合存储已投票用户ID。
代码实现
代码所用Redis库为StackExchange.Redis。
具体使用参考:https://stackexchange.github.io/StackExchange.Redis/
我本机Redis安装在Windows的Linux子系统内,写数据持久化时报错“MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk”。
解决方案:https://blog.csdn.net/u014071875/article/details/103715183
1.初始化文章,模拟文章发布
[HttpGet("InitArticles")]
public string InitArticles()
{
using (var redis = ConnectionMultiplexer.Connect(redisConnectionStr))
{
var db = redis.GetDatabase();
foreach (var article in Articles)
{
var articleId = $"article:{article.ID}";
var hashEntiies = new [] {
new HashEntry(nameof(article.Title),article.Title),
new HashEntry(nameof(article.Link),article.Link),
new HashEntry(nameof(article.Poster),article.Poster),
new HashEntry(nameof(article.Votes),article.Votes),
new HashEntry(nameof(article.UnixTime),article.UnixTime),
};
//存储文章信息
db.HashSetAsync(articleId, hashEntiies);
//将文章信息添加到评分和时间排序的有序集合
db.SortedSetAddAsync("score:",articleId, 0);
db.SortedSetAddAsync("time:",articleId, DateTimeOffset.UtcNow.ToUnixTimeMilliseconds());
Thread.Sleep(1000);
}
}
return "文章初始化完成";
}
2.文章投票代码
[HttpGet("ArticleVote")]
public string ArticleVote(int userId,int articleId) { using (var redis = ConnectionMultiplexer.Connect(redisConnectionStr))
{
var db = redis.GetDatabase();
if (db.SetAdd($"voted:{articleId}",$"user:{userId}"))
{
//增加投票票数和评分
db.HashIncrementAsync($"article:{articleId}", "Votes", 1);
db.SortedSetIncrementAsync("score:", $"article:{articleId}", 1);
}
else
{
return "不能重复投票";
}
}
return "投票成功";
}
3.获取文章列表(只列出根据评分排序)
[HttpGet("GetArticles")]
public IEnumerable<Article> GetArticles(int page,int size) { var articles = new List<Article>();
using (var redis = ConnectionMultiplexer.Connect(redisConnectionStr))
{
var start = (page - 1) * size;
var end = start + size - 1; var db = redis.GetDatabase();
var ids = db.SortedSetRangeByRank("score:", start, end,order:Order.Descending);
foreach (var id in ids)
{
var articleHashEntities = db.HashGetAll(id.ToString());
//这里除了用反射没有找到好的解决办法
var article = new Article {
ID = int.Parse(id.ToString().Split(':')[1]),
Title= articleHashEntities.FirstOrDefault(a=>a.Name=="Title").Value,
Link= articleHashEntities.FirstOrDefault(a => a.Name == "Link").Value,
Poster= int.Parse(articleHashEntities.FirstOrDefault(a => a.Name == "Poster").Value),
UnixTime= long.Parse(articleHashEntities.FirstOrDefault(a => a.Name == "UnixTime").Value),
Votes= int.Parse(articleHashEntities.FirstOrDefault(a => a.Name == "Votes").Value)
};
articles.Add(article);
} }
return articles;
}
.Net Redis实战——实现文章投票并排序的更多相关文章
- Redis 实战 —— 02. Redis 简单实践 - 文章投票
需求 功能: P15 发布文章 获取文章 文章分组 投支持票 数值及限制条件 P15 如果一篇文章获得了至少 200 张支持票,那么这篇文章就是一篇有趣的文章 如果这个网站每天有 50 篇有趣的文章, ...
- Redis in Action 文章投票
原书用 Python 与 Redis 进行交互,我用 PHP 来实现. 环境:LNMP(CentOS 6.6 + Nginx 1.8.0 + MySQL 5.6.23 + PHP 5.6.9)+ Re ...
- 使用redis构建文章投票系统
首先,我得说明这篇博客基本上就是<<redis in action>>第一章内容的读书笔记. 需求 首先,说明一下,我们的需求 用户可以发表文章,发表时,自己就默认的给自己的文 ...
- Redis实现文章投票功能
Redis的具体操作这里就不说了,说一下需求和设计思路. 需求:自己实现一个文章投票的功能1.能够按照时间分页倒叙查看文章信息2.能够给文章投票,一个用户给一篇文章只能投票一次3.需要记录分值.每次投 ...
- 使用Redis构建文章投票网站
涉及到的key: 1. article_time, 记录文章的发布时间,zset结构 2. article_score, 记录文章的得分, zset结构 得分 = 发布时间 + 投票用户数 X 432 ...
- redis 实例2 构建文章投票网站后端
redis 实例2 构建文章投票网站后端 1.限制条件 一.如果网站获得200张支持票,那么这篇文章被设置成有趣的文章 二.如果网站发布的文章中有一定数量被认定为有趣的文章,那么这些文章需要被设置 ...
- redis实战笔记(3)-第3章 Redis命令
第3章 Redis命令 本章主要内容 字符串命令. 列表命令和集合命令 散列命令和有序集合命令 发布命令与订阅命令 其他命令 在每个不同的数据类型的章节里, 展示的都是该数据类型所独有的. 最 ...
- redis实战笔记(1)-第1章 初识Redis
第1章 初识Redis 注:本书在redis3.0版本的,比如redis3.0以后支持服务端集群.3.0之前只能客户端分片. 本章主要内容 1.Redis与其他软件的相同之处和不同之处 2.Re ...
- Redis 实战 —— 05. Redis 其他命令简介
发布与订阅 P52 Redis 实现了发布与订阅(publish/subscribe)模式,又称 pub/sub 模式(与设计模式中的观察者模式类似).订阅者负责订阅频道,发送者负责向频道发送二进制字 ...
随机推荐
- Day02_15_方法重载
方法重载 1.什么是方法重载? * 方法重载又被称为 OverLoad,是指在同一个类中,具有相同方法名的不同方法,各个方法虽然方法名相同,但是各自的形式参数不同. 2.什么时候考虑使用方法重载? * ...
- 分页系列之一:SQL Server 分页存储过程
以下为最基本的代码结构,SQL Server 2012 开始支持 CREATE PROCEDURE procXXX @Page int, --当前页码,从1开始 @PageSize int --每页记 ...
- B - Tempter of the Bone(DFS+剪枝)
The doggie found a bone in an ancient maze, which fascinated him a lot. However, when he picked it u ...
- Django Ajax序列化与反序列化
序列化与反序列是最常用的功能,有时我们需要将一个表单组打包成Json格式等然后再提交给服务端,这样可以提高效率节约带框,如下是Django配合Ajax实现的序列化与反序列化,文件上传等操作. Ajax ...
- hdu4496并查集的删边操作
题意: 给你一个图,问你删除一些边后还有几个连通快.. 思路: 典型的并查集删边操作,并查集的删边就是先把不删除的边并查集一边(本题没有不删除的边),然后逆序吧所有要删除的边以 ...
- PAT 乙级 -- 1013 -- 数素数
题目简介 令Pi表示第i个素数.现任给两个正整数M <= N <= 104,请输出PM到PN的所有素数. 输入格式: 输入在一行中给出M和N,其间以空格分隔. 输出格式: 输出从PM到PN ...
- Python脚本与Metasploit交互攻击
Metasploit是一款强大的漏洞扫描和利用工具,编写Python脚本与Metasploit进行交互,可以自动化的扫描和利用漏洞. 相关文章:Metasploit框架的使用 在脚本中,我们首选需要利 ...
- JEET W1S运动蓝牙耳机简评
对于我这种喜欢运动的人来说,很早之前就一直想买个运动蓝牙耳机了.这次正好有此机会可以评测来自JEET的W1S运动蓝牙耳机,真的是非常的幸运! 终于,在期盼中,我的来自深圳的快递隔了四天终于到了!JEE ...
- 获取Shell后的操作
对于Windows系统主机和Linux系统主机,获取Shell后的操作都不同. Windows 当我们通过对Web服务器进行渗透,拿到了该Web服务器的shell后,可以执行系统命令后,我们该如何操作 ...
- Linux-鸟菜-2-主机规划与磁盘分区
Linux-鸟菜-2-主机规划与磁盘分区 开机流程: 1. BIOS:開機主動執行的韌體,會認識第一個可開機的裝置: 2. MBR:第一個可開機裝置的第一個磁區內的主要開機記錄區塊,內含開機管理程式: ...