zoukankan      html  css  js  c++  java
  • 【每日更新】【Redis学习】

    5.

    Redis订阅和发布模式和Redis事务

    -------------------Redis事务-------------------
    1、概念:
        redis中的事务是一组命令的集合。事务同命令一样都是redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行。
     
    2、事务的两种属性
        1、事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序的执行。事务在执行的过程中,不会被其他客户端发送过来的命令请求所打断。
        2、redis事务是原子。原子意味着要么所有的命令都执行,要么都不执行。

    4.

    String可以包含任何数据,比如jpg图片或者序列化的对象;string类型是Redis最基本的数据类型,一个键最大能存储512MB

    Hashes 是一个string类型的field和value的映射表,hash特别适合用于存储对象

     List列表类型可以存储一个有序的字符串列表,常用的操作时向列表两端添加元素,或者获得列表的某一个片段;列表类型内部是使用双向链表(double linked list)实现的,所以向列表两端添加元素的时间复杂度为O(I),获取越接近两端的元素,速度就越快。

    列表具有有序性,集合具有唯一性。

    集合Set:多个集合类型键之间还可以进行并集、交集、差集运算。

    有序集合Sort-Set...

    3.

    Redis是一个用的比较广泛的Key/Value的内存数据库,新浪微博、Github、StackOverflow 等大型应用中都用其作为 高速缓存。

    Redis本身没有提供Windows版本的,并且在Windows上也不太稳定,一般都将其部署到Linux环境下,Redis可以在其官网上下载

    Beetle.Redis虽然不够完整,但是我说几个优点:
    1、底层非常稳定,几乎没有性能损耗。
    2、连接数非常稳定,我用了整整一个月(经过了双十一的考验),一点问题都没有。
    3、代码量很小,只有十几个类,完全开源。

    2.

    RedisHelper帮助类

    public class RedisManager
     {
      private static PooledRedisClientManager prcm;
      /// <summary>
      /// 创建链接池管理对象
      /// </summary>
      private static void CreateManager()
      {
       string[] writeServerList = SplitString(RedisConfigInfo.WriteServerList, ",");
       string[] readServerList = SplitString(RedisConfigInfo.ReadServerList, ",");
       prcm = new PooledRedisClientManager(readServerList, writeServerList,
            new RedisClientManagerConfig
            {
             MaxWritePoolSize = RedisConfigInfo.MaxWritePoolSize,
             MaxReadPoolSize = RedisConfigInfo.MaxReadPoolSize,
             AutoStart = RedisConfigInfo.AutoStart,
            });
      }
      private static string[] SplitString(string strSource, string split)
      {
       return strSource.Split(split.ToArray());
      }
      /// <summary>
      /// 客户端缓存操作对象
      /// </summary>
      public static IRedisClient GetClient()
      {
       if (prcm == null)
        CreateManager();
       return prcm.GetClient();
      }
      /// <summary>
      /// 缓存默认24小时过期
      /// </summary>
      public static TimeSpan expiresIn = TimeSpan.FromHours(24);
      /// <summary>
      /// 设置一个键值对,默认24小时过期
      /// </summary>
      /// <typeparam name="T"></typeparam>
      /// <param name="key"></param>
      /// <param name="value"></param>
      /// <param name="redisClient"></param>
      /// <returns></returns>
      public static bool Set<T>(string key, T value, IRedisClient redisClient)
      {
       return redisClient.Set<T>(key, value, expiresIn);
      }
      /// <summary>
      /// 将某类数据插入到list中
      /// </summary>
      /// <typeparam name="T"></typeparam>
      /// <param name="key">一般是BiaoDiGuid</param>
      /// <param name="item"></param>
      /// <param name="redisClient"></param>
      public static void Add2List<T>(string key, T item, IRedisClient redisClient)
      {
       var redis = redisClient.As<T>();
       var list = redis.Lists[GetListKey(key)];
       list.Add(item);
      }
      /// <summary>
      /// 获取一个list
      /// </summary>
      /// <typeparam name="T"></typeparam>
      /// <param name="key"></param>
      /// <param name="redisClient"></param>
      /// <returns></returns>
      public static IRedisList<T> GetList<T>(string key, IRedisClient redisClient)
      {
       var redis = redisClient.As<T>();
       return redis.Lists[GetListKey(key)];
      }
      public static string GetListKey(string key, string prefix = null)
      {
       if (string.IsNullOrEmpty(prefix))
       {
        return "urn:" + key;
       }
       else
       {
        return "urn:" + prefix + ":" + key;
       }
      }
     }
    View Code

    配置设置

    3.3将参数写入配置文件
     
    <appSettings>
    <add key="WriteServerList" value="127.0.0.1:6379" />
    <add key="ReadServerList" value="127.0.0.1:6379" />
    <add key="MaxWritePoolSize" value="60" />
    <add key="MaxReadPoolSize" value="60" />
    <add key="AutoStart" value="true" />
    <add key="LocalCacheTime" value="1800" />
    <add key="RecordeLog" value="false" />
    </appSettings>
    3.4读取配置文件参数类
     
    public class RedisConfigInfo
    {
     public static string WriteServerList = ConfigurationManager.AppSettings["WriteServerList"];
     public static string ReadServerList = ConfigurationManager.AppSettings["ReadServerList"];
     public static int MaxWritePoolSize = Convert.ToInt32(ConfigurationManager.AppSettings["MaxWritePoolSize"]);
     public static int MaxReadPoolSize = Convert.ToInt32(ConfigurationManager.AppSettings["MaxReadPoolSize"]);
     public static int LocalCacheTime = Convert.ToInt32(ConfigurationManager.AppSettings["LocalCacheTime"]);
     public static bool AutoStart = ConfigurationManager.AppSettings["AutoStart"].Equals("true") ? true : false;
    }

    使用:

    protected void btn1_Click(object sender, EventArgs e)
      {
       string UserName;
       //读取数据,如果缓存存在直接从缓存中读取,否则从数据库读取然后写入redis
       using (var redisClient = RedisManager.GetClient())
       {
        UserName = redisClient.Get<string>("UserInfo_123");
        if (string.IsNullOrEmpty(UserName)) //初始化缓存
        {
         //TODO 从数据库中获取数据,并写入缓存
         UserName = "张三";
         redisClient.Set<string>("UserInfo_123", UserName, DateTime.Now.AddSeconds(10));
         lbtest.Text = "数据库数据:" + "张三";
         return;
        }
        lbtest.Text = "Redis缓存数据:" + UserName;
       }
      }

    Redis安装与启动

    1. 下载Redis

    Redis本身没有提供Windows版本的,并且在Windows上也不太稳定,一般都将其部署到Linux环境下,Redis可以在其官网上下载, MSOpenTech中提供了Windows版本,这里为了学习安装这一版本。

    Download Redis

    点击跳转到Github后,直接点击Zip下载。下载后根据自己计算机的版本选择32位或者64位进行安装。我将64位的解压后放到D:Redis文件夹下,同时将文件夹内的redis.conf也拷贝到该目录下,这个是redis的配置信息:

    Redis 64 bit

    2. 启动Redis

    在Windows下面启用Redis和启动MogoDB一样,需要使用命令行启动,首先定位到该目录,运行如下命令:

    D:Redis>redis-server.exe redis.conf

    Redis start

    因为是在本机运行的,这里要注意端口号,同时要保持端口不要关闭。

    当然您也可以将Redis作为Windows服务在后台一直开启。

    3. 使用

    现在再开一个控制台应用程序连接之前启动的Redis,如下:

    D:Redis>redis-cli.exe -h 172.16.147.121 -p 6379

    其中 –h后面是本机的ip地址,后面的是端口。

    然后就可以执行set 给key为city赋值:

    redis 172.16.147.121:6379> set city Shanghai

    通过get可以获取指定key为city的值了。

    redis 172.16.147.121:6379> get city

    Redis cmd

    同时,在我们往redis上写数据的时候,Redis服务也会定时的往文件中写数据

    redis server run background

    这里仅简单的介绍了get和set命令,更多命令可以查看 http://redis.io/commands

    .初探Redis

    下载ServiceStack.Redis

    和MongoDB一样,在.NET中使用Redis其实也是使用第三方驱动,官网推荐的是使用ServiceStack.Redis 下载后解压得到如下dll

    ServiceStackRedis

    .NET项目中使用Redis

    新建一个Console程序,引用上一步骤解压的四个dll。

    做一个简单的例子,在.NET中获取之前我们设置的city的值。

    class Program
    {
        static RedisClient redisClient = new RedisClient("172.16.147.121", 6379);//redis服务IP和端口
        static void Main(string[] args)
        {
            Console.WriteLine(redisClient.Get<string>("city"));
            Console.ReadKey();
        }
    }

    首先通过 static RedisClient redisClient = new RedisClient("172.16.147.121", 6379);

    建立连接 ,然后就可以直接用redisClient里面的Get方法获取 key为city的值了。

    output of the first redis application

    在前面的命令行中,我们网city中存入了Shanghai,现在我们获取到了这个值。

    ServerStack中有很多方法可以在.NET中调用,其类结构图如下:

    Redis-annotated

    总结

    本文简单介绍了Redis,Redis如何在Windows下安装,以及如何在.NET中使用访问和使用Redis,希望对您有所帮助,下文将讲解如何在.NET中网Redis中读写复杂对象。

  • 相关阅读:
    gateway 实现接口日志保存
    Spring Boot应用的Controller返回的集合类数据是XML格式的可能原因
    json 转list
    观察者模式
    Quartz定时任务整理
    java通过word模板生成word文档
    基于mysql的单据号生成(前缀+日期+自增id+后缀)
    Rabbitmq详解
    java.sql.SQLException: connection holder is null 问题处理
    为什么要用消息队列或消息队列的优缺点
  • 原文地址:https://www.cnblogs.com/x-poior/p/6446524.html
Copyright © 2011-2022 走看看