zoukankan      html  css  js  c++  java
  • Redis入门

    Redis简介

    1.Redis是一个开源的,使用C语言编写,面向“键/值”对类型数据的分布式NoSQL数据库系统,特点是高性能,持久存储,适应高并发的应用场景。Redis纯粹为应用而产生,它是一个高性能的key-value数据库,并且提供了多种语言的API
    2.性能测试结果表示SET操作每秒钟可达110000次,GET操作每秒81000次(当然不同的服务器配置性能不同)。
    3.Redis目前提供五种数据类型:string(字符串),list(链表), Hash(哈希),set(集合)及zset(sorted set) (有序集合)
    4.Redis开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。对于RabbitMQ和Redis的入队和出队操作,各执行100万次,每10万次记录一次执行时间。测试数据分为128Bytes、5.512Bytes、1K和10K四个不同大小的数据。实验表明:入队时,当数据比较小时Redis的性能要高于RabbitMQ,而如果数据大小超过了10K,Redis则慢的无法忍受;出队时,无论数据大小,Redis都表现出非常好的性能,而RabbitMQ的出队性能则远低于Redis。

    服务端下载:https://github.com/MicrosoftArchive/redis/releases

    查看工具下载:http://redisdesktop.com/download

    Redis与Memcached的比较

    1.Memcached是多线程,而Redis使用单线程.
    2.Memcached使用预分配的内存池的方式,Redis使用现场申请内存的方式来存储数据,并且可以配置虚拟内存。
    3.Redis可以实现持久化,主从复制,实现故障恢复。
    4.Memcached只是简单的key与value,但是Redis支持数据类型比较多。
    Redis的存储分为内存存储、磁盘存储 .从这一点,也说明了Redis与Memcached是有区别的。Redis 与Memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改 操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
    Redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复重建时间会非常长,这样导致失去aof高可用性本意。另外更重要的是Redis是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。
    其实aof目的主要是数据可靠性及高可用性.

     C#驱动

    <package id="ServiceStack.Common" version="4.5.8" targetFramework="net45" />
    <package id="ServiceStack.Interfaces" version="4.5.8" targetFramework="net45" />
    <package id="ServiceStack.Redis" version="4.5.8" targetFramework="net45" />
    <package id="ServiceStack.Text" version="4.5.8" targetFramework="net45" />

    Redis常用数据类型

    1.String类型

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

    namespace RedisTest
    {
        class Program
        {
            static void Main(string[] args)
            {
                var client = new RedisClient("127.0.0.1", 6379);
                client.Set<int>("pwd", 1111);
                int pwd = client.Get<int>("pwd");
                Console.WriteLine(pwd);
    
                UserInfo userInfo = new UserInfo() { UserName = "zhangsan", UserPwd = "1111" };//(底层使用json序列化 )  
                client.Set<UserInfo>("userInfo", userInfo);
                UserInfo user = client.Get<UserInfo>("userInfo");
                Console.WriteLine(user.UserName);
    
                List<UserInfo> list = new List<UserInfo>() { new UserInfo() { UserName = "lisi", UserPwd = "111" }, new UserInfo() { UserName = "wangwu", UserPwd = "123" } };
                client.Set<List<UserInfo>>("list", list);
                List<UserInfo> userInfoList = client.Get<List<UserInfo>>("list");
    
                foreach (UserInfo t in userInfoList)
                {
                    Console.WriteLine(t.UserName);
                }
    
                Console.ReadLine();
            }
        }
    
        class UserInfo
        {
            public string UserName { get; set; }
            public string UserPwd { get; set; }
        }
    }

    2.Hash类型

    Hash对应的Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个HashMap的成员比较少时,Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,当成员量增大时会自动转成真正的HashMap.
    Key仍然是用户ID, value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过其内部Map的Key(Redis里称内部Map的key为field), 也就是通过 key(用户ID) + field(属性标签) 就可以操作对应属性数据了,既不需要重复存储数据,也不会带来序列化和反序列化

        class Program
        {
            static void Main(string[] args)
            {
                var client = new RedisClient("127.0.0.1", 6379);
                client.SetEntryInHash("user", "A", "aaaaa");
                client.SetEntryInHash("user", "B", "aaaaa");
                client.SetEntryInHash("user", "C", "aaaaa");
                List<string> list = client.GetHashKeys("user");
                Console.ReadLine();
            }
        }

    3.List类型

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

        class Program
        {
            static void Main(string[] args)
            {
                var client = new RedisClient("127.0.0.1", 6379);
                //队列使用  
    
                client.EnqueueItemOnList("name", "zhangsan");
                client.EnqueueItemOnList("name", "lisi");
                long count = client.GetListCount("name");
                for (int i = 0; i < count; i++)
                {
                    Console.WriteLine(client.DequeueItemFromList("name"));
                }
    
                //栈使用  
                client.PushItemToList("name2", "wangwu");
                client.PushItemToList("name2", "maliu");
                long count1 = client.GetListCount("name2");
                for (int i = 0; i < count; i++)
                {
                    Console.WriteLine(client.PopItemFromList("name2"));
                }
                Console.ReadLine();
            }
        }

    4.Set类型

            static void Main(string[] args)
            {
                var client = new RedisClient("127.0.0.1", 6379);
                //队列使用  
    
                //对Set类型进行操作  
                client.AddItemToSet("a3", "ddd");
                client.AddItemToSet("a3", "ccc");
                client.AddItemToSet("a3", "tttt");
                client.AddItemToSet("a3", "sssh");
                client.AddItemToSet("a3", "hhhh");
                System.Collections.Generic.HashSet<string> hashset = client.GetAllItemsFromSet("a3");
                foreach (string str in hashset)
                {
                    Console.WriteLine(str);
                }
    
                //求并集  
                client.AddItemToSet("a3", "ddd");
                client.AddItemToSet("a3", "ccc");
                client.AddItemToSet("a3", "tttt");
                client.AddItemToSet("a3", "sssh");
                client.AddItemToSet("a3", "hhhh");
                client.AddItemToSet("a4", "hhhh");
                client.AddItemToSet("a4", "h777");
                System.Collections.Generic.HashSet<string> hashset1 = client.GetUnionFromSets(new string[] { "a3", "a4" });
    
                foreach (string str in hashset)
                {
                    Console.WriteLine(str);
                }
    
                //求交集  
                System.Collections.Generic.HashSet<string> hashset2 = client.GetIntersectFromSets(new string[] { "a3", "a4" });
    
                //求差集.  
                System.Collections.Generic.HashSet<string> hashset3 = client.GetDifferencesFromSet("a3", new string[] { "a4" });
                Console.ReadLine();
            }

    5.Sorted Set类型

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

        class Program
        {
            static void Main(string[] args)
            {
                var client = new RedisClient("127.0.0.1", 6379);
         
                client.AddItemToSortedSet("a5", "ffff");
                client.AddItemToSortedSet("a5", "bbbb");
                client.AddItemToSortedSet("a5", "gggg");
                client.AddItemToSortedSet("a5", "cccc");
                client.AddItemToSortedSet("a5", "aaaa");
                client.AddItemToSortedSet("a5", "aaaa");//重复无效
                System.Collections.Generic.List<string> list = client.GetAllItemsFromSortedSet("a5");
                foreach (string str in list)
                {
                    Console.WriteLine(str);
                }
                Console.ReadLine();
            }
        }

    redis修改密码

    修改配置的文件是 redis.windows-service.conf  文件 不是 redis.windows.conf 

    C:Program FilesRedis edis.windows-service.conf  文件    requirepass 111111 

    bind 0.0.0.0 不限制ip

    var client = new RedisClient("127.0.0.1", 6379,"111111");  

  • 相关阅读:
    Eric 的随机文件名 生成方法
    .NET模板引擎 EFPlatform.CodeGenerator (代码生成器 静态页生成 生成HTML 模板)
    Eric的行政区(省市)下列表控件和标签控件
    下载网页中远程图片的方法
    一起来玩Twister(扭扭乐)
    ASP.NET 安全认证(四)——巧妙实现 Form 表单认证跨站点、跨服务器的单点登录(Single Sign On) .
    DataList的编辑、更新、删除、全选、分页以及 <EditItemTemplate>模版中的DropDownList的数据绑定
    ASP.NET 安全认证(三)—— 用Form 表单认证实现单点登录(Single Sign On) .
    C# 中的委托和事件
    ASP.Net获取当前运行文件的文件名称
  • 原文地址:https://www.cnblogs.com/lgxlsm/p/6672799.html
Copyright © 2011-2022 走看看