介绍:
Redis 是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。Redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部分场合可以对关系数据库起到很好的补充作用。
补充:
支持存储的value类型相对更多,包括string、list、set、zset(sortedset –有序集合) 和hash(哈希类型)。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入磁盘或者把修改操作写入追加的记录文件,并且再次基础上实现了master-slave(主从)同步。Redis支持主从同步,数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器,这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。
Redus支持两种持久化方式:
1. Snapshotting(快照)也是默认方式。 把数据做一个备份,将数据存储到文件
2. Append-only file(aof)的方式
快照是默认的持久化方式,这种方式是将内存中数据以快照的方式写到二进制文件中,默认的文件名称为dump.rdb.可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key键修改就会自动做快照。
aof方式:由于快照方式是在一定间隔时间做一次,所以如果redis意外down掉的话,就会丢失最后一次快照后的所有修改。Aof比快照方式又更好的持久化性,是由于在使用aof时,redis会将每一个收到的写命令都通过write函数追加到文件中,当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。
文件说明:
Redis-server.exe : 服务程序
Redis-check-dumo.exe 本地数据库检查
Redis-check-aof.exe 更新日志检查
Redis-benchmark.exe 性能测试,用以模拟同时由N个客户端发送M个Sets/Gets查询
Redis-cli.exe 服务端开启后,我们的客户端就可以输入各种命令测试
Nuget 包安装
命令:Install-Packageservicestack.redis.5.0.2.nupkg
路径:C:\Program Files (x86)\Microsoft VisualStudio\2017\Enterprise\Common7\IDE (对应VS版本,错误会提示)
Redis部署参考地址:http://keenwon.com/1275.html (亲测好使)
GitHub 源码地址:https://github.com/MicrosoftArchive/redis 注意的是3.0以上才可支持集群部署
注册服务:redis-server --service-install redis.windows.conf --service-name RedisService_guanzhx
开启redis服务:redis-server--service-start --service-name RedisService_guanzhx
停止服务:redis-server --service-stop --service-name RedisService_guanzhx
卸载服务:redis-server --service-uninstall --service-nameRedisService_guanzhx
内存分配命令:
--maxmemory 例:redis-serverredis.windows.conf --maxmemory 200m
修改配置文件:redis.windows.conf
maxmemory 209715200 注意单位是字节
安装多实例:-port
命令:
redis-server --service-install–service-name redisService1 –port10001
redis-server --service-start –service-nameredisService1
redis-server --service-install–service-name redisService2 –port10002
redis-server --service-start –service-nameredisService2
redis-server --service-install–service-name redisService3 –port10003
redis-server --service-start –service-nameredisService3
C# 使用:
Nuget包获取到ServiceStack.Redis安装后可以得到下图所示的文件夹中的DLL,引用至项目即可。
RedisHelper类:
using ServiceStack.Redis;
using ServiceStack.Redis.Generic;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp1
{
public static class RedisHelper
{
private static RedisClient Redis = new RedisClient("127.0.0.1", 6379);
//缓存池
static PooledRedisClientManager prcm = new PooledRedisClientManager();
//默认缓存过期时间单位秒
private static int secondsTimeOut = 30 * 60;
private static readonly Dictionary<int, PooledRedisClientManager> pools = new Dictionary<int, PooledRedisClientManager>();
/// <summary>
/// 缓冲池
/// </summary>
/// <param name="readWriteHosts"></param>
/// <param name="readOnlyHosts"></param>
/// <returns></returns>
private static void CreateManager(
string[] readWriteHosts, string[] readOnlyHosts)
{
for (int i = 0; i <= 15; i++)
{
PooledRedisClientManager prc = new PooledRedisClientManager(readWriteHosts, readOnlyHosts,
new RedisClientManagerConfig
{
MaxWritePoolSize = readWriteHosts.Length * 5,
MaxReadPoolSize = readOnlyHosts.Length * 5,
AutoStart = true,
}, i, 200, 10);// { RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) };
pools.Add(i, prc);
}
}
public static PooledRedisClientManager ChooseRedisInstance(int database)
{
if (database > 16) return pools[0];
return pools[database];
}
/// <summary>
/// 构造函数
/// </summary>
/// <param name="openPooledRedis">是否开启缓冲池</param>
static RedisHelper()
{
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 static bool Set<T>(string key, T t, int timeout = 0, int db = 0)
{
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
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 static T Get<T>(string key, int db = 0)
{
Redis = (RedisClient)ChooseRedisInstance(db).GetClient();
return Redis.Get<T>(key);
}
/// <summary>
/// 删除
/// </summary>
/// <param name="key"></param>