前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

NoSQL初探之人人都爱Redis:(2)Redis API与常用数据类型简介

作者头像
Edison Zhou
发布于 2018-08-20 07:10:37
发布于 2018-08-20 07:10:37
41700
代码可运行
举报
文章被收录于专栏:EdisonTalkEdisonTalk
运行总次数:0
代码可运行

一、Redis API For .Net

  首先,不得不说Redis官方提供了众多的API开发包,但是目前Redis官方版本不支持.Net直接进行连接,需要使用一些第三方的开源类库。目前最流行的就是ServiceStack.Redis这个开源项目,其在GitHub上的下载地址为:https://github.com/ServiceStack/ServiceStack.Redis

  进入下载页面,点击“Download Zip”按钮,即可下载该API包。解压该Zip包后,其实我们所用到的只是其中的几个DLL而已,打开build/release/MonoDevelop文件夹,看到里边还有一个zip包,这里边就是我们所需的DLL了。

  再次解压这个Zip包,可以看到其中包含如下图所示的DLL文件,这几个也是我们今天所要引入VS的DLL库,有了它们,我们就可以在程序端和Redis服务端进行对话了,是不是很赞?

  这时,我们就可以在VS中新建一个控制台项目,命名为RedisDemo,然后新建一个Lib文件夹用来存放我们的DLL文件,然后添加对这些DLL引用。至此,就是万事俱备只欠东风了,我们接下来会在程序中调用Redis客户端和Redis服务端进行通信,了解Redis API为我们提供的丰富的数据类型。

二、Redis中常用数据类型

  由上一篇博客可知,Redis目前提供五种数据类型:string(字符串)、list(链表)、Hash(哈希)、set(集合)及zset(sorted set)  (有序集合)。现在,我们一一来看看这五种数据类型的基本使用方法。在开始介绍之前,我们先使用刚刚引入的Redis API建立一个Redis客户端对象,有了这个客户端对象,我们才能和Redis服务端进行通信,且看下面的一行代码。我们需要事先指定好Redis服务端的IP地址和端口号,然后根据这两个信息建立一个RedisClient的对象实例,通过这个实例所带的方法和服务端通信。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
using System;
using System.Collections.Generic;
using ServiceStack.Redis;

namespace RedisDemo.FirstStart
{
    class Program
    {
        //Redis服务器IP地址
        static string localHostIP = "127.0.0.1";
        //Redis服务端口号
        static int redisServicePort = 6379;           

        static void Main(string[] args)
        {
            var redisClient = new RedisClient(localHostIP, redisServicePort);

            Console.ReadKey();
        }
    }
}

  2.1 String 字符串

