.net Redis缓存服务搭建及实现数据读写

来源:互联网 发布:网络攻防渗透 编辑:程序博客网 时间:2024/06/05 07:12

转载自:http://www.cnblogs.com/lc-chenlong/archive/2013/07/26/3218157.html

发现博客园中好多大牛在介绍自己的开源项目是很少用到缓存,比如Memcached、Redis、mongodb等,今天得空抽时间把Redis缓存研究了一下,写下来总结一下,跟大家一起分享 一下。由于小弟水平有限又是第一次接触Redis,有些的不对的地方欢迎指出纠正。

1、  下载安装Redis

下载地址:https://github.com/MSOpenTech/Redis。

2、  安装Redis

     在下载的文件中找到bin并打开。

  

  • redis-server.exe:服务程序(目前我们只用到这一个)
  • redis-check-dump.exe:本地数据库检查
  •  redis-check-aof.exe:更新日志检查
  •  redis-benchmark.exe:性能测试,用以模拟同时由N个客户端发送M个 SETs/GETs 查询 (类似于 Apache 的ab 工具).

Redis有很多配置参数,这里就不介绍了,有兴趣的朋友可以到网上查查。

双击redis-server.exe或者在命令窗口中输入D:\redis-2.6\redis-server.exe即可启动Redis服务。

 

 注意端口号:Port:6379 在我们的程序中会用到该端口号。

3、  数据读、写、删测试,并实现list存数。

首先引用下面四个DLL文件

 

