Redis StackExchange SortedSetAdd 不更新现有元素
Redis StackExchange SortedSetAdd not updating existing element
我刚刚开始学习 Redis,并且在使用 C# 编程时,我使用的是 StackExchange Redis。我想试用 SortedSet,这是我拥有的简单代码:
创建示例数据
private List<User> SeedUsers() {
var list = new List<User> {
new User {Id = 1.ToString(), UserName = "Test1", Score = 10},
new User {Id = 2.ToString(), UserName = "Test2", Score = 23},
new User {Id = 3.ToString(), UserName = "Test3", Score = 15},
new User {Id = 4.ToString(), UserName = "Test4", Score = 250},
new User {Id = 5.ToString(), UserName = "Test5", Score = 100},
new User {Id = 6.ToString(), UserName = "Test5", Score = 23},
......
};
return list;
}
向 Redis 添加数据
public bool AddUsersToLeaderBoard() {
var db = Connection.GetDatabase();
var list = SeedUsers();
var numOfSuccesses = 0;
foreach (var item in list) {
var r = db.SortedSetAdd("test", JsonConvert.SerializeObject(item), item.Score);
if (r) numOfSuccesses++;
}
var i = list[3];
i.Score = 888;
db.SortedSetAdd("test", JsonConvert.SerializeObject(i), i.Score);
return numOfSuccesses == list.Count;
}
令我困惑的是 foreach 循环之后的部分,我在其中更改列表的第 4 个元素,然后将其添加到排序集中,但它只添加了两次,即它没有在 Redis 中更新。
我是否误解了 Redis 文档的这一部分?
Just a final note about sorted sets before switching to the next topic. Sorted sets' scores can be updated at any time. Just calling ZADD against an element already included in the sorted set will update its score (and position) with O(log(N)) time complexity. As such, sorted sets are suitable when there are tons of updates.
同时为了确保 JSON 序列化没有任何问题,我尝试了这行代码:
var x = db.SortedSetRank("test", JsonConvert.SerializeObject(list[4]), Order.Descending);
这给出了预期的结果。那我做错了什么?
这不是同一个对象,您在将其推送到 Redis 之前更新了它的分数。
改为这样做:
public bool AddUsersToLeaderBoard() {
var db = Connection.GetDatabase();
var list = SeedUsers();
var numOfSuccesses = 0;
foreach (var item in list) {
var r = db.SortedSetAdd("test", JsonConvert.SerializeObject(item), item.Score);
if (r) numOfSuccesses++;
}
var i = list[3];
//i.Score = 888; - this line can be removed
db.SortedSetAdd("test", JsonConvert.SerializeObject(i), 888);
return numOfSuccesses == list.Count;
}
并且zrange的输出将是预期的(只有一次Test4和888的真实分数):
127.0.0.1:6379> zrange test 0 -1 withscores
1) "{\"Id\":\"1\",\"Score\":10,\"UserName\":\"Test1\"}"
2) "10"
3) "{\"Id\":\"3\",\"Score\":15,\"UserName\":\"Test3\"}"
4) "15"
5) "{\"Id\":\"2\",\"Score\":23,\"UserName\":\"Test2\"}"
6) "23"
7) "{\"Id\":\"6\",\"Score\":23,\"UserName\":\"Test5\"}"
8) "23"
9) "{\"Id\":\"5\",\"Score\":100,\"UserName\":\"Test5\"}"
10) "100"
11) "{\"Id\":\"4\",\"Score\":250,\"UserName\":\"Test4\"}"
12) "888"
我刚刚开始学习 Redis,并且在使用 C# 编程时,我使用的是 StackExchange Redis。我想试用 SortedSet,这是我拥有的简单代码:
创建示例数据
private List<User> SeedUsers() {
var list = new List<User> {
new User {Id = 1.ToString(), UserName = "Test1", Score = 10},
new User {Id = 2.ToString(), UserName = "Test2", Score = 23},
new User {Id = 3.ToString(), UserName = "Test3", Score = 15},
new User {Id = 4.ToString(), UserName = "Test4", Score = 250},
new User {Id = 5.ToString(), UserName = "Test5", Score = 100},
new User {Id = 6.ToString(), UserName = "Test5", Score = 23},
......
};
return list;
}
向 Redis 添加数据
public bool AddUsersToLeaderBoard() {
var db = Connection.GetDatabase();
var list = SeedUsers();
var numOfSuccesses = 0;
foreach (var item in list) {
var r = db.SortedSetAdd("test", JsonConvert.SerializeObject(item), item.Score);
if (r) numOfSuccesses++;
}
var i = list[3];
i.Score = 888;
db.SortedSetAdd("test", JsonConvert.SerializeObject(i), i.Score);
return numOfSuccesses == list.Count;
}
令我困惑的是 foreach 循环之后的部分,我在其中更改列表的第 4 个元素,然后将其添加到排序集中,但它只添加了两次,即它没有在 Redis 中更新。
我是否误解了 Redis 文档的这一部分?
Just a final note about sorted sets before switching to the next topic. Sorted sets' scores can be updated at any time. Just calling ZADD against an element already included in the sorted set will update its score (and position) with O(log(N)) time complexity. As such, sorted sets are suitable when there are tons of updates.
同时为了确保 JSON 序列化没有任何问题,我尝试了这行代码:
var x = db.SortedSetRank("test", JsonConvert.SerializeObject(list[4]), Order.Descending);
这给出了预期的结果。那我做错了什么?
这不是同一个对象,您在将其推送到 Redis 之前更新了它的分数。 改为这样做:
public bool AddUsersToLeaderBoard() {
var db = Connection.GetDatabase();
var list = SeedUsers();
var numOfSuccesses = 0;
foreach (var item in list) {
var r = db.SortedSetAdd("test", JsonConvert.SerializeObject(item), item.Score);
if (r) numOfSuccesses++;
}
var i = list[3];
//i.Score = 888; - this line can be removed
db.SortedSetAdd("test", JsonConvert.SerializeObject(i), 888);
return numOfSuccesses == list.Count;
}
并且zrange的输出将是预期的(只有一次Test4和888的真实分数):
127.0.0.1:6379> zrange test 0 -1 withscores
1) "{\"Id\":\"1\",\"Score\":10,\"UserName\":\"Test1\"}"
2) "10"
3) "{\"Id\":\"3\",\"Score\":15,\"UserName\":\"Test3\"}"
4) "15"
5) "{\"Id\":\"2\",\"Score\":23,\"UserName\":\"Test2\"}"
6) "23"
7) "{\"Id\":\"6\",\"Score\":23,\"UserName\":\"Test5\"}"
8) "23"
9) "{\"Id\":\"5\",\"Score\":100,\"UserName\":\"Test5\"}"
10) "100"
11) "{\"Id\":\"4\",\"Score\":250,\"UserName\":\"Test4\"}"
12) "888"