String是最常用的一种数据类型,普通的key/value存储都可以归为此类 。一个Key对应一个Value,string类型是二进制安全的。Redis的string可以包含任何数据,比如jpg图片(生成二进制)或者序列化的对象。

  在Redis中的基本操作如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
     static void StringTypeDemo(RedisClient redisClient)
        {
            //向Redis中添加一个Key/Value对
            redisClient.Set<string>("username", "edisonchou");
            //从Redis中读取一个Value值
            string userName = redisClient.Get<string>("username");

            Console.WriteLine("The value from Redis is {0}", userName);
        }

  运行效果如下:

  2.2 Hash 哈希

  Hash是一个string 类型的field和value的映射表。Hash特别适合存储对象,相对于将对象的每个字段存成单个string 类型。一个对象存储在Hash类型中会占用更少的内存,并且可以更方便的存取整个对象。

  这里借用群叔的描述,我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息:用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:

  第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。

  第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的

  因此,基于以上两种方式的缺陷,Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口,如下图:

  也就是说,Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题,也就很好的解决了问题。

  下面我们在VS中来看看Hash类型如何Code:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        static void HashTypeDemo(RedisClient redisClient)
        {
            redisClient.SetEntryInHash("user", "userinfo", "cool boy");
            redisClient.SetEntryInHash("user", "useraccount", "5000");

            List<string> keyList = redisClient.GetHashKeys("user");

            foreach (string key in keyList)
            {
                Console.WriteLine(key);
                string value = redisClient.GetValueFromHash("user", key);
                Console.WriteLine("user:{0}:{1}", key, value);
            }
        }

  运行结果如下图:

  2.3 List 链表

  Lst是一个链表结构,主要功能是push与pop,获取一个范围的所有的值等,操作中key理解为链表名字。 Redis的List类型其实就是一个每个子元素都是string类型的双向链表,我们可以通过push或pop操作从链表的头部或者尾部添加删除元素,这样List既可以作为栈,又可以作为队列。它即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构

  (1)现在我们首先来看看List作为(Stack)栈类型的使用: 

  那么在VS中如何来Code呢?通过Push与Pop操作Stack

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        static void StackTypeDemo(RedisClient redisClient)
        {
            redisClient.PushItemToList("userenname", "edisonchou");
            redisClient.PushItemToList("userenname", "wncudchou");
            redisClient.PushItemToList("userenname", "milkye");
            redisClient.PushItemToList("userenname", "dickgu");

            int length = redisClient.GetListCount("userenname");
            for (int i = 0; i < length; i++)
            {
                Console.WriteLine(redisClient.PopItemFromList("userenname"));
            }
        }

  运行效果如下:

  (2)下面我们来看看List作为(Queue)队列的使用:

  那么在VS中如何Code呢?通过DeQueue和EnQueue操作Queue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        static void QueueTypeDemo(RedisClient redisClient)
        {
            redisClient.EnqueueItemOnList("account", "马云");
            redisClient.EnqueueItemOnList("account", "马化腾");
            redisClient.EnqueueItemOnList("account", "李彦宏");

            int length = redisClient.GetListCount("account");
            for (int i = 0; i < length; i++)
            {
                Console.WriteLine(redisClient.DequeueItemFromList("account"));
            }
        }

  运行效果如下:

  2.4 Set 集合

  Set是string类型的无序集合。set是通过hash table实现的,添加,删除和查找,对集合我们可以取并集,交集,差集,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

  与List比较而言,set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

  那么在VS中我们使用Set来Code一下,先增加两个Set集合,然后对其进行交集、并集与差集运算:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    static void SetTypeDemo(RedisClient redisClient)
        {
            redisClient.AddItemToSet("a3", "ddd");
            redisClient.AddItemToSet("a3", "ccc");
            redisClient.AddItemToSet("a3", "tttt");
            redisClient.AddItemToSet("a3", "sssh");
            redisClient.AddItemToSet("a3", "hhhh");
            redisClient.AddItemToSet("a4", "hhhh");
            redisClient.AddItemToSet("a4", "h777");

            Console.WriteLine("-------------求a3集合------------");

            HashSet<string> hashSet = redisClient.GetAllItemsFromSet("a3");
            foreach (string value in hashSet)
            {
                Console.WriteLine(value);
            }

            Console.WriteLine("-------------求并集------------");

            hashSet.Clear();
            hashSet = redisClient.GetUnionFromSets(new string[] { "a3", "a4" });
            foreach (string value in hashSet)
            {
                Console.WriteLine(value);
            }

            Console.WriteLine("-------------求交集------------");

            hashSet.Clear();
            hashSet = redisClient.GetIntersectFromSets(new string[] { "a3", "a4" });
            foreach (string value in hashSet)
            {
                Console.WriteLine(value);
            }

            Console.WriteLine("-------------求差集------------");

            hashSet.Clear();
            hashSet = redisClient.GetDifferencesFromSet("a3", new string[] { "a4" });
            foreach (string value in hashSet)
            {
                Console.WriteLine(value);
            }
        }

  运行效果如下:

  2.5 Sorted Set 有序集合

  Sorted Set 是set的一个升级版本,又被称为ZSet,它在set的基础上增加了一个顺序的属性,这一属性在添加修改。元素的时候可以指定,每次指定后,zset(表示有序集合)会自动重新按新的值调整顺序。可以理解为有列的表,一列存 value,一列存顺序。操作中key理解为zset的名字。

  sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构。此外,还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

  下面,我们在VS中编写对Sorted Set的操作代码,输出时会按字母的有序顺序输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        static void SortedSetTypeDemo(RedisClient redisClient)
        {
            redisClient.AddItemToSortedSet("a5", "ffff");
            redisClient.AddItemToSortedSet("a5", "bbbb");
            redisClient.AddItemToSortedSet("a5", "gggg");
            redisClient.AddItemToSortedSet("a5", "cccc");
            redisClient.AddItemToSortedSet("a5", "waaa");

            List<string> list = redisClient.GetAllItemsFromSortedSet("a5");
            foreach (string str in list)
            {
                Console.WriteLine(str);
            }
        }

  运行效果如下:

三、小结

  Redis为我们提供了相比Memcached更为丰富多样的数据类型,使得Redis可以用在多种多样的应用场合,这也说明了为什么Redis在国内外各大互联网名企中这么受欢迎的原因。本篇简单地介绍和使用了各种数据类型,下一篇,我们会针对1-2个具体应用场景来使用这些数据类型进行具体案例的Code。最后,还是谢谢参考资料的原作者,站在你们的肩膀上,我们才能看的更远!

参考文献

(1)传智播客公开课,王承伟主讲,http://bbs.itcast.cn/thread-26525-1-1.html

(2)群叔,《Redis数据类型详解及Redis适用场景》,http://www.cnblogs.com/qunshu/p/3196972.html

附件下载

