1.前言

  a.Redis是一个开源,先进的key-value(键/值对)存储,并且勇于构建高性能,可扩展的Web应用程序的完美解决方案

  b.Redis和Memcached的对比

    b.1 Redis数据库完全在内存中,使用磁盘仅用于持久性

    b.2 相比较许多键值对存储,redis拥有更加丰富的数据类型,

Redis提供的五种数据类型: string(字符串)、hash(哈希表) list(双向队列)、set(集合)和zset(有序集合)

    b.3 Redis可以将数据复制到任意数量的从服务器

  c.Redis拥有的优势

    c.1 Redis的执行响应速度非常快

    c.2 支持丰富的数据类型

    c.3 原子性,保证了如果两个客户端同事访问的Redis服务器将获得更新后的值

    c.4 多功能实用工具,Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列实用,任何短暂的数据,应用程序。

  d.Github下载地址:https://github.com/kencery/Common/tree/master/KenceryCommonMethod/%E7%BC%93%E5%AD%98

  e.Redis学习:http://www.redis.io/

// 源文件头信息:
// <copyright file="RedisHelper.cs">
// Copyright(c)2014-2034 Kencery.All rights reserved.
// 个人博客:http://www.cnblogs.com/hanyinglong
// 创建人:韩迎龙(kencery)
// 创建时间:2015-8-18
// </copyright> using System;
using System.Collections.Generic;
using System.Configuration;
using ServiceStack.Redis; namespace KenceryCommonMethod
{
/// <summary>
/// Redis缓存读取设置 封装
/// <auther>
/// <name>Kencery</name>
/// <date>2015-8-18</date>
/// </auther>
/// </summary>
public static class RedisHelper
{
/// <summary>
/// 创建Redis连接池管理对象(添加ServiceStack.Interfaces.dll、ServiceStack.Redis.dll)
/// </summary>
/// <param name="readWriteHosts">只写服务器</param>
/// <param name="readOnlyHosts">只读服务器</param>
/// <returns></returns>
private static PooledRedisClientManager CreateRedisManager(IEnumerable<string> readWriteHosts,
IEnumerable<string> readOnlyHosts)
{
//支持读写分离,均衡负载
return new PooledRedisClientManager(readWriteHosts, readOnlyHosts, new RedisClientManagerConfig
{
MaxWritePoolSize = , //“写”链接池数
MaxReadPoolSize = , //“读”链接池数
AutoStart = true,
});
} /// <summary>
/// 调用CreateRedisManager方法,创建连接池管理对象,Redis服务器地址在配置文件中配置(创建只读,只写连接池)
/// <add key="RedisHosts" value="127.0.0.1:6379" />
/// </summary>
private static readonly PooledRedisClientManager Prcm = CreateRedisManager(
ConfigurationManager.AppSettings["Hosts"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries),
ConfigurationManager.AppSettings["Hosts"].Split(",".ToCharArray(), StringSplitOptions.RemoveEmptyEntries)); /// <summary>
/// 给缓存中添加数据,使用:RedisHelper.Set(key,值(需要存放的值));
/// </summary>
/// <typeparam name="T">缓存类型</typeparam>
/// <param name="key">键</param>
/// <param name="val">值</param>
public static void Set<T>(string key, T val)
{
using (IRedisClient rdc = Prcm.GetClient())
{
rdc.Set<T>(key, val);
}
} /// <summary>
/// 读取缓存中的数据,使用:var result=RedisHelper.Get<T>(key);
/// </summary>
/// <typeparam name="T">返回读取的数据</typeparam>
/// <param name="key">键</param>
/// <returns></returns>
public static T Get<T>(string key) where T : class
{
using (IRedisClient rdc = Prcm.GetReadOnlyClient())
{
return rdc.Get<T>(key);
}
} /// <summary>
/// 删除缓存中的数据,使用 RedisHelper.Remove(key);
/// </summary>
/// <param name="key">键</param>
public static void Remove(string key)
{
using (IRedisClient rdc = Prcm.GetClient())
{
rdc.Remove(key);
}
} /// <summary>
/// 缓存中是否包含查询的键数据,使用 var isTrue=RedisHelper.ContainsKey(key);
/// </summary>
/// <param name="key">键</param>
/// <returns>如果包含,返回true,否则返回false</returns>
public static bool ContainsKey(string key)
{
using (IRedisClient rdc = Prcm.GetReadOnlyClient())
{
return rdc.ContainsKey(key);
}
} /// <summary>
/// 给缓存中添加Object对象,使用:RedisHelper.Add(key,值(需要存放的值))
/// </summary>
/// <param name="key">键</param>
/// <param name="value">值</param>
public static void Add(string key, object value)
{
using (IRedisClient rdc = Prcm.GetClient())
{
if (!rdc.ContainsKey(key))
{
rdc.Add(key, value, DateTime.Now.AddMinutes());
}
else
{
rdc.Set(key, value);
}
}
} /// <summary>
/// 根据key刷新缓存中的数据信息,使用:RedisHelper.RefreshCache(key)
/// </summary>
/// <typeparam name="T">缓存类型</typeparam>
/// <param name="key">键</param>
public static void RefreshCache<T>(string key) where T : class
{
using (IRedisClient rdc = Prcm.GetClient())
{
var value = rdc.Get<T>(key);
rdc.Remove(key);
rdc.Set<T>(key, value);
}
} /// <summary>
/// 根据key集合信息读取缓存中的键值对,返回字典形式的数据存放,使用:RedisHelper.GetList(keys);
/// </summary>
/// <param name="keys">key集合</param>
/// <returns>返回字典集合</returns>
public static Dictionary<string, string> GetList(List<string> keys)
{
using (IRedisClient rdc = Prcm.GetReadOnlyClient())
{
return rdc.GetValuesMap<string>(keys);
}
} /// <summary>
/// 将字典集合添加到缓存中,使用:RedisHelper.Set(values);
/// </summary>
/// <param name="values">字典集合信息</param>
public static void Set(Dictionary<string, string> values)
{
using (IRedisClient rdc = Prcm.GetReadOnlyClient())
{
rdc.SetAll(values);
}
} }
}

