C#之Redis

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C#之Redis
⼀ Redis是⼀种⽀持多种数据结构的键值对数据库
建议下载 .msi结尾的应⽤程序进⾏安装,会⾃动安装Redis服务
Redis默认是不能外⽹访问的
把Redis部署到本地请忽视下⾯
设置防⽕墙端⼝例外
更改redis.conf ⽂件
bind 127.0.0.1
protected-mode yes
更改为
# bind 127.0.0.1
protected-mode no
然后重启Redis服务,
1.2 Redis⽀持的数据类型:string、list、set、sortedset、geo(Redis 3.2以上版本),注意不同⽅法写⼊的值不能⽤混了,⽐如有写list的⽅法写⼊的值⽤获取字符串的⽅法去获取就有问题了。

1.3 Redis的优点:
⽀持多种复杂类型的数据结构
⾼命中的数据是运⾏在内存中的,数据最终还是可以保存到硬盘中,服务器重启后数据不会丢失
服务器是单线程的,来⾃所有客户端的所有命令都是串⾏执⾏的,不⽤担⼼并发修改的问题
⽀持消息订阅/通知机制,可以⽤作消息队列
key/value 最⼤长度允许512M
1.4 Redis的缺点:
Redis是单线程的,因此单个Redis的实例只能使⽤服务器的⼀个CPU核,不能充分发挥服务器的性能
⼆在 .Net中操作Redis
2.1 在 .net中主要使⽤两个开源的组件来操作Redis
1. StackExChange.Redis:依赖的组件少,操作接近原⽣的Redis操作
2. ServiceStack.Redis:依赖的组件较多,封装的程度较⾼
NuGet命令安装组件 Install-Package StackExChange.Redis
2.2 操作字符串类型的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14//创建⼀个连接,写⼊⼀个字符型数据然后读取
public async Task<ViewResult> Index()
{
//创建⼀个Redis连接因为提供了异步的⽅法,所以本⼈要玩⼀个骚操作
using(ConnectionMultiplexer conn = await ConnectionMultiplexer.ConnectAsync("***.**.**.***:6379")) {
IDatabase db = conn.GetDatabase();
//往Redis⾥⾯写⼊⼀个Key为name的字符串
bool flag= await db.StringSetAsync("name","123");
//读取数据
var a= db.StringGet("name");
}
return View();
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15//String类型可以⽤作计数器
public async Task<ViewResult> Index()
{
using(ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("120.25.161.171:6379,abortConnect = false")) {
IDatabase db = conn.GetDatabase();
//StringAppend向这个key的字符串追加内容,没有则创建,返回该字符串
var A = db.StringAppend("敢问是段友?","yes yes yes");
//StringIncrementAsync计数器,从0开始⾃加1,没有则从0开始,返回计数后的结果
long a = await db.StringIncrementAsync("天王盖地虎",1);
long b = Convert.ToInt64( db.StringGet("天王盖地虎"));
long c = db.StringDecrement("清风拂杨柳", 1);
}
return View();
}
2.3 操作List类型数据1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17public async Task<ViewResult> Index()
{
using(ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("***.**.***.***:6379,abortConnect = false")) {
IDatabase db = conn.GetDatabase();
for(int i = 0; i < 20; i++)
{
//往集合u哦便Push数据
var a= await db.ListLeftPushAsync("List1", ""+i+"");
}
//往集合右边Pop数据Pop读取了数据后数据会从集合中移除(消息队列)
RedisValue b = db.ListRightPop("List1");
//读取集合中全部数据,不会将数据移除
RedisValue[] c =await db.ListRangeAsync("List1");
}
return View();
}
2.5 Hash
value ⼜是⼀个“键值对集合”或者值是另外⼀个 Dictionary。

2.6 SortedSet类型的数据
如果对于数据遍历顺序有要求,可以使⽤ sortedset,他会按照打分来进⾏遍历。

1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31public async Task<ViewResult> Index()
{
using(ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("120.25.161.171:6379,abortConnect = false"))
{
IDatabase db = conn.GetDatabase();
//SortedSetIncrement ⽤于给Set数据的vaule排序
for(int i = 0; i < 5; i++)
{
var a = db.SortedSetIncrement("resou","⼩熊vs",1);
}
for(int i = 0; i < 3; i++)
{
var b = db.SortedSetIncrement("resou", "⽥伯光", 1);
}
for(int i = 0; i <6; i++)
{
var c = db.SortedSetIncrement("resou", "段正淳", 1);
}
SortedSetEntry[] d= db.SortedSetRangeByRankWithScores("resou");
foreach(var item in d)
{
Console.WriteLine(item);
}
//根据排序返回值,可以根据序号查询其中⼀部分;
//RedisValue[] SortedSetRangeByRank(RedisKey key, long start = 0, long stop = -1, Order order = Order.Ascending)
//根据排序返回值,可以只返回 start-stop 这个范围;
//RedisValue[] SortedSetRangeByScore(RedisKey key, double start = double.NegativeInfinity, double stop = double.PositiveInfinity, Exclude exclude = Exclude.None, Order order = Order.Ascending, long skip = 0, long take = -1)
}
return View();
}
2.5 Geo数据类型的基本操作
Geo 是 Redis 3.2 版本后新增的数据类型,⽤来保存兴趣点(POI,point of interest)的坐标信息。

可以实现计算两 POI 之间的距离、获取⼀个点周边指定距离的 POI。

1
2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22public async Task<ViewResult> Index()
{
using(ConnectionMultiplexer conn = ConnectionMultiplexer.Connect("120.25.161.171:6379,abortConnect = false")) {
IDatabase db = conn.GetDatabase();
//添加⼀个兴趣点
db.GeoAdd("hehe", new GeoEntry(11.22,12.23,"1"));
db.GeoAdd("hehe", new GeoEntry(11.32, 12.23, "2"));
db.GeoAdd("hehe", new GeoEntry(11.42, 12.23, "3"));
//根据点的主键获取坐标
GeoPosition? pos = db.GeoPosition("ShopsGeo", "1");
//计算两个兴趣点之间的距离
var a= db.GeoDistance("hehe","1","3",GeoUnit.Meters);
//计算某个兴趣点范围内其余的兴趣点
GeoRadiusResult[] grr= db.GeoRadius("hehe",1,10000,GeoUnit.Meters);
//计算⼀个经纬度范围内的距离
GeoRadiusResult[] grr2 = db.GeoRadius("hehe", 11.42, 12.23,1000, GeoUnit.Meters);
foreach(var item in grr)
{
Console.WriteLine(item.Member + ":"+ item.Distance + "⽶");
}
}
return View();
}
23
24
三 Redis批量操作
如果⼀次性执⾏多个Redis操作很多那么会很慢,可以使⽤批量操作。

主要有两种⽅式:
1)⼏乎所有的操作都⽀持数组类型,这样就可以⼀次性操作多条数据:⽐如 GeoAdd(RedisKey key, GeoEntry[] values)、SortedSetAdd(RedisKey key, SortedSetEntry[] values)
2)如果⼀次性的操作不是简单的同类型操作,那么就要使⽤批量模式:
IBatch batch = db.CreateBatch(); db.GeoAdd("ShopsGeo1", new GeoEntry(116.34039, 39.94218, "1")); db.StringSet("abc", "123"); batch.Execute();
会把当前连接的 CreateBatch()、Execute()之间的操作⼀次性提交给服务器。

相关文档
最新文档