一.StatckExchange.Redis的核心对象
1.ConnectionMultiplexer
private static conStr="localhost:6379";
private object obj;
private static ConnectionMultiplexer redis;
public static ConnectionMultiplexer red{
get{
if(redis==null)
{
lock(obj)
{
if(redis==null||!redis.IsConnected)
{
redis=ConnectionMultiplexer.Connect(conStr);
}
}
return redis;
}
}
}
2.String类型的基本存储
public async Task<IDatabase> Db()
{
return redis.GetDatabase();
}
public async Task<bool> AddKey(string key,string str)
{
if(await Db().StringSetAsync(key,str))
{
return true;
}
return false;
}
public async Task<string> Get(string key)
{
string str=await Db().StringGet(key);
return str;
}
public async Task<bool> Remove(string key)
{
if(await Db().KeyExistsAsync(key)==false)
{
return false;
}
return Db.KeyDelete(key);
}
三.List
1.有序排列,只可以重复。类似于堆栈可以push和pop,不同点在于两边都可以弹出和添加;
ListLeftPush(key,Value);左侧压栈
ListLeftPop(key)左侧出栈
ListRightPush(key,value);右侧压栈
ListRightPop(key);右侧出栈
ListGetByIndex(key,index);获取某个位置上的值
RedisValue
RedisValue[]
四.Set数据类型
1.无序排列,值不可以重复。增删改查速度较快
SetAdd(key,vale)
SetContains(key,value);判断set中是否存在某个元素
SetLength(key)获得set中的元素的个数
setRemove(key,value)从set中删除元素
refisValue[]SetMembers(key)获取集合中的元素
5.SortedSet
1.如果对于数据遍历顺序有要求,可以使用SorttedSet
SortedSetAdd(key,member,score)再可以这个sortedset中增加member,并且给这个member打分,如果member存在,则覆盖
SortedSetIncrement(key,member,score)
SortedSetDecrement(key,member,score)
StortedSetEntry[]SortedSetRangeByTankWithScores(RedusKey key,long start=0,long stop=-1,Order order=Order.Ascending)
SortedSetEntry[] items = db.SortedSetRangeByRankWithScores("Hotwords");
foreach(var item in items)
{
Console.WriteLine(item.Element+"="+item.Score);
}
五.Hash
1.键值对的集合 类似于Dictionary
六.Geo类型
1.用来保存兴趣点(POI,point of insert)的坐标信息 ,可以实现两点之间的计算
db.eo.Add("ShangHai",New GeoEntry(2133,13232231,"1"));
db.eo.Add("ShangHai",New GeoEntry(23133,132222231,"2"));
double dist=db.GeoDistance("ShangHai","1","2",GeoUnit.Meters);
GeoRadiusResult[] results = db.GeoRadius("ShangHai", "2", 200, GeoUnit.Meters);//获取”2”这个周边 200
米范围内的 POI
七.Redis的批量操作
1.GeoAdd(Rediskey,GeoEntry[]values) SortedSetAdd(RedisKey key,SortedSetEntry[]values)
2,如果一次性的操作不是同类的数据,那么使用批量魔术
IBatch batch=db.GetBatch();
db.GeoAdd(key,value);
db.StringSet(key,value);
batch.Execute();//会把当前连接的Create Batch() Execute()之间的操作一次性提交给服务器
八.Redis中的分布式锁
RedisValue token = Environment.MachineName;
//LockTake(keymtiken,TimeSpan)
if(db.LockTake("mylock",token,TimeSpan.FromSeconds(10)))
{
try
{
int key=client.Get<int>("key");
client.Add("key",key+10);
}
catch(Exception ex)
{
Console.WriteLine(ex.Message);
}finally
{
client.Database.LockRelease(Key,Token);
}
}
else
{
Console.WRiteLine("锁住了");
while(!TryAgain(10))
{
Thread.Sleep(1);
}
}
private static StackExchangeRedisCacheClient client;