发现博客园中好多大牛在介绍自己的开源项目是很少用到缓存,比如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(); } }
}

Redis缓存服务搭建及实现数据读写 - Eric.Chen的更多相关文章

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

    发现博客园中好多大牛在介绍自己的开源项目是很少用到缓存,比如Memcached.Redis.mongodb等,今天得空抽时间把Redis缓存研究了一下,写下来总结一下,跟大家一起分享 一下.由于小弟水 ...

  2. Redis缓存服务搭建及实现数据读写--转载

    来自 http://www.cnblogs.com/lc-chenlong/p/3218157.html 1.  下载安装Redis 下载地址:https://github.com/MSOpenTec ...

  3. 高级运维(六):源码安装Redis缓存服务、常用Redis数据库操作指令、配置Redis主从服务器

    一.源码安装Redis缓存服务 目标: 本案例要求先快速搭建好一台Redis服务器,并测试该缓存服务器: 1> 设置变量test,值为123 2> 查看变量test的值 3> 设置计 ...

  4. Windows Azure Redis 缓存服务

    8月20日,Windows Azure (中国版)开始提供Redis缓存服务,比较国际版的Microsoft Azure晚了差不多一年的时间.说实话,微软真不应该将这个重要的功能delay这么长时间, ...

  5. Redis 缓存服务配置与使用

    缓存服务器Couchbase另外一种选择Redis documentation http://redis.io/documentation http://redis.cn/documentation. ...

  6. Key-value数据库:Redis缓存服务

    Redis 是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.其提供了多种主流语言的客户端,方便使用:同时Redis支持主 ...

  7. Redis缓存相关

    Redis缓存服务搭建及实现数据读写 RedisHelper帮助类 /// <summary> /// Redis 帮助类文件 /// </summary> public cl ...

  8. 缓存工厂之Redis缓存

    这几天没有按照计划分享技术博文,主要是去医院了,这里一想到在医院经历的种种,我真的有话要说:医院里的医务人员曾经被吹捧为美丽+和蔼+可亲的天使,在经受5天左右相互接触后不得不让感慨:遇见的有些人员在挂 ...

  9. redis缓存设计

    1:缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...

随机推荐

  1. PropertyPlaceholderConfigurer 基本用法

    目录 一.PropertyPlaceholderConfigurer 的继承体系 二.PropertyPlaceholderConfigurer 的基本概念 三.PropertyPlaceholder ...

  2. MVC项目引用备注

    新建空的WEB应用 MVC Nuget引用:Microsoft.AspNet.MvcMicrosoft.AspNet.Web.Optimization 可选删除 Microsoft.CodeDom.P ...

  3. -[__NSCFString longValue]: unrecognized selector sent to instance

    You can use NSString methods intValue longLongValue. 这个使用longvalue会crash报上面的错误

  4. 老毛桃winpe优盘启动系统个性修改全攻略.(全)

    博主从05年开始接触计算机,不能说是高手也算个老菜了,当时装系统还是用蕃茄花园的光盘安装系统,后来在学校管理机房,哪台电脑坏了就硬盘对拷. 时到今日,重启系统的方法五花八门,其中使用最广的莫过于PE优 ...

  5. margin: 0 auto; 元素水平居中布局无效

    失效原因: 要给居中的元素一个宽度,否则无效. 该元素一定不能浮动或绝对定位,否则无效. 在HTML中使用<center></center>标签,需考虑好整体构架,否者全部元素 ...

  6. gulp是用来干什么的?(概念)

    当我们在使用gulp的时候,gulp到底用来干什么呢? 编译 sass 合并优化压缩 css 校验压缩 js 优化图片 添加文件指纹(md5) 组件化头部底部(include html) 实时自动刷新 ...

  7. mysql报错锦集

    MySQL 启动报错 - ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/lib/mysql/ ...

  8. DDR硬件设计要点详解(包括电源部分)

    转自 http://www.fairchildic.org/module/forum/thread-658-1-1.html (原帖包括详细的附件内容) 1. 电源 DDR的电源可以分为三类A.主电源 ...

  9. Hadoop 50090端口的页面, Replication的数字是真实的文件备份数吗? (不是)

    红色方框的部分,代表Hadoop系统,人工设定的文件备份数,但不是实际的备份数.文件备份数 不会大于集群机器的总数目(因为备份文件不会同时存在一台机器上,这样就没有意义),所以如果总集群数目是2,即使 ...

  10. yii框架之gii创建数据表相应的model类

    一.首先是在数据库中建立project须要的表: 二.然后,配置相应文件: 在project文件夹下yiiProject\protected\config\main.php.在50行定义了db应用组件 ...