由于我们在大型互联网项目当中,用户访问量比较大,比较多,会产生并发问题,对于此,我们该如何解决呢,Redis横空出世,首先,我们来简单的认识一下Redis,详细介绍如下所示:

Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。Redis纯粹为应用而产生,她是一个高性能的Key-Value数据库,并且操作了多种语言的API性能测试将诶过表示SET操作每秒钟可达110000次,GET操作每秒81000次,当然不同的服务器配置性能不同,redis目前提供五种数据类型,string(字符串),list(链表),hash(哈希),set(集合)及zset(sorted set)有序集合。说到Redis,小伙伴们可能会想到Memcached,小编给小伙伴们推荐一篇文章,文中详细的描述了Redis和Memcached,有兴趣的小伙伴可以点击相关链接,进行查看哦`(*∩_∩*)′

在前面的介绍中,我们知道,redis目前提供五种数据类型,string(字符串)、list(链表)、hash(哈希)、set(集合)、zset(sorted set)有序集合,那么这些是如何进行存储的呢?下面小编来详细的介绍一下。

第一步,我们需要新建一个空白项目,如下图所示:


         第二步,添加一个控制台应用程序,如下图所示:


         第三步,有三个dll文件,redis为c#开放的API,我们就是通过她来操作redis,为此,我们需要引用dll文件,点击浏览,如下图所示:

第四步,找到需要引用的dll文件,如下图所示:

接着,我们就来看如何对数据类型进行存储,首先我们来看String类型,String类型是最常用的一种数据类型,普通的key/value存储都可以归为此类,一个key对应一个value,string类型二进制的,Redis的string可以包含任何数据,比如jpg或者序列化的对象,我们来看具体的代码该如何编写,代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServiceStack.Redis;

namespace RedisApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //字符串类型
            var client = new RedisClient("local", 6379); //首先new一个客户端
            client.Set<string>("name", "laowang");       // 存储字符串类型
            string userName = client.Get<string>("name");  //通过get取值
            Console.WriteLine(userName);
            Console.ReadKey();

         }
    }
}

接着,我们来看哈希表的存储,hash是一个string类型的field和value的映射表,hash特别适合存储对象,相对于讲对象的每个字段存成单个string类型,一个对象存储在hash类型中会占用更少的内存,而且可以更方便的存取整个对象。作为一个key  value存在,很多开发者自然的使用set/get方式来使用Redis,实际上这并不是最优化的使用方法,尤其在未启用VM情况下,Redis全部数据需要放入内存,节约内存尤其重要,我们来看具体的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServiceStack.Redis;

namespace RedisApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //字符串类型
            var client = new RedisClient("local", 6379); //首先new一个客户端
            client.Set<string>("name", "laowang");       // 存储字符串类型
            string userName = client.Get<string>("name");  //通过get取值
            Console.WriteLine(userName);
            Console.ReadKey();

            //哈希存储结果
            client.SetEntryInHash("userinfoId", "name", "zhangsan");
            client.GetHashKeys("userinfoId"); //获取所有的key
            client.GetHashValues("userinfoId"); //获取所有的值

          }
    }
}

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServiceStack.Redis;

namespace RedisApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //字符串类型
            var client = new RedisClient("local", 6379); //首先new一个客户端
            client.Set<string>("name", "laowang");       // 存储字符串类型
            string userName = client.Get<string>("name");  //通过get取值
            Console.WriteLine(userName);
            Console.ReadKey();

            //哈希存储结果
            client.SetEntryInHash("userinfoId", "name", "zhangsan");
            client.GetHashKeys("userinfoId"); //获取所有的key
            client.GetHashValues("userinfoId"); //获取所有的值

            //队列使用
            client.EnqueueItemOnList("name1", "laowang");//入队
            client.EnqueueItemOnList("name1", "laoma");//入队
            int length = client.GetListCount("nama1");
            for (int i = 0; i < length; i++)
            {
                Console.WriteLine(client.DequeueItemFromList("name1")); //出队
            }

            //栈的使用
            client.PushItemToList("name2", "laowang");//入栈
            client.PushItemToList("name2", "laoma");
            int lentgh = client.GetListCount("name2");
            {
                Console.WriteLine(client.PopItemFromList("name2"));//出栈
            }

        }
    }
}

Set类型
        她是string类型的无序集合,set是通过hash table实现的,添加、删除和查找,对集合我们可以取并集、交集、差集。对Set类型进行操作,如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServiceStack.Redis;

namespace RedisApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //字符串类型
            var client = new RedisClient("local", 6379); //首先new一个客户端
            client.Set<string>("name", "laowang");       // 存储字符串类型
            string userName = client.Get<string>("name");  //通过get取值
            Console.WriteLine(userName);
            Console.ReadKey();

            //哈希存储结果
            client.SetEntryInHash("userinfoId", "name", "zhangsan");
            client.GetHashKeys("userinfoId"); //获取所有的key
            client.GetHashValues("userinfoId"); //获取所有的值

            //队列使用
            client.EnqueueItemOnList("name1", "laowang");//入队
            client.EnqueueItemOnList("name1", "laoma");//入队
            int length = client.GetListCount("nama1");
            for (int i = 0; i < length; i++)
            {
                Console.WriteLine(client.DequeueItemFromList("name1")); //出队
            }

            //栈的使用
            client.PushItemToList("name2", "laowang");//入栈
            client.PushItemToList("name2", "laoma");
            int lentgh = client.GetListCount("name2");
            {
                Console.WriteLine(client.PopItemFromList("name2"));//出栈
            }

            //对Set类型进行操作
            client.AddItemToSet("a3", "ddd");
            client.AddItemToSet("a3", "ccc");
            client.AddItemToSet("a3", "ttt");
            client.AddItemToSet("a3", "sss");
            client.AddItemToSet("a3", "hhh");
            System.Collections.Generic.HashSet<string> hashset = client.GetAllItemsFromSet("a3");
            foreach (string str in hashset)
            {
                Console.WriteLine(str);
            }

        }
    }
}

Sorted Set类型
       Sorted set是set的一个升级版本,她是在set的基础撒花姑娘增加了一个顺序的属性,这一个属性在添加修改,元素的时候可以指定,每次指定后,zset(表示有序集合)会自动重新按新的值调整顺序,可以理解为有序列的表,一列存value,一列存顺序,操作中key理解为zset的名字。Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(scord)的参数来为成员排序,并且是插入有序的,即自动排序,当你需要一个有序的并且不重复的集合列表,那么可以选择sorted set数据结构,代码如下所示:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ServiceStack.Redis;

namespace RedisApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //字符串类型
            var client = new RedisClient("local", 6379); //首先new一个客户端
            client.Set<string>("name", "laowang");       // 存储字符串类型
            string userName = client.Get<string>("name");  //通过get取值
            Console.WriteLine(userName);
            Console.ReadKey();

            //哈希存储结果
            client.SetEntryInHash("userinfoId", "name", "zhangsan");
            client.GetHashKeys("userinfoId"); //获取所有的key
            client.GetHashValues("userinfoId"); //获取所有的值

            //队列使用
            client.EnqueueItemOnList("name1", "laowang");//入队
            client.EnqueueItemOnList("name1", "laoma");//入队
            int length = client.GetListCount("nama1");
            for (int i = 0; i < length; i++)
            {
                Console.WriteLine(client.DequeueItemFromList("name1")); //出队
            }

            //栈的使用
            client.PushItemToList("name2", "laowang");//入栈
            client.PushItemToList("name2", "laoma");
            int lentgh = client.GetListCount("name2");
            {
                Console.WriteLine(client.PopItemFromList("name2"));//出栈
            }

            //对Set类型进行操作
            client.AddItemToSet("a3", "ddd");
            client.AddItemToSet("a3", "ccc");
            client.AddItemToSet("a3", "ttt");
            client.AddItemToSet("a3", "sss");
            client.AddItemToSet("a3", "hhh");
            System.Collections.Generic.HashSet<string> hashset = client.GetAllItemsFromSet("a3");
            foreach (string str in hashset)
            {
                Console.WriteLine(str);
            }

            //Sorted Set类型
            client.AddItemToSortedSet("a5", "ffff");
            client.AddItemToSortedSet("a5", "bbbb");
            client.AddItemToSortedSet("a5", "gggg");
            client.AddItemToSortedSet("a5", "cccc");
            client.AddItemToSortedSet("a5", "aaaa");
            System.Collections.Generic.List<string> list = client.GetAllItemsFromSortedSet("a5");
            foreach (string str in list)
            {
                Console.WriteLine(str);
            }

        }
    }
}

小编寄语:该博客,小编主要简单的介绍了一下Redis和数据存储的类型,在redis中还有一个很重要的事儿,差点儿忘了,文件并发(日志处理),多线程操作同一个文件时会出现并发问题,解决的一个办法就是给文件加锁(lock),但是这样的话,一个线程操作文件时,其他的都得等待,这样的话性能非常差,另外一个解决方案,就是先将数据放在队列中,然后开启一个线程,负责从队列中取出数据,再写到文件中。对于这块的内容小编还不是很理解,还请各位小伙伴多多指教哦`(*∩_∩*)′!

