zoukankan      html  css  js  c++  java
  • 使用ServiceStackRedis操作redis

    .net程序开发时你可以在nuget里面下载ServiceStackRedis包来完成操作redis的工作;

    一、连接redis

       (1)RedisClient RedisClient = new RedisClient("10.0.4.227", 6379);//redis服务IP和端口

      (2)使用PooledRedisClientManager  连接缓冲池中获取连接,使用完毕后还给连接池  

    //pasword@192.168.0.244:6379  redis服务器和端口@前的是密码
    string[] writeHosts = new string[] { "pasword@127.0.0.1:6379" };
    string[] readerHosts = new string[] { "pasword@127.0.0.1:6379" };
    PooledRedisClientManager RedisClientManager = new PooledRedisClientManager(writeHosts, readerHosts, new RedisClientManagerConfig
    {
    MaxWritePoolSize = 128,//“写”链接池链接数
    MaxReadPoolSize = 128,//“读”链接池链接数
    AutoStart = true,
    });
    
    RedisClientManager.GetClient();
    RedisClientManager.GetReadOnlyClient();//获取只读连接

    redis所有的操作在IRedisClient里面:

    IRedisClient的属性如下:

    属性

    说明

    ConnectTimeout 

    连接超时

    Db

    当前数据库的ID或下标

    DbSize 

    当前数据库的 key 的数量

    HadExceptions 

     

    Hashes 

    存储复杂对象,一个value中有几个field 

    Host 

    Redis的Server服务器主机地址

    Info 

    返回关于 Redis 服务器的各种信息和统计数值

    LastSave 

    最近一次 Redis 成功将数据保存到磁盘上的时间

    Lists 

    当前数据库中所有的List集合

    Password 

    密码

    Port 

    Redis的Server端口

    RetryCount 

    重试次数

    RetryTimeout 

    重试超时

    SendTimeout 

    发送超时

    Sets 

    当前数据库中所有的HashSet<T>集合

    SortedSets 

    当前数据库中所有的SortedSet<T>集合

    this[string key]

    通过索引的方式(key)访问一个字符串类型值

      代码示例:

     

            RClient.AddItemToSet("蜀国", "刘备");

            RClient.AddItemToSet("蜀国", "关羽");

            RClient.AddItemToSet("蜀国", "张飞");

     

            IHasNamed<IRedisSet> rr = RClient.Sets;

            HashSet<string> HashSetString = rr["蜀国"].GetAll();

            foreach (string str in HashSetString)

            {

                Response.Write(str);

            }

     

     

    二、IRedisClient数据操作

      1ICacheClient接口

      IRedisClient实现了接口ICacheClient,其中ICacheClient主要提供的功能如下:

    方法

    说明

    Add

    根据传入的key-value添加一条记录,当key已存在返回false

    FlushAll

    使所有缓存失效(清除Redis所有数据库的所有Key)

    Get

    根据传入的key获取一条记录的值

    GetAll

    根据传入的多个key获取多条记录的值

    Remove

    根据传入的key移除一条记录

    RemoveAll

    根据传入的多个key移除多条记录

    Replace

    根据传入的key覆盖一条记录的值,当key不存在不会添加

    Set

    根据传入的key修改一条记录的值,当key不存在则添加

    SetAll

    根据传入的多个key覆盖多条记录

    Increment

     

    Decrement

     

      特别说明,比如添加的主要方法包括两个重载,一个多了个DateTime类型参数,一个多了TimeSpan类型的参数。这两个都是缓存失效的时间(相当于缓存依赖里的绝对过期时间)。

    • DateTime失效点:到达该时间点,立即失效;
    • TimeSpan失效点:经过该时间段,立即失效;

      简单示例:

     

            public ActionResult Index()

            {

                RedisClientManagerConfig RedisConfig = new RedisClientManagerConfig();

                RedisConfig.AutoStart = true;

                RedisConfig.MaxReadPoolSize = 60;

                RedisConfig.MaxWritePoolSize = 60;

     

                PooledRedisClientManager prcm = new PooledRedisClientManager(new List<string>() { "127.0.0.1" }, new List<string>() { "127.0.0.1" }, RedisConfig);

     

                using (IRedisClient RClient = prcm.GetClient())

                {

                    RClient.Add("c1", "缓存1");

                    RClient.Set("c1", "缓存2");

                    RClient.Replace("c1", "缓存3");

                    Response.Write(RClient.Get<string>("c1"));

                    RClient.Remove("c1");

                    Response.Write(RClient.Get<string>("c1") == null);

                }

     

                return Content("");

            }

     

      2、简单功能

      当然,除了实现ICacheClient接口的功能外,对于基本操作,实际上也还有很多功能

    方法

    说明

    AppendToValue

    根据Key将参数value追加到原有值的结尾

    ContainsKey

    判断Key在本数据库内是否已被使用(包括各种类型、内置集合等等)

    GetAllKeys

    获取所有的Keys集合

    DecrementValue

    根据指定的Key,将值减1(仅整型有效)

    DecrementValueBy

    根据指定的Key,将值减去指定值(仅整型有效)

    IncrementValue

    根据指定的Key,将值加1(仅整型有效)

    IncrementValueBy

    根据指定的Key,将值加上指定值(仅整型有效)

    RenameKey

    重命名一个Key,值不变

    SearchKeys

    从数据库中查找名称相等的Keys的集合,特殊模式如h[ae]llo,仅英文有效。

    GetRandomKey

    随机获取一个已经被使用的Key

    GetValue

    根据Key获取值,只对string类型有效

    GetValues

    根据输入的多个Key获取多个值,支持泛型

    GetTimeToLive

    获取指定Key的项距离失效点的TimeSpan

    GetSortedSetCount

    获取已排序集合的项的数目,参数支持下标以及score筛选

    ExpireEntryAt

    根据指定的key设置一项的到期时间(DateTime)

    ExpireEntryIn

    根据指定的key设置一项的到期时间(TimeSpan)

    FlushDb

    清除本数据库的所有数据

    FlushAll

    清除所有数据库的所有数据

    Shutdown

    停止所有客户端,保存,关闭Redis服务

    Save

    保存数据DB文件到硬盘

    SaveAsync

    异步保存

    RewriteAppendOnlyFileAsync

    只在异步情况下将数据追加到服务器文件

    WriteAll

     

    PublishMessage

    将Message发送到指定的频道

    StoreObject

     

    GetValuesMap

    以键值对的方式返回值类型相同的多条数据,支持泛型与返回字符串。

    字符串

     

    SetEntry

    根据Key修改一个值,存在则覆盖。(只能设置字符串)

    SetEntryIfNotExists

    根据Key设置一个值,仅仅当Key不存在时有效,如Key已存在则不修改(只支持字符串)

    SetEntryIfNotExists

    根据Key设置一个值,返回旧值。

    GetEntryType

    根据Key获取当前存储的值是什么类型:

    None = 0
    String = 1
    List = 2
    Set = 3
    SortedSet = 4
    Hash = 5

      

      

      3、内置集合

      比如,IRedisClient支持在内部维护如下集合类型的数据:

    • List<T>
    • 排序的List<T>(.Net 4.0后的SortedSet)
    • HashSet<T>

      关于如下4种类型数据的操作:

    方法

    说明

    AddItemToList

    添加一个项到内部的List<T>

    AddItemToSet

    添加一个项到内部的HashSet<T>

    AddItemToSortedSet

    添加一个项到内部的排序List<T>,其中重载方法多了个score:排序值。优先按照score从小->大排序,否则按值小到大排序

    AddRangeToList

    一次过将参数中的List<T>中的多个值添加入内部的List<T>

    AddRangeToSet

    一次过将参数中的HashSet<T>中的多个值添加入内部的HashSet<T>

    AddRangeToSortedSet

    一次过将参数中的List<T>中的多个值添加到内部List<T>,重载方法的score表示排序值。

    GetAllItemsFromList

    获取指定ListId的内部List<T>的所有值

    GetAllItemsFromSet

    获取指定SetId的内部HashSet<T>的所有值

    GetAllItemsFromSortedSet

    获取指定ListId的内部已排序List<T>的所有值

    GetAllItemsFromSortedSetDesc

    获取指定ListId的内部已排序List<T>的所有值,不过获取的值是倒序排列后的。

    GetRangeFromList

    获取指定ListId的内部List<T>中指定下标范围的数据

    GetRangeFromSortedList

    获取指定ListId的内部已排序List<T>中指定下标范围的数据

    GetRangeFromSortedSet

    获取指定SetId的内部HashSet<T>中指定下标范围的数据

    GetRangeFromSortedSetByHighestScore

    获取指定SetId的内部HashSet<T>中按照score由高->低排序后的分值范围的数据,并且支持skip、take

    GetRangeFromSortedSetByLowestScore

    同上,只不过是按score分值由低->高取一定范围内的数据

    GetRangeFromSortedSetDesc

    按倒序获取内部HashSet<T>的指定下标范围内的数据

    GetRangeWithScoresFromSortedSet

    与From相同,只不过获取的是键值对,数据中带分值score

    GetRangeWithScoresFromSortedSetByHighestScore

    同上

    GetRangeWithScoresFromSortedSetByLowestScore

    同上

    GetRangeWithScoresFromSortedSetDesc

    同上

    GetAllWithScoresFromSortedSet

    获取指定ListId的已排序的内部List<T>与其score

    GetSortedItemsFromList

    从指定ListId的List<T>中获取按指定排序的集合,支持Skip,Take

    GetSortedEntryValues

    从指定ListId的List<T>中获取经过排序指定开始位置与个数的项

    RemoveAllFromList

    移除指定ListId的内部List<T>

    RemoveItemFromList

    移除指定ListId的内部List<T>中第二个参数值相等的那一项

    RemoveItemFromSet

    从指定SetId的内部HashSet<T>中移除与第二个参数值相等的那一项

    RemoveItemFromSortedSet

    从指定ListId中已排序的内部List<T>中移除值相等的那一项

    RemoveRangeFromSortedSet

    从指定ListId已排序的List<T>中移除指定下标范围的项

    RemoveRangeFromSortedSetByScore

    从指定ListId已排序的List<T>中移除指定score范围的项

    RemoveStartFromList

    从指定ListId移除开头那一项

    RemoveEndFromList

    从指定ListId移除末尾那项

    BlockingRemoveStartFromList

    阻塞地从指定ListId移除开头那一项

    BlockingRemoveStartFromLists

     

    RemoveEntry

    根据传入的多个ListId,清除多个内部List<T>

    RemoveAllLuaScripts

    清除所有的 Lua 脚本缓存

    RemoveEntryFromHash

     

    GetItemFromList

    根据ListId和下标获取一项

    GetItemIndexInSortedSet

    根据List和值,获取内置的排序后的List<T>的下标

    GetItemIndexInSortedSetDesc

    同上,不过顺序相反

    GetItemScoreInSortedSet

    根据传入的ListId和值获取内置List<T>项的score

    GetListCount

    根据ListId,获取内置的List<T>的项数

    GetSetCount

    根据SetId,获取内置的HashSet<T>的项数

    GetIntersectFromSets

    从输入的多个HashSet<T>的Id中获取交集

    GetUnionFromSets

    从输入的多个HashSet<T>的Id中获取并集

    GetRandomItemFromSet

    从指定ListId的集合中获取随机项

    StoreUnionFromSets

    将多个HashSet<T>,合并为第一个参数中的一个大HashSet<T>,第一个参数中的HashSet<T>原本可以不存在

    StoreUnionFromSortedSets

    将多个SortedSet<T>,合并为第一个参数中的一个大SortedSet<T>,第一个参数中的SortedSet<T>原本可以不存在

    StoreIntersectFromSets

    将交集结果保存在第一个参数的集合中,对HastSet<T>作用

    StoreIntersectFromSortedSets

    将交集结果保存在第一个参数的集合中,对SortedSet<T>作用

    EnqueueItemOnList

    将一个元素存入指定ListId的List<T>的头部

    DequeueItemFromList

    将指定ListId的List<T>末尾的那个元素出列,返回出列元素

    BlockingDequeueItemFromList

    将指定ListId的List<T>末尾的那个元素出列,区别是:会阻塞该List<T>,支持超时时间,返回出列元素

    BlockingDequeueItemFromLists

     

    BlockingPopItemFromList

    阻塞地将指定ListId的List<T>末尾的哪一个元素移除

    BlockingPopItemFromLists

     

    BlockingPopAndPushItemBetweenLists

    将第一个集合的元素移除并添加到第二个集合的头部,返回该元素,会同时阻塞两个集合

    PopItemFromList

    从指定ListId的List<T>末尾移除一项并返回

    PopItemFromSet

    从指定SetId的HashSet<T>末尾移除一项并返回

    PopItemWithHighestScoreFromSortedSet

    从指定SetId的HashSet<T>移除score最高的那一项

    PopItemWithLowestScoreFromSortedSet

    从指定SetId的HashSet<T>移除score最低的那一项

    PopAndPushItemBetweenLists

    将第一个集合的元素移除并添加到第二个集合的头部

    SetContainsItem

    判断指定SetId的HashSet<T>中是否包含指定的value(仅仅支持字符串)

    SortedSetContainsItem

    判断SortedSet是否包含一个键

    TrimList

    根据ListId裁剪内置集合,保留下去from->at之间(包含from于at)的元素,其余的裁去

    IncrementItemInSortedSet

    为指定ListId的集合中的value的分值score加上指定分值

    SetItemInList

    重新设置指定ListId和下标的value为指定值

    PushItemToList

    在指定ListId的内置List<T>中入列一个键值对,在末尾

    PrependItemToList

    将一个值插入到List<T>的最前面

    PrependRangeToList

    一次性添加多个值到指定ListId的内置List<T>中

    GetDifferencesFromSet

    返回存在于第一个集合,但是不存在于其他集合的数据。差集

    StoreDifferencesFromSet

    将求差集的结果保存在第一个参数的集合中

    MoveBetweenSets

    将元素从一个集合移动到另一个集合的开头。(删除与添加)

      下面仅给出一个List<T>与HashSet<T>的示例:

     

            //内部维护一个List<T>集合

            RClient.AddItemToList("蜀国", "刘备");

            RClient.AddItemToList("蜀国", "关羽");

            RClient.AddItemToList("蜀国", "张飞");

            List<string> ListString = RClient.GetAllItemsFromList("蜀国");

            foreach (string str in ListString)

            {

                Response.Write(str);    //输出 刘备 关羽 张飞

            }

                  

            RClient.AddItemToSet("魏国", "曹操");

            RClient.AddItemToSet("魏国", "曹操");

            RClient.AddItemToSet("魏国", "典韦");

            HashSet<string> HashSetString = RClient.GetAllItemsFromSet("魏国");

            foreach (string str in HashSetString)

            {

                Response.Write(str);    //输出 典韦 曹操

            }

     

       下面再给一个范围Range操作示例:

     

            //内部维护一个List<T>集合

            RClient.AddItemToSortedSet("蜀国", "刘备", 5);

            RClient.AddItemToSortedSet("蜀国", "关羽", 2);

            RClient.AddItemToSortedSet("蜀国", "张飞", 3);

            IDictionary<String,double> DicString = RClient.GetRangeWithScoresFromSortedSet("蜀国", 0, 2);

            foreach (var r in DicString)

            {

                Response.Write(r.Key + ":" + r.Value);    //输出

            }

     

       3、内置Hash

      内部维护一个HashTable

    方法

    说明

    SetEntryInHash

    设置一个键值对入Hash表,如果哈希表的key存在则覆盖

    SetEntryInHashIfNotExists

    当哈希表的key未被使用时,设置一个键值对如Hash表

    GetHashValues

    根据HashId获取多个改HashId下的多个值

    GetValuesFromHash

    根据HashId和Hash表的Key获取多个值(支持多个key)

    GetValueFromHash

    根据HashId和Hash表的Key获取单个值

    GetHashKeys

    获取指定HashId下的所有Key

    GetHashValues

    获取指定HashId下的所有值

    GetHashCount

    获取指定HashId下的所有Key数量

    HashContainsEntry

    判断指定HashId的哈希表中是否包含指定的Key

    IncrementValueInHash

    将指定HashId的哈希表中的值加上指定值

    StoreAsHash

    将一个对象存入Hash(支持泛型)

    GetFromHash

    根据Id从Hash表中取出对象(支持泛型)

    SetRangeInHash

    通过IEnumerable<KeyValuePair<string, string>>一次性设置多个值,当内部Hash的key不存在则添加,存在则覆盖

      代码示例:

            RClient.SetEntryInHash("xxx","key","123");

            List<KeyValuePair<string, string>> keyValuePairs = new List<KeyValuePair<string, string>>();

            KeyValuePair<string, string> kvp = new KeyValuePair<string, string>("key", "1");

            keyValuePairs.Add(kvp);

            RClient.SetRangeInHash("xxx", keyValuePairs);

      

      4Lua Script

      从 Redis 2.6.0 版本开始,通过内置的 Lua 解释器,可以执行各种Lua脚本。IRedisClient支持执行Lua脚本,其供用于执行Lua脚本的方法如下:

    方法

    说明

    LoadLuaScript

    将一个脚本装入脚本缓存,但并不立即运行它

    KillRunningLuaScript

    停止正在运行的指定Id的脚本

    ExecLuaAsInt

     

    ExecLuaAsList

     

    ExecLuaAsString

     

    ExecLuaShaAsInt

     

    ExecLuaShaAsList

     

    ExecLuaShaAsString

     

    HasLuaScript

    判断Lua脚本是否在脚本缓存里

    CalculateSha1

     

    WhichLuaScriptsExists

     

      关于Lua脚本可以到这里去了解:http://www.cnblogs.com/ly4cn/archive/2006/08/04/467550.html

      5、事务

      Redis中的事务

    方法

    说明

    Watch

    监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

    UnWatch

    取消 WATCH 命令对所有 key 的监视

    AcquireLock

    申请对一个Key加锁(期间其他对象不能访问)

    CreateTransaction

    创建一个事务,返回一个IRedisTransaction对象

    CreateSubscription

    创建一个订阅事件返回一个IRedisSubscription对象

    CreatePipeline

    返回一个IRedisPipeline对象

    IRedisTypedClient

      IRedisTypedClient类相当于IRedicClient的强类型版,其方法与属性大多数与IRedisClient类似。

      它支持在Redis中使用Linq查询的强大的类,它本身是一个泛型,IRedisClient的泛型方法As获得对象。

      其方法原型如下:

        IRedisTypedClient<T> As<T>();

      1、IEntityStore<T>接口内容

      其中IRedisTypedClient这个类实现了这个接口IEntityStore<T>,该接口要求提供的功能如下:

    方法 说明
    Delete 根据实体删除一条记录
    DeleteAll 全部删除
    DeleteById 根据Id删除一条记录
    DeleteByIds 根据输入的多个Id删除多条记录
    GetAll 获取所有该类型的记录
    GetById 根据Id获取一条记录
    GetByIds 根据输入的多个Id获取多条记录
    Store 根据传入的实体,添加一条记录
    StoreAll 根据传入的实体集合,添加多条记录

      Linq查询(针对于GetAll方法返回的IList<T>)示例:

    复制代码
            public ActionResult Index()
            {
                Person p1 = new Person() { Id = 1, Name = "刘备" };
                Person p2 = new Person() { Id = 2, Name = "关羽" };
                Person p3 = new Person() { Id = 3, Name = "张飞" };
                Person p4 = new Person() { Id = 4, Name = "曹操" };
                Person p5 = new Person() { Id = 5, Name = "典韦" };
                Person p6 = new Person() { Id = 6, Name = "郭嘉" };
                List<Person> ListPerson = new List<Person>() { p2,p3,p4,p5,p6 };
    
                using (IRedisClient RClient = prcm.GetClient())
                {
                    IRedisTypedClient<Person> IRPerson = RClient.As<Person>();
                    IRPerson.DeleteAll();
    
                    //------------------------------------------添加--------------------------------------------
    
                    //添加单条数据
                    IRPerson.Store(p1);
                    //添加多条数据
                    IRPerson.StoreAll(ListPerson);
    
                    //------------------------------------------查询--------------------------------------------
    
                    //Linq支持
                    Response.Write(IRPerson.GetAll().Where(m => m.Id == 1).First().Name);       //刘备
                    //注意,用IRedisTypedClient的对象IRPerson的Srore()添加的才能用IRPerson()方法读取
                    Response.Write(IRPerson.GetAll().First(m => m.Id == 2).Name);       //关羽
    
             //------------------------------------------删除--------------------------------------------
    
                    IRPerson.Delete(p1);    //删除 刘备
                    Response.Write(IRPerson.GetAll().Count());      //5
                    IRPerson.DeleteById(2); //删除 关羽
                    Response.Write(IRPerson.GetAll().Count());      //4
                    IRPerson.DeleteByIds(new List<int> { 3,4 });    //删除张飞 曹操
                    Response.Write(IRPerson.GetAll().Count());      //2
                    IRPerson.DeleteAll();   //全部删除
                    Response.Write(IRPerson.GetAll().Count());      //0
                }
    
                return Content("");
            }
    复制代码

      另外,由于该接口并没有实现修改的方法,所以修改还得通过IRedisClient的实例:

    复制代码
            public ActionResult Index()
            {
                PooledRedisClientManager prcm = new PooledRedisClientManager(new List<string>() { "127.0.0.1" }, new List<string>() { "127.0.0.1" }, RedisConfig);
    
                Person p1 = new Person() { Id = 1, Name = "刘备" };
                Person p2 = new Person() { Id = 2, Name = "关羽" };
                Person p3 = new Person() { Id = 3, Name = "张飞" };
                Person p4 = new Person() { Id = 4, Name = "曹操" };
                Person p5 = new Person() { Id = 5, Name = "典韦" };
                Person p6 = new Person() { Id = 6, Name = "郭嘉" };
                List<Person> ListPerson = new List<Person>() { p2,p3,p4,p5,p6 };
    
                using (IRedisClient RClient = prcm.GetClient())
                {
                    IRedisTypedClient<Person> IRPerson = RClient.As<Person>();
                    IRPerson.StoreAll(ListPerson);
    
                    //读取所有的Key
                    List<string> ListKeys = IRPerson.GetAllKeys();      
                    foreach (string key in ListKeys)
                    {
                        Response.Write(key  + "<br/>");
                    }
    
                    //修改的话只能通过Key修改
                    //urn:person:3
                    //urn:person:4
                    //urn:person:5
                    //ids:Person
                    //urn:person:1
                    //urn:person:6
                    //urn:person:2
                    Person p7 = new Person() { Id = 8, Name = "撼地神牛" };
                    RClient.Set("urn:person:1", p7);
                    Response.Write(IRPerson.GetAll().First(m => m.Id == 8).Name);   //输出 撼地神牛
                }
    
                return Content("");
            }
    复制代码
  • 相关阅读:
    python 执行sql得到字典格式数据
    python爬虫 url链接编码成gbk2312格式
    windows环境下elasticsearch安装教程(单节点)
    python SQLServer 存储图片
    爬虫的本质是和分布式爬虫的关系
    requests form data 请求 爬虫
    mysql 删除 binlog 日志文件
    查看mysql数据表的大小
    xshell 连接报错 Disconnected from remote host
    centos 7.3 安装 mysqldb 报错 EnvironmentError: mysql_config not found ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full command output.
  • 原文地址:https://www.cnblogs.com/shaner/p/4835674.html
Copyright © 2011-2022 走看看