复制代码
using System;using System.Collections.Generic;using System.Linq;using System.Text;using ServiceStack.Redis;using ServiceStack.Text;using ServiceStack.Redis.Generic;namespace RedisStudy{    public class RedisHelper:IDisposable    {        public RedisClient Redis = new RedisClient("127.0.0.1", 6379);        //缓存池        PooledRedisClientManager prcm = new PooledRedisClientManager();                //默认缓存过期时间单位秒        public int secondsTimeOut = 30 * 60;               /// <summary>        /// 缓冲池        /// </summary>        /// <param name="readWriteHosts"></param>        /// <param name="readOnlyHosts"></param>        /// <returns></returns>        public static PooledRedisClientManager CreateManager(         string[] readWriteHosts, string[] readOnlyHosts)        {            return new PooledRedisClientManager(readWriteHosts, readOnlyHosts,                new RedisClientManagerConfig                {                    MaxWritePoolSize = readWriteHosts.Length * 5,                    MaxReadPoolSize = readOnlyHosts.Length * 5,                    AutoStart = true,                });// { RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) };                   }        /// <summary>        /// 构造函数        /// </summary>        /// <param name="OpenPooledRedis">是否开启缓冲池</param>        public RedisHelper(bool OpenPooledRedis=false)        {                        if (OpenPooledRedis)            {                prcm = CreateManager(new string[] { "127.0.0.1:6379" }, new string[] { "127.0.0.1:6379" });                Redis = prcm.GetClient() as RedisClient;            }        }        #region Key/Value存储        /// <summary>        /// 设置缓存        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="key">缓存建</param>        /// <param name="t">缓存值</param>        /// <param name="timeout">过期时间,单位秒,-1:不过期,0:默认过期时间</param>        /// <returns></returns>        public bool Set<T>(string key, T t, int timeout = 0)        {            if (timeout >= 0)            {                if (timeout > 0)                {                    secondsTimeOut = timeout;                }                Redis.Expire(key, secondsTimeOut);            }                        return Redis.Add<T>(key, t);        }        /// <summary>        /// 获取        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="key"></param>        /// <returns></returns>        public T Get<T>(string key)        {            return Redis.Get<T>(key);        }        /// <summary>        /// 删除        /// </summary>        /// <param name="key"></param>        /// <returns></returns>        public bool Remove(string key)        {            return Redis.Remove(key);        }        public bool Add<T>(string key, T t, int timeout)        {            if (timeout >= 0)            {                if (timeout > 0)                {                    secondsTimeOut = timeout;                }                Redis.Expire(key, secondsTimeOut);            }            return Redis.Add<T>(key, t);        }        #endregion        #region 链表操作        /// <summary>        /// 根据IEnumerable数据添加链表        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="listId"></param>        /// <param name="values"></param>        /// <param name="timeout"></param>        public void AddList<T>(string listId, IEnumerable<T> values, int timeout = 0)        {            Redis.Expire(listId,60);            IRedisTypedClient<T> iredisClient = Redis.As<T>();            if (timeout >= 0)            {                if (timeout > 0)                {                    secondsTimeOut = timeout;                }                Redis.Expire(listId, secondsTimeOut);            }            var redisList = iredisClient.Lists[listId];            redisList.AddRange(values);            iredisClient.Save();        }        /// <summary>        /// 添加单个实体到链表中        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="listId"></param>        /// <param name="Item"></param>        /// <param name="timeout"></param>        public void AddEntityToList<T>(string listId, T Item, int timeout = 0)        {            IRedisTypedClient<T> iredisClient = Redis.As<T>();            if (timeout >= 0)            {                if (timeout > 0)                {                    secondsTimeOut = timeout;                }                Redis.Expire(listId, secondsTimeOut);            }            var redisList = iredisClient.Lists[listId];            redisList.Add(Item);            iredisClient.Save();        }        /// <summary>        /// 获取链表        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="listId"></param>        /// <returns></returns>        public IEnumerable<T> GetList<T>(string listId)        {            IRedisTypedClient<T> iredisClient = Redis.As<T>();            return iredisClient.Lists[listId];        }        /// <summary>        /// 在链表中删除单个实体        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="listId"></param>        /// <param name="t"></param>        public void RemoveEntityFromList<T>(string listId, T t)        {            IRedisTypedClient<T> iredisClient = Redis.As<T>();            var redisList = iredisClient.Lists[listId];            redisList.RemoveValue(t);            iredisClient.Save();        }        /// <summary>        /// 根据lambada表达式删除符合条件的实体        /// </summary>        /// <typeparam name="T"></typeparam>        /// <param name="listId"></param>        /// <param name="func"></param>        public void RemoveEntityFromList<T>(string listId, Func<T,bool> func)        {            using (IRedisTypedClient<T> iredisClient = Redis.As<T>())            {                var redisList = iredisClient.Lists[listId];                T value = redisList.Where(func).FirstOrDefault();                redisList.RemoveValue(value);                iredisClient.Save();            }        }        #endregion        //释放资源        public void Dispose()        {            if (Redis != null)            {                Redis.Dispose();                Redis = null;            }            GC.Collect();        }    }}
复制代码

 

4、  测试

复制代码
using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Threading;namespace RedisStudy{    public class User    {        public string Name { get; set; }        public int Id { get; set; }    }    class Program    {        static RedisHelper redisHelper = new RedisHelper(true);                static void Main(string[] args)        {            User u = new User() { Name = "eric1", Id = 1 };            redisHelper.Set<User>("user", u);//设置缓存            u=redisHelper.Get<User>("user");            Console.WriteLine(u.Name);                        List<User> list = new List<User>()            {                new User(){Name="eric1",Id=1},                 new User(){Name="eric2",Id=2}            };                       redisHelper.Remove("list1");//删除缓存            redisHelper.AddList<User>("list1", list);//添加缓存链表            redisHelper.AddEntityToList<User>("list1", new User() { Name = "eric3",Id=3 });            list = redisHelper.GetList<User>("list1").ToList();            Console.WriteLine(list.Count);            redisHelper.RemoveEntityFromList<User>("list1", list[0]);            redisHelper.RemoveEntityFromList<User>("list1", it => it.Id == 2);            list = redisHelper.GetList<User>("list1").ToList();            Console.WriteLine(list.Count);            redisHelper.Dispose();            Console.ReadLine();                     }    }}
复制代码

 

整篇文章写的比较仓促,很多基本点都没有说明,有不懂的请百度一下。

如果你有好的学习NoSQl的资料欢迎交流。

Redis其他操作,点击查看

点击下载源码