Redis简介以及数据类型存储的更多相关文章

  1. Redis简介、与memcached比较、存储方式、应用场景、生产经验教训、安全设置、key的建议、安装和常用数据类型介绍、ServiceStack.Redis使用(1)

    1.NOSQL简介 nosql的产生并不是要彻底的代替关系型数据库,而是作为传统关系型数据库的一个补充. Facebook和360使用Cassandra来存储海量社交数据 Twitter在其url抓取 ...

  2. Redis 安装,配置,简介,数据类型(一)

      Redis 安装 Window 下安装 下载地址:https://github.com/MSOpenTech/redis/releases. Redis 支持 32 位和 64 位.这个需要根据你 ...

  3. redis简介、安装、配置和数据类型

    redis简介.安装.配置和数据类型 redis简介 Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理. 它支持字符串.哈希表.列表.集合.有序集合, ...

  4. 【Redis】一、Redis简介及五种数据类型

    (一)Redis简介   Redis(Remote Dictionary Server)是一个使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value的开源 ...

  5. NoSQL和Redis简介及Redis在Windows下的安装和使用教程

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/103.html?1455869099 NoSQL简介 介绍redis前,我 ...

  6. redis简介以及与memcached比较

    一.redis (1)简介: Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.是noSql数据库的一种. re ...

  7. 1. redis简介

    一. redis简介 Redis是一种面向"键/值"对数据类型的内存数据库,可以满足我们对海量数据的读写需求. redis的键只能是字符串,redis的值支持多种数据类型: (1) ...

  8. redis中各种数据类型对应的jedis操作命令

    redis中各种数据类型对应的jedis操作命令 一.常用数据类型简介: redis常用五种数据类型:string,hash,list,set,zset(sorted set). 1.String类型 ...

  9. Redis简介与简单安装

    Redis简介与简单安装   一.NoSQL的风生水起 1.1 后Web2.0时代的发展要求 随着互联网Web2.0网站的兴起,传统的关系数据库在应付Web2.0网站,特别是超大规模和高并发的SNS类 ...

