【StackExchange.Redis笔记】数据类型操作-List、Geo
List数据类型
它是一个双向链表,支持左进、左出、右进、右出,所以它即可以充当队列使用,也可以充当栈使用。
(1). 队列:先进先出, 可以利用List左进右出,或者右进左出(ListLeftPush和ListRightPop配合 、 ListRightPush和ListLeftPop配合)
(2). 栈:先进后出,可以利用List左进左出,或者右进右出
Api
(1). ListLeftPush:从左侧添加,返回集合总数
(2). ListRightPush:从右侧添加,返回集合总数
(3). ListLeftPop:从左侧取1个值,并删除
(4). ListRightPop:从右侧取1个值,并删除
(5). ListInsertBefore:指定的key指定value之前(左边)插入1个值
(6). ListInsertAfter:指定的key指定value之后(右边)插入1个值
(7). ListGetByIndex:获取key的指定索引对应的value值(从左往右算)
(8). ListRange:获取key的所有value,数据类型得一致 (也可以获取指定索引之间的value值,带扩展)
(9). ListLength:获取指定key的数据的个数
(10). ListRemove:删除指定key对应的指定value值,返回删除的个数
(11). ListRightPopLeftPush:从List1右侧取一个值加到List2左侧,返回的是右侧取出来的这个值
案例
//1.从左侧添加
//单个,返回集合总数
db.ListLeftPush("group1", "你好1");
db.ListLeftPush("group1", "你好2");
db.ListLeftPush("group1", "你好3");
//多个
string[] dList1 = { "你好4", "你好5" };
RedisValue[] redisValue = dList1.Select(u => (RedisValue)u).ToArray();
var d1 = db.ListLeftPush("group1", redisValue);
//2.从右侧添加
db.ListRightPush("group1", "你好6");
//3.从左侧取1个值,并删除
var v1=db.ListLeftPop("group1");
//4.从右侧取1个值并删除
var v2 = db.ListRightPop("group1");
//5. 在List的指定的key指定value之前(左边)插入1个值
db.ListInsertBefore("group1", "你好3", "fan001");
//6. 在List的指定的key指定value之后(右边)插入1个值
db.ListInsertAfter("group1", "你好3", "fan002");
//7. 获取key指定索引的值(从左往右算)
var d2 = db.ListGetByIndex("group1", 0);
var d3 = db.ListGetByIndex("group1", 2);
//8. 获取key的所有数据,数据类型得一致
var d4 = db.ListRange("group1").Select(u => (string)u).ToList();
//获取key的前4条数据(从左往右)
var d44 = db.ListRange("group1", 0, 3).Select(u => (string)u).ToList();
//9.获取指定key的数据的个数
long d5 = db.ListLength("group1");
//10. 删除指定key对应的指定value值,返回删除的个数
db.ListLeftPush("group1", "你好");
db.ListLeftPush("group1", "你好");
long d6 = db.ListRemove("group1", "你好");
//11. 从List1右侧取一个值加到List2左侧,返回的是右侧取出来的这个值
db.ListLeftPush("group2", "你好1");
db.ListLeftPush("group2", "你好2");
db.ListLeftPush("group2", "你好3");
db.ListLeftPush("group3", "哈哈1");
db.ListLeftPush("group3", "哈哈2");
db.ListLeftPush("group3", "哈哈3");
//从队列group2右侧取出来一个值放到group3中
var d7 = db.ListRightPopLeftPush("group2", "group3");
Geo数据类型
Api
(1).GeoAdd:添加POI点
(2).GeoDistance:获取两点之间的最短距离
(3).GeoPosition:获取某个点的坐标
(4).GeoRadius:获取某个点(不一定是POI)周边xx米以外的点
(5).GeoRemove:删除某个点
案例
//1. 添加所有商店的地理位置
db.GeoAdd("ShopsGeo", new GeoEntry(116.34039, 39.94218, "name1"));
db.GeoAdd("ShopsGeo", new GeoEntry(116.340934, 39.942221, "name2"));
db.GeoAdd("ShopsGeo", new GeoEntry(116.341082, 39.941025, "name3"));
db.GeoAdd("ShopsGeo", new GeoEntry(116.340848, 39.937758, "name4"));
db.GeoAdd("ShopsGeo", new GeoEntry(116.342982, 39.937325, "name5"));
db.GeoAdd("ShopsGeo", new GeoEntry(116.340866, 39.936827, "name6"));
//2. 计算商店name1和name2之间的距离(单位m)
double? dist = db.GeoDistance("ShopsGeo", "name1", "name5", GeoUnit.Meters);
//3. 获取name1商店的坐标
GeoPosition? pos = db.GeoPosition("ShopsGeo", "name1");
//4. 获取一个 name2 周边的200内的点:
GeoRadiusResult[] results = db.GeoRadius("ShopsGeo", "name2", 200, GeoUnit.Meters);
foreach (GeoRadiusResult result in results)
{
Console.WriteLine("Id=" + result.Member + ",位置" + result.Position + ",距离" + result.Distance);
}
//5. 获取一个坐标(116.34092, 39.94223)(这个坐标不一定是 POI)周边的 POI:
GeoRadiusResult[] results2 = db.GeoRadius("ShopsGeo", 116.34092, 39.94223, 200, GeoUnit.Meters);
foreach (GeoRadiusResult result in results2)
{
Console.WriteLine("Id=" + result.Member + ",位置" + result.Position + ",距离" + result.Distance);
}
//6. 删除
bool d1 = db.GeoRemove("ShopsGeo", "name2");