引言
Redis是一个实时的数据库技术,主要采用键值操作来存储数据的,但支持许多不同类型的值:字符串,列表,集合,排序集,哈希值。
Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
本文主要讲述的是如何使用C#语言来进行Redis分布式缓存的程序编写。
一. 在本地或是服务器安装Redis
Redis对于Linux是官方支持的,安装和使用没有什么好说的,普通使用按照官方指导,5分钟以内就能搞定。详情请参考:
http://redis.io/download
Redis官方是不支持windows的,只是 Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,项目地址是:
https://github.com/MSOpenTech/redis/releases
下载解压,在解压后的bin目录下有以下这些文件:
[plain] view plain copy 在CODE上查看代码片派生到我的代码片
redis-benchmark.exe #基准测试
redis-check-aof.exe # aof
redis-check-dump.exe # dump
redis-cli.exe # 客户端
redis-server.exe # 服务器
redis.windows.conf # 配置文件
当然,还有一个 RedisService.docx 文件,是一些启动和安装服务的说明文档。
【需要用Administrator用户运行,如果不是管理员账户就会出各种问题,服务安装以后启动不了等等问题,应该可以修改服务的属性–>登录用户等选项来修正.】
1.1 启动redis服务
Win+R 打开CMD命令,把路径换成你redis文件的路径,启动redis服务,运行 redis-server.exe redis.windows.conf ,出现如下图的图形表示redis服务启动成功。
1.2 把redis增加为windows的服务,脚本如下
这时不能关闭该窗口,窗口关闭则redis服务也关闭了,解决办法是将redis安装到系统中,作为服务运行。
1.2.1 在redis的目录下执行(执行后就作为windows服务了)
redis-server --service-install redis.windows.conf
注:可以安装多个实例,可以制作成startup.bat文件
1.2.2 安装好后需要手动启动redis
redis-server --service-start
1.2.3 停止服务
redis-server --service-start
1.2.4 卸载redis服务
redis-server --service-uninstall
可以使用自带的客户端工具进行测试。
双击打开 redis-cli.exe , 如果不报错,则连接上了本地服务器,然后测试,比如 set命令,get命令:
二. Redis可视化工具
一款基于Qt5的跨平台Redis桌面管理软件:Redis Desktop Manager
支持: Windows 7+, Mac OS X 10.10+, Ubuntu 14+
特点: C++ 编写,响应迅速,性能好。但不支持数据库备份与恢复。
开源并托管在github上: https://github.com/uglide/RedisDesktopManager
首先配置redis连接,建议加上密码,设置redis的密码百度大把的,这里我们直接修改redis.windows.conf文件,打开它,找到# requirepass foobared (#打头的表示此行是注释说明状态,去掉#就是配置状态),我们修改下,去掉#,配置一个密码(或者干脆另起一行,照着写就是)
下面在控制台里面用redis命令添加一个key:
重新加载看下:
三. C# 中操作redis数据库(增加)
3.1 新建控制台程序RedisApp
在项目名称上右击,选择“管理NuGet程序包”
搜索并安装”StackExchange.Redis”安装包
安装完成后,工程中新增packages.config
工程目录
搜索并安装“Newtonsoft.Json”安装包
3.2 添加UserInfoDto.cs用户实体
public class UserInfoDto
{
public int Id { get; set; }
public string StaffId { get; set; }
public string StaffName { get; set; }
public string Password { get; set; }
public System.DateTime LastLoginTime { get; set; }
}
3.3 添加Redis数据库辅助操作类RedisHelper.cs
public class RedisHelper
{
static ConfigurationOptions configurationOptions = ConfigurationOptions.Parse("127.0.0.1" + ":" + "6379");
static ConnectionMultiplexer redisConn;
public static ConnectionMultiplexer RedisConn
{
get
{
return ConnectionMultiplexer.Connect(configurationOptions);
}
}
}
3.4 添加Redis数据库业务实现类RedisDemo.cs
public class RedisDemo
{
public static void StringTest()
{
using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
{
string key = "StringTest";
var db = conn.GetDatabase();
if (db.KeyExists(key))
db.KeyDelete(key);
db.StringAppend(key, DateTime.Now.ToString());
Console.WriteLine("写入字符串结束");
Console.ReadLine();
Console.WriteLine(db.StringGet(key));
Console.ReadLine();
}
}
public static void HashSetTest()
{
List<UserInfoDto> list = new List<UserInfoDto>();
for (int i = 0; i < 100; i++)
{
list.Add(new UserInfoDto()
{
Id = i,
LastLoginTime = DateTime.Now,
Password = "password" + i.ToString(),
StaffId = "StaffId_" + i.ToString(),
StaffName = "StaffName_" + i.ToString()
});
}
using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
{
string key = "HashSetTest";
var db = conn.GetDatabase();
db.KeyDelete(key);
//string listKey = IdentityMap.CreateKey<UserInfoDto>();
HashEntry[] items = new HashEntry[list.Count];
for (int i = 0; i < list.Count - 1; i++)
{
string json = JsonConvert.SerializeObject(list[i]);
db.HashSet(key, list[i].Id, json);
//db.HashSet(key, "password", list[i].Password);
//db.HashSet(key, "StaffId", list[i].StaffId);
Console.WriteLine(db.HashGet(key, list[i].Id));
}
}
Console.ReadLine();
}
public static void SetTest()
{
List<UserInfoDto> list = new List<UserInfoDto>();
DateTime dt = DateTime.Now;
for (int i = 0; i < 10; i++)
{
list.Add(new UserInfoDto()
{
Id = i,
LastLoginTime = dt,
Password = "password" + i.ToString(),
StaffId = "StaffId_" + i.ToString(),
StaffName = "StaffName_" + i.ToString()
});
}
using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
{
string key = "SetTest:";
var db = conn.GetDatabase();
db.KeyDelete(key);
//string listKey = IdentityMap.CreateKey<UserInfoDto>();
HashEntry[] items = new HashEntry[list.Count];
for (int i = 0; i < list.Count; i++)
{
string json = JsonConvert.SerializeObject(list[i]);
db.KeyDelete(key + list[i].Id.ToString());
//db.SetAdd(key + list[i].Id.ToString(), json);
db.SetAdd(key + list[i].Id.ToString() + ":name", list[i].StaffName);
db.SetAdd(key + list[i].Id.ToString() + ":StaffId", list[i].StaffId);
var result = db.SetScan(key, "*password99*").FirstOrDefault();
Console.WriteLine(result);
}
}
Console.WriteLine("Complete!");
Console.ReadLine();
}
public static void ListTest()
{
using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
{
string key = "ListTest";
var db = conn.GetDatabase();
for (int i = 0; i < 10; i++)
{
db.ListLeftPush(key, "string_" + i.ToString());
}
Console.WriteLine("写入完成");
Console.ReadLine();
while (0 != db.ListLength(key))
{
//从redis数据库弹出List里的数据
var str = db.ListRightPop(key);
Console.WriteLine(str);
}
Console.ReadLine();
}
}
public static void SortedSet()
{
List<UserInfoDto> list = new List<UserInfoDto>();
for (int i = 0; i < 10; i++)
{
list.Add(new UserInfoDto()
{
Id = i,
LastLoginTime = DateTime.Now,
Password = "password" + i.ToString(),
StaffId = "StaffId_" + i.ToString(),
StaffName = "StaffName_" + i.ToString()
});
}
using (ConnectionMultiplexer conn = RedisHelper.RedisConn)
{
string key = "SortedSetTest:";
var db = conn.GetDatabase();
db.KeyDelete("SortedSetTest");
foreach (var item in list)
{
string json = JsonConvert.SerializeObject(item);
db.KeyDelete(key + item.Id.ToString());
db.KeyDelete("SortedSetTest" + item.Id.ToString() + ":name");
db.KeyDelete("SortedSetTest" + item.Id.ToString() + ":StaffId");
//db.SetAdd(key + list[i].Id.ToString(), json);
db.SortedSetAdd(key + item.Id.ToString() + ":name", item.StaffName, item.Id);
db.SortedSetAdd(key + item.Id.ToString() + ":StaffId", item.StaffName, item.Id);
}
Console.WriteLine("写入完成");
Console.ReadLine();
Console.WriteLine("读取两条记录");
var result = db.SortedSetRangeByRank(key, 9, 10);
for (int i = 0; i < result.Length; i++)
{
Console.WriteLine(result[i]);
}
var result2 = db.SortedSetRangeByRankWithScores(key, 0, -1, Order.Descending);
var result3 = db.SortedSetScan(key, "*99*", 10).ToList();
for (int i = 0; i < result3.Count; i++)
{
Console.WriteLine(result3[i]);
}
Console.ReadLine();
}
}
}
3.5 Program.cs类
class Program
{
static void Main(string[] args)
{
//字符串
RedisDemo.StringTest();
//Hash
//RedisDemo.HashTest();
//List
//RedisDemo.ListTest();
//Console.ReadKey();
//Set
//RedisDemo.SetTest();
//SortedSet
//RedisDemo.SortedSet();
}
}
运行结果:
参考文章:
https://blog.youkuaiyun.com/renfufei/article/details/38474435
https://blog.youkuaiyun.com/chinahuyong/article/details/51753996