(1)ServiceStack.Redis:http://pan.baidu.com/s/1sjtxe5v

作者:周旭龙

出处:http://www.cnblogs.com/edisonchou/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2014-07-04 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索
  通过前面几篇的介绍中,我们都是在单机上使用Redis进行相关的实践操作,从本篇起,我们将初步探索一下Redis的集群,而集群中最经典的架构便是主从复制架构。那么,我们首先来了解一下神马是主从复制架构?
Edison Zhou
2018/08/20
5970
NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索
.Net Core下 Redis的String Hash List Set和Sorted Set的例子
1.新建一个.Net Core控制台应用程序,用Nuget导入驱动 打开程序包管理控制台, 执行以下代码。 PM> Install-Package ServiceStack.Redis 即可添
码农阿宇
2018/04/18
1.2K0
.Net Core下 Redis的String  Hash List Set和Sorted Set的例子
分布式中使用Redis实现Session共享(一)
用户1168362
2018/01/05
2.3K0
分布式中使用Redis实现Session共享(一)
Redis 数据类型
添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。
用户9857551
2023/10/17
2010
Redis 数据类型
ASP.NET Core微服务(六)——【redis操作】
Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
红目香薰
2022/11/28
6620
Redis缓存服务搭建及实现数据读写
发现博客园中好多大牛在介绍自己的开源项目是很少用到缓存,比如Memcached、Redis、mongodb等,今天得空抽时间把Redis缓存研究了一下,写下来总结一下,跟大家一起分享 一下。由于小弟水平有限又是第一次接触Redis,有些的不对的地方欢迎指出纠正。
写代码的猿
2019/04/11
6790
Redis缓存服务搭建及实现数据读写
一文读懂Redis数据类型
也就是说redis的存储类型 key(string) -- value(string、hash、list、set、zet)
Devops海洋的渔夫
2022/01/17
4290
一文读懂Redis数据类型
Redis客户端ServiceStack.Redis的简单使用
在nuget中下载ServiceStack.Redis,但是运行之后会出现一个问题:
Ryan_OVO
2023/10/18
5280
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
红目香薰
2022/11/30
8870
ASP.NET Core微服务(六)——【.Net Core操作redis】StackExchange.Redis
Redis笔记(二):Redis数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
朝雨忆轻尘
2019/06/19
6270
Redis 数据类型
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
子润先生
2021/07/05
5160
Redis 数据类型
Redis 五种数据类型及应用场景
2. 提供丰富多样的数据类型:string、 hash、 list、set、 sorted set
互扯程序
2020/03/23
4.6K0
redis中各种数据类型的常用操作方法汇总
string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。 string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。 string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
小勇DW3
2018/09/29
2K0
redis中各种数据类型的常用操作方法汇总
Redis的数据类型以及各类型的操作
 点击中⽂官⽹查看命令⽂档http://redis.cn/commands.html
汪凡
2019/02/22
6930
C#进行Redis操作
由于一些程序是用.net来写的,刚好要访问以前的redis库,于是就找一些redis的.net客户端。
sparkexpert
2022/05/07
3640
C#进行Redis操作
Redis学习系列四Hash(字典)
Redis中的Hash字典相当于C#中的Hashtable,是一种无序字典,内存存储了很对的键值对,实现上和Hashtable一样,都是"数组+链表"二维结构,都是对关键字(键值)进行散列操作,讲关键字散列到Hashtable中的某一个槽位中去,这个过程中如果发生了碰撞,散列函数可能将不同的关键字散列到Hashtable中的同一个槽位中去,通过"链表的方式"进行连接。
郑小超.
2018/12/28
6360
Redis学习系列二之.Net开发环境搭建及基础数据结构String字符串
Redis有5种基本数据结构,分别是string、list(列表)、hash(字典)、set(集合)、zset(有序集合),这是必须掌握的5种基本数据结构.注意Redis作为一个键值对缓存系统,其所有的数据结构,都以唯一的key(字符串)作为名称,然后通过key来获取对应的数据.
郑小超.
2018/12/28
6730
NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装
  随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类型的Web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题:
Edison Zhou
2018/08/20
3500
NoSQL初探之人人都爱Redis:(1)Redis简介与简单安装
Redis6数据类型篇
redis是一种高级的key:value存储系统,其中value支持五种数据类型:
大忽悠爱学习
2021/11/15
3900
Redis从入门到精通(二)C#中使用redis及封装Redis工具类
上一篇讲述了安装redis《Redis总结(一)Redis安装》,同时也大致介绍了redis的优势和应用场景。本篇着重讲解.NET中如何使用redis和C#。
架构师精进
2020/05/24
10.3K0
相关推荐
NoSQL初探之人人都爱Redis:(4)Redis主从复制架构初步探索
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验