本篇记录redis的第一期了解学习的过程,包括环境搭建、客户端、可视化管理器等初步的了解,新手快速全方位的了解并上手redis。

redis是什么我就不写了,请自行去中文官网查阅 http://www.redis.cn/

  1. 环境搭建

  redis资源可在StackExchange.Redis客户端的github上下载该客户端源码,RedisConfigs文件夹下自带3.0版本资源包https://github.com/StackExchange/StackExchange.Redis

  环境部署很简单,几句命令。首先把下载好的文件存放到要安装的盘符中,然后打开控制台程序用cd命令进入到目标文件夹。输入redis-server.exe redis.windows.conf 命令启动redis服务加载配置文件。

  

安装redis 提示it is a good idea to run make test redis无法安装_redis

  输入完回车就会出现一下画面,说明redis服务已经启动。

  

安装redis 提示it is a good idea to run make test redis无法安装_Redis_02

  服务启动完毕,开始连接。打开另一个控制台(不要关闭redis服务的控制台),同样的方式进入目标文件夹,输入redis-cli.exe -h 127.0.0.1 -p 6379 -a 123456(或者只输入redis-cli.exe)命令即可连接本地redis服务,其中6379是默认端口号,123456是默认密码。连接成功可以通过set user zhangsan  get user 等命令进行测试(命令详情可访问官网查看)。

  2. 代码实现(.net)

  环境搭建完毕,通过控制台也能连接访问这说明redis服务成功的在机器上运行了,更进一步我们通过一个demo去连接并操作redis。代码实现需要客户端支持,.net支持的redis客户端在官网都有描述,这里我只讲下StackExchange.Redis。源码地址上文已经给出,有兴趣研究的可自行下载。这里我简单讲下使用。打开vs创建一个控制台应用程序,右键该项目打开菜单中的管理nuget程序包。

  

安装redis 提示it is a good idea to run make test redis无法安装_客户端_03

  浏览中搜索StackExchange.Redis并安装

  

安装redis 提示it is a good idea to run make test redis无法安装_Redis_04

  客户端安装完成,下面就是使用。创建一个SERedisHelper类

  

/// <summary>
    /// Redis操作类
    /// </summary>
    public class SERedisHelper
    {
        private static string _conn = ConfigurationManager.AppSettings["SERedis"] ?? "127.0.0.1:6379";

        #region string类型
        /// <summary>
        /// 根据Key获取值
        /// </summary>
        /// <param name="key">键值</param>
        /// <returns>System.String.</returns>
        public static string StringGet(string key)
        {
            try
            {
                using (var client = ConnectionMultiplexer.Connect(_conn))
                {
                    return client.GetDatabase().StringGet(key);
                }
            }
            catch (Exception)
            {
                return null;
            }
        }

        /// <summary>
        /// 批量获取值
        /// </summary>
        public static string[] StringGetMany(string[] keyStrs)
        {
            var count = keyStrs.Length;
            var keys = new RedisKey[count];
            var addrs = new string[count];

            for (var i = 0; i < count; i++)
            {
                keys[i] = keyStrs[i];
            }
            try
            {
                using (var client = ConnectionMultiplexer.Connect(_conn))
                {
                    var values = client.GetDatabase().StringGet(keys);
                    for (var i = 0; i < values.Length; i++)
                    {
                        addrs[i] = values[i];
                    }
                    return addrs;
                }
            }
            catch (Exception)
            {
                return null;
            }
        }


        /// <summary>
        /// 单条存值
        /// </summary>
        /// <param name="key">key</param>
        /// <param name="value">The value.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public static bool StringSet(string key, string value)
        {

            using (var client = ConnectionMultiplexer.Connect(_conn))
            {
                return client.GetDatabase().StringSet(key, value);
            }
        }


        /// <summary>
        /// 批量存值
        /// </summary>
        /// <param name="keysStr">key</param>
        /// <param name="valuesStr">The value.</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public static bool StringSetMany(string[] keysStr, string[] valuesStr)
        {
            var count = keysStr.Length;
            var keyValuePair = new KeyValuePair<RedisKey, RedisValue>[count];
            for (int i = 0; i < count; i++)
            {
                keyValuePair[i] = new KeyValuePair<RedisKey, RedisValue>(keysStr[i], valuesStr[i]);
            }
            using (var client = ConnectionMultiplexer.Connect(_conn))
            {
                return client.GetDatabase().StringSet(keyValuePair);
            }
        }

        #endregion

        #region 泛型
        /// <summary>
        /// 存值并设置过期时间
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">key</param>
        /// <param name="t">实体</param>
        /// <param name="ts">过期时间间隔</param>
        /// <returns><c>true</c> if XXXX, <c>false</c> otherwise.</returns>
        public static bool Set<T>(string key, T t, TimeSpan ts)
        {
            var str = JsonConvert.SerializeObject(t);
            using (var client = ConnectionMultiplexer.Connect(_conn))
            {
                return client.GetDatabase().StringSet(key, str, ts);
            }
        }

        /// <summary>
        /// 
        /// 根据Key获取值
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key">The key.</param>
        /// <returns>T.</returns>
        public static T Get<T>(string key) where T : class
        {
            using (var client = ConnectionMultiplexer.Connect(_conn))
            {
                var strValue = client.GetDatabase().StringGet(key);
                return string.IsNullOrEmpty(strValue) ? null : JsonConvert.DeserializeObject<T>(strValue);
            }
        }
        #endregion
    }

 

  帮助类创建完毕,在Program.cs中使用即可。

  

var ts = new TimeSpan(0, 0, 1, 0, 1);
            Console.WriteLine("添加缓存");
            SERedisHelper.Set<string>("user", "zhangsan", ts);
            Console.WriteLine("获取缓存:" + SERedisHelper.Get<string>("user"));
            Console.ReadLine();

  这里注意低版本的redis过期时间不支持毫秒级,当然3.0没问题。调试运行即可看到结果。

  3. 总结

  本篇旨在快速上手了解redis,如有问题请多指点。

  最后贴出一点后续深入了解的资料(持续更新)


  再贴下官网地址http://www.redis.cn/topics/pipelining.html (官网总结的内容很全)。