随机推荐

  1. 洛谷4月月赛R1 Happy Poppin' Party Train

    来自FallDream的博客,未经允许,请勿转载,谢谢. 听学长说的就来玩一玩,随便乱打打  没想到一堆人被取消了成绩,莫名混了个Rank3 还有第一题数据肯定是有问题 --------------- ...

  2. 【译】基于主机的卡仿真(Host-based Card Emulation)

    基于主机的卡仿真(Host-based Card Emulation) 能提供NFC功能很多Android手机已经支持NFC卡模拟.在大多数情况下,该卡是由设备中的单独的芯片仿真,所谓的安全元件.由无 ...

  3. Python类的定义

    Python笔记--类定义 一.类定义: class <类名>: <语句> 类实例化后,可以使用其属性,实际上,创建一个类之后,可以通过类名访问其属性 如果直接使用类名修改其属 ...

  4. HashSet与TreeSet

    1.TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值 2.HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个nu ...

  5. Python安装与环境变量的配置

    python下载: Python安装包下载地址:http://www.python.org/ 根据实际的操作系统,安装合适的安装版本. Python安装: 本文以python 2.7.8(64位)为例 ...

  6. 使用FFMPEG在windows平台下推rtmp流

    使用FFMPEG在windows平台下推rtmp流 工作中习惯在Linux下面使用FFmpeg模拟推rtmp流,无奈家中的电脑都是windows系统,需要利用家中的带宽来测试流媒体服务器的性能.所以研 ...

  7. Docker环境 ELK 快速部署

    Docker环境 ELK快速部署 环境 Centos 7.4 , Docker version 17.12 Docker至少3GB内存: #内核配置 echo ' vm.max_map_count = ...

  8. 【机器学习】从SVM到SVR

    注:最近在工作中,高频率的接触到了SVM模型,而且还有使用SVM模型做回归的情况,即SVR.另外考虑到自己从第一次知道这个模型到现在也差不多两年时间了,从最开始的腾云驾雾到现在有了一点直观的认识,花费 ...

  9. 十大豪门推送sdk,哪个更适合你

    转自:http://jingyan.baidu.com/article/d621e8da0fd7042865913ff5.html 推送,使得开发者可以即时地向其应用程序的用户推送通知或者消息,与用户 ...

  10. 团队项目必备神器——自定义Lint

    Lint 在android studio中内置了大概200个左右的lint检查,比如定义变量未使用,直接Handler报内存泄漏提醒,时时刻刻在监督着我们的代码.自己定制了一些Lint规则,项目开源在 ...