Redis:高性能文件缓存key-value储存的更多相关文章

  1. 高性能文件缓存key-value存储—Redis

    1.高性能文件缓存key-value存储-Memcached 2.ASP.NET HttpRuntime.Cache缓存类使用总结 备注:三篇博文结合阅读,简单理解并且使用,如果想深入学习,请多参考文 ...

  2. 高性能文件缓存key-value存储—Memcached

    1.高性能文件缓存key-value存储—Redis 2.ASP.NET HttpRuntime.Cache缓存类使用总结 备注:三篇博文结合阅读,简单理解并且使用,如果想深入学习,请多参考文章中给出 ...

  3. 知乎技术分享:从单机到2000万QPS并发的Redis高性能缓存实践之路

    本文来自知乎官方技术团队的“知乎技术专栏”,感谢原作者陈鹏的无私分享. 1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动 ...

  4. 构建高性能数据库缓存之redis主从复制

    一.什么是redis主从复制? 主从复制,当用户往Master端写入数据时,通过Redis Sync机制将数据文件发送至Slave,Slave也会执行相同的操作确保数据一致:且实现Redis的主从复制 ...

  5. 从单机到2000万 QPS 并发的 Redis 高性能缓存实践之路

    1.引言 知乎存储平台团队基于开源Redis 组件打造的知乎 Redis 平台,经过不断的研发迭代,目前已经形成了一整套完整自动化运维服务体系,提供很多强大的功能.本文作者陈鹏是该系统的负责人,本次文 ...

  6. 构建高性能数据库缓存之redis(二)

    一.概述 在构建高性能数据库缓存之redis(一)这篇文档中,阐述了Redis数据库(key/value)的特点.功能以及简单的配置过程,相信阅读过这篇文档的朋友,对Redis数据库会有一点的了解,此 ...

  7. 本地测试读取redis和普通文件缓存的速度,redis慢一倍?

    重新测试了,换成了Linux服务器,php5.6,512内存.连续读取1千次不同的文件(每个文件41KB),redis也是1千个不同的key,文件缓存还是比redis快! 但是,但是,后来我换成连续读 ...

  8. redis删除单个key和多个key,ssdb会落地导致重启redis无法清除缓存

    redis删除单个key和多个key,ssdb会落地导致重启redis无法清除缓存,需要针对单个key进行删除 删除单个:del key 删除多个:redis-cli -a pass(密码) keys ...

  9. 高性能Web服务器Nginx的配置与部署研究(12)应用模块之Memcached做文件缓存时压缩引起的问题

    在上一篇文章中,提到的Nginx的Memcached模块应用场景,主要是作为文件缓存.然后就发现了一个问题,当以字节数组方式缓存较大的文件时,缓存数据会被压缩,从而在读取的时候出现问题. (本文欢迎转 ...

随机推荐

  1. 在Linux系统下mail命令的用法

    在Linux系统下mail命令的测试 1. 最简单的一个例子: mail -s test admin@aispider.com 这条命令的结果是发一封标题为test的空信给后面的邮箱,如果你有mta并 ...

  2. DIV垂直居中对齐

    效果图: CSS: #container{ display:table-cell; width:300px; height:300px; vertical-align:middle; border:1 ...

  3. 结合以太通道的VLAN配置

    实验要求:建立一条以太通道,并划分vlan,让同一vlan的主机能够通信,不同vlan的主机则不能通信 拓扑如下: 涉及内容有: 1.以太通道的建立和配置 2.vlan的创建和划分 配置如下: A e ...

  4. 转:openwrt 框架分析

    本文是本人对OpenWrt的Makefile的理解,并非转载.OpenWrt是一个典型的嵌入式Linux工程,了解OpenWrt的Makefile的工作过程对提高嵌入式Linux工程的开发能力有极其重 ...

  5. 何时使用SUM()与SUMX()

    概述 SUM()是一个聚合函数.在应用将影响公式的所有过滤器后,它会将您指定的单个列中的所有值相加.SUM()不知道行的存在(它不能逐行求值) - 它所能做的就是在应用过滤器之后将所有内容添加到它所呈 ...

  6. 【转载】 DeepMind用ReinforcementLearning玩游戏

    原文地址: https://blog.csdn.net/wishchin/article/details/42425145 原文 :  http://dataunion.org/?p=639 1.引言 ...

  7. jQuery的位置信息

    <head> <meta charset="UTF-8"> <title>jquery的位置信息</title> <style ...

  8. 【leetcode】409. Longest Palindrome

    problem 409. Longest Palindrome solution1: class Solution { public: int longestPalindrome(string s) ...

  9. builder模式-积木系列

    代码高效的表达意图,是优秀代码的基本标准,所以在刚刚写代码的时候我们总是被教育方法的名字,变量字段的名字要尽可能表达出在程序中的含义. 在<重构和模式>中提到的creation,就是讲构造 ...

  10. RNN 通过字符语言模型 理解BPTT

    链接:https://github.com/karpathy/char-rnn http://karpathy.github.io/2015/05/21/rnn-effectiveness/ http ...