Redis简介以及数据类型存储

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介:         由于我们在大型互联网项目当中,用户访问量比较大,比较多,会产生并发问题,对于此,我们该如何解决呢,Redis横空出世,首先,我们来简单的认识一下Redis,详细介绍如下所示:         Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。

        由于我们在大型互联网项目当中,用户访问量比较大,比较多,会产生并发问题,对于此,我们该如何解决呢,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实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
3月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
121 1
|
19天前
|
存储 缓存 NoSQL
解决Redis缓存数据类型丢失问题
解决Redis缓存数据类型丢失问题
164 85
|
3月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
87 6
|
21天前
|
存储 消息中间件 监控
Redis Stream:实时数据流的处理与存储
通过上述分析和具体操作示例,您可以更好地理解和应用 Redis Stream,满足各种实时数据处理需求。
59 14
|
3月前
|
存储 消息中间件 缓存
Redis 简介
10月更文挑战第14天
143 58
|
1月前
|
存储 NoSQL Redis
redis常见数据类型
Redis 是一种基于内存的键值存储数据库,支持字符串、哈希表、列表、集合及有序集合等多种数据类型,每种类型均有特定用途与适用场景,提供丰富的命令操作,适用于高速数据访问与处理。
47 5
|
2月前
|
存储 NoSQL 算法
Redis分片集群中数据是怎么存储和读取的 ?
Redis集群采用哈希槽分区算法,共有16384个哈希槽,每个槽分配到不同的Redis节点上。数据操作时,通过CRC16算法对key计算并取模,确定其所属的槽和对应的节点,从而实现高效的数据存取。
62 13
|
2月前
|
存储 消息中间件 NoSQL
使用Java操作Redis数据类型的详解指南
通过使用Jedis库,可以在Java中方便地操作Redis的各种数据类型。本文详细介绍了字符串、哈希、列表、集合和有序集合的基本操作及其对应的Java实现。这些示例展示了如何使用Java与Redis进行交互,为开发高效的Redis客户端应用程序提供了基础。希望本文的指南能帮助您更好地理解和使用Redis,提升应用程序的性能和可靠性。
46 1
|
3月前
|
存储 消息中间件 NoSQL
Redis 数据类型
10月更文挑战第15天
51 1
|
2月前
|
存储 NoSQL Redis
【赵渝强老师】Redis的存储结构
Redis 默认配置包含 16 个数据库,通过 `databases` 参数设置。每个数据库编号从 0 开始,默认连接 0 号数据库,可通过 `SELECT &lt;dbid&gt;` 切换。Redis 的核心存储结构包括 `dict`、`expires` 等字段,用于处理键值和过期行为。添加键时需指定数据库信息。视频讲解和代码示例详见内容。
下一篇
开通oss服务