1. 程式人生 > 實用技巧 >Python 呼叫 C 語言(使用 C 函式處理 NumPy 資料)

Python 呼叫 C 語言(使用 C 函式處理 NumPy 資料)

本系列文章為學習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;
        }