Redis 有序集合
Redis 有序集合简介
Redis 有序集合是一个由唯一字符串(成员)组成的集合,这些字符串按照关联的分数进行排序。 当多个字符串具有相同的分数时,这些字符串按字典顺序排序。 有序集合的一些使用场景包括:
- 排行榜。例如,您可以使用有序集合轻松维护大型在线游戏中最高分数的有序列表。
- 速率限制器。特别是,你可以使用一个排序集合来构建一个滑动窗口速率限制器,以防止过多的API请求。
你可以将排序集合视为集合和哈希之间的混合体。与集合一样,排序集合由唯一的、不重复的字符串元素组成,因此在某种意义上,排序集合也是一个集合。
然而,虽然集合中的元素没有顺序,但排序集合中的每个元素都与一个浮点值相关联,称为分数(这就是为什么该类型也类似于哈希,因为每个元素都映射到一个值)。
此外,排序集合中的元素是按顺序排列的(因此它们不是按请求排序的,顺序是用于表示排序集合的数据结构的特性)。它们按照以下规则排序:
- 如果 B 和 A 是两个具有不同分数的元素,那么如果 A.score 大于 B.score,则 A > B。
- 如果 B 和 A 的分数完全相同,那么如果 A 字符串在字典序上大于 B 字符串,则 A > B。B 和 A 字符串不能相等,因为排序集合只包含唯一元素。
让我们从一个简单的例子开始,我们将添加所有的赛车手以及他们在第一场比赛中的得分:
> ZADD racer_scores 10 "Norem"
(integer) 1
> ZADD racer_scores 12 "Castilla"
(integer) 1
> ZADD racer_scores 8 "Sam-Bodden" 10 "Royce" 6 "Ford" 14 "Prickett"
(integer) 4
"""
Code samples for Sorted set doc pages:
https://redis.io/docs/latest/develop/data-types/sorted-sets/
"""
import redis
r = redis.Redis(decode_responses=True)
res1 = r.zadd("racer_scores", {"Norem": 10})
print(res1) # >>> 1
res2 = r.zadd("racer_scores", {"Castilla": 12})
print(res2) # >>> 1
res3 = r.zadd(
"racer_scores",
{"Sam-Bodden": 8, "Royce": 10, "Ford": 6, "Prickett": 14, "Castilla": 12},
)
print(res3) # >>> 4
res4 = r.zrange("racer_scores", 0, -1)
print(res4) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
res5 = r.zrevrange("racer_scores", 0, -1)
print(res5) # >>> ['Prickett', 'Castilla', 'Royce', 'Norem', 'Sam-Bodden', 'Ford']
res6 = r.zrange("racer_scores", 0, -1, withscores=True)
print(
res6
)
# >>> [
# ('Ford', 6.0), ('Sam-Bodden', 8.0), ('Norem', 10.0), ('Royce', 10.0),
# ('Castilla', 12.0), ('Prickett', 14.0)
# ]
res7 = r.zrangebyscore("racer_scores", "-inf", 10)
print(res7) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
res8 = r.zrem("racer_scores", "Castilla")
print(res8) # >>> 1
res9 = r.zremrangebyscore("racer_scores", "-inf", 9)
print(res9) # >>> 2
res10 = r.zrange("racer_scores", 0, -1)
print(res10) # >>> ['Norem', 'Royce', 'Prickett']
res11 = r.zrank("racer_scores", "Norem")
print(res11) # >>> 0
res12 = r.zrevrank("racer_scores", "Norem")
print(res12) # >>> 2
res13 = r.zadd(
"racer_scores",
{
"Norem": 0,
"Sam-Bodden": 0,
"Royce": 0,
"Ford": 0,
"Prickett": 0,
"Castilla": 0,
},
)
print(res13) # >>> 3
res14 = r.zrange("racer_scores", 0, -1)
print(res14) # >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
res15 = r.zrangebylex("racer_scores", "[A", "[L")
print(res15) # >>> ['Castilla', 'Ford']
res16 = r.zadd("racer_scores", {"Wood": 100})
print(res16) # >>> 1
res17 = r.zadd("racer_scores", {"Henshaw": 100})
print(res17) # >>> 1
res18 = r.zadd("racer_scores", {"Henshaw": 150})
print(res18) # >>> 0
res19 = r.zincrby("racer_scores", 50, "Wood")
print(res19) # >>> 150.0
res20 = r.zincrby("racer_scores", 50, "Henshaw")
print(res20) # >>> 200.0
import assert from 'assert';
import { createClient } from 'redis';
const client = createClient();
await client.connect();
const res1 = await client.zAdd('racer_scores', { score: 10, value: 'Norem' });
console.log(res1); // >>> 1
const res2 = await client.zAdd('racer_scores', { score: 12, value: 'Castilla' });
console.log(res2); // >>> 1
const res3 = await client.zAdd('racer_scores', [
{ score: 8, value: 'Sam-Bodden' },
{ score: 10, value: 'Royce' },
{ score: 6, value: 'Ford' },
{ score: 14, value: 'Prickett' },
{ score: 12, value: 'Castilla' }
]);
console.log(res3); // >>> 4
const res4 = await client.zRange('racer_scores', 0, -1);
console.log(res4); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
const res6 = await client.zRangeWithScores('racer_scores', 0, -1);
console.log(res6);
// >>> [
// { value: 'Ford', score: 6 }, { value: 'Sam-Bodden', score: 8 },
// { value: 'Norem', score: 10 }, { value: 'Royce', score: 10 },
// { value: 'Castilla', score: 12 }, { value: 'Prickett', score: 14 }
// ]
const res7 = await client.zRangeByScore('racer_scores', '-inf', 10);
console.log(res7); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
const res8 = await client.zRem('racer_scores', 'Castilla');
console.log(res8); // >>> 1
const res9 = await client.zRemRangeByScore('racer_scores', '-inf', 9);
console.log(res9); // >>> 2
const res10 = await client.zRange('racer_scores', 0, -1);
console.log(res10); // >>> ['Norem', 'Royce', 'Prickett']
const res11 = await client.zRank('racer_scores', 'Norem');
console.log(res11); // >>> 0
const res12 = await client.zRevRank('racer_scores', 'Norem');
console.log(res12); // >>> 2
const res13 = await client.zAdd('racer_scores', [
{ score: 0, value: 'Norem' },
{ score: 0, value: 'Sam-Bodden' },
{ score: 0, value: 'Royce' },
{ score: 0, value: 'Ford' },
{ score: 0, value: 'Prickett' },
{ score: 0, value: 'Castilla' }
]);
console.log(res13); // >>> 3
const res14 = await client.zRange('racer_scores', 0, -1);
console.log(res14); // >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
const res15 = await client.zRangeByLex('racer_scores', '[A', '[L');
console.log(res15); // >>> ['Castilla', 'Ford']
const res16 = await client.zAdd('racer_scores', { score: 100, value: 'Wood' });
console.log(res16); // >>> 1
const res17 = await client.zAdd('racer_scores', { score: 100, value: 'Henshaw' });
console.log(res17); // >>> 1
const res18 = await client.zAdd('racer_scores', { score: 150, value: 'Henshaw' }, { nx: true });
console.log(res18); // >>> 0
const res19 = await client.zIncrBy('racer_scores', 50, 'Wood');
console.log(res19); // >>> 150.0
const res20 = await client.zIncrBy('racer_scores', 50, 'Henshaw');
console.log(res20); // >>> 200.0
package io.redis.examples;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.resps.Tuple;
public class SortedSetsExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
long res1 = jedis.zadd("racer_scores", 10d, "Norem");
System.out.println(res1); // >>> 1
long res2 = jedis.zadd("racer_scores", 12d, "Castilla");
System.out.println(res2); // >>> 1
long res3 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Sam-Bodden", 8d);
put("Royce", 10d);
put("Ford", 6d);
put("Prickett", 14d);
put("Castilla", 12d);
}});
System.out.println(res3); // >>> 4
List<String> res4 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res4); // >>> [Ford, Sam-Bodden, Norem, Royce, Castil, Castilla, Prickett]
List<String> res5 = jedis.zrevrange("racer_scores", 0, -1);
System.out.println(res5); // >>> [Prickett, Castilla, Castil, Royce, Norem, Sam-Bodden, Ford]
List<Tuple> res6 = jedis.zrangeWithScores("racer_scores", 0, -1);
System.out.println(res6); // >>> [[Ford,6.0], [Sam-Bodden,8.0], [Norem,10.0], [Royce,10.0], [Castil,12.0], [Castilla,12.0], [Prickett,14.0]]
List<String> res7 = jedis.zrangeByScore("racer_scores", Double.MIN_VALUE, 10d);
System.out.println(res7); // >>> [Ford, Sam-Bodden, Norem, Royce]
long res8 = jedis.zrem("racer_scores", "Castilla");
System.out.println(res8); // >>> 1
long res9 = jedis.zremrangeByScore("racer_scores", Double.MIN_VALUE, 9d);
System.out.println(res9); // >>> 2
List<String> res10 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res10); // >>> [Norem, Royce, Prickett]
long res11 = jedis.zrank("racer_scores", "Norem");
System.out.println(res11); // >>> 0
long res12 = jedis.zrevrank("racer_scores", "Norem");
System.out.println(res12); // >>> 2
long res13 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Norem", 0d);
put("Sam-Bodden", 0d);
put("Royce", 0d);
put("Ford", 0d);
put("Prickett", 0d);
put("Castilla", 0d);
}});
System.out.println(res13); // >>> 3
List<String> res14 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res14); // >>> [Castilla, Ford, Norem, Prickett, Royce, Sam-Bodden]
List<String> res15 = jedis.zrangeByLex("racer_scores", "[A", "[L");
System.out.println(res15); // >>> [Castilla, Ford]
long res16 = jedis.zadd("racer_scores", 100d, "Wood");
System.out.println(res16); // >>> 1
long res17 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res17); // >>> 1
long res18 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res18); // >>> 0
double res19 = jedis.zincrby("racer_scores", 50d, "Wood");
System.out.println(res19); // >>> 150.0
double res20 = jedis.zincrby("racer_scores", 50d, "Henshaw");
System.out.println(res20); // >>> 200.0
}
}
package example_commands_test
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func ExampleClient_zadd() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res1, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res1) // >>> 1
res2, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res2) // >>> 1
res3, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res3) // >>> 4
}
func ExampleClient_zrange() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res4, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res4)
// >>> [Ford Sam-Bodden Norem Royce Castilla Prickett]
res5, err := rdb.ZRevRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res5)
// >>> [Prickett Castilla Royce Norem Sam-Bodden Ford]
}
func ExampleClient_zrangewithscores() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res6, err := rdb.ZRangeWithScores(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res6)
// >>> [{6 Ford} {8 Sam-Bodden} {10 Norem} {10 Royce} {12 Castilla} {14 Prickett}]
}
func ExampleClient_zrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res7, err := rdb.ZRangeByScore(ctx, "racer_scores",
&redis.ZRangeBy{Min: "-inf", Max: "10"},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res7)
// >>> [Ford Sam-Bodden Norem Royce]
}
func ExampleClient_zremrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res8, err := rdb.ZRem(ctx, "racer_scores", "Castilla").Result()
if err != nil {
panic(err)
}
fmt.Println(res8) // >>> 1
res9, err := rdb.ZRemRangeByScore(ctx, "racer_scores", "-inf", "9").Result()
if err != nil {
panic(err)
}
fmt.Println(res9) // >>> 2
res10, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res10)
// >>> [Norem Royce Prickett]
}
func ExampleClient_zrank() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Prickett", Score: 14},
).Result()
if err != nil {
panic(err)
}
res11, err := rdb.ZRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res11) // >>> 0
res12, err := rdb.ZRevRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res12) // >>> 2
}
func ExampleClient_zaddlex() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
).Result()
res13, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Sam-Bodden", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Ford", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
redis.Z{Member: "Castilla", Score: 0},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res13) // >>> 3
res14, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res14)
// >>> [Castilla Ford Norem Prickett Royce Sam-Bodden]
res15, err := rdb.ZRangeByLex(ctx, "racer_scores", &redis.ZRangeBy{
Min: "[A", Max: "[L",
}).Result()
if err != nil {
panic(err)
}
fmt.Println(res15) // >>> [Castilla Ford]
}
func ExampleClient_leaderboard() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res16, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Wood", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res16) // >>> 1
res17, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res17) // >>> 1
res18, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 150},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res18) // >>> 0
res19, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Wood").Result()
if err != nil {
panic(err)
}
fmt.Println(res19) // >>> 150
res20, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Henshaw").Result()
if err != nil {
panic(err)
}
fmt.Println(res20) // >>> 200
}
using StackExchange.Redis;
public class SortedSetExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
bool res1 = db.SortedSetAdd("racer_scores", "Norem", 10);
Console.WriteLine(res1); // >>> True
bool res2 = db.SortedSetAdd("racer_scores", "Castilla", 12);
Console.WriteLine(res2); // >>> True
long res3 = db.SortedSetAdd("racer_scores", new[]{
new SortedSetEntry("Sam-Bodden", 8),
new SortedSetEntry("Royce", 10),
new SortedSetEntry("Ford", 6),
new SortedSetEntry("Prickett", 14),
new SortedSetEntry("Castilla", 12)
});
Console.WriteLine(res3); // >>> 4
RedisValue[] res4 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res4)); // >>> Ford, Sam-Bodden, Norem, Royce, Castilla, Prickett
RedisValue[] res5 = db.SortedSetRangeByRank("racer_scores", 0, -1, Order.Descending);
Console.WriteLine(string.Join(", ", res5)); // >>> Prickett, Castilla, Royce, Norem, Sam-Bodden, Ford
SortedSetEntry[] res6 = db.SortedSetRangeByRankWithScores("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res6)); // >>> Ford: 6, Sam-Bodden: 8, Norem: 10, Royce: 10, Castilla: 12, Prickett: 14
RedisValue[] res7 = db.SortedSetRangeByScore("racer_scores", double.NegativeInfinity, 10);
Console.WriteLine(string.Join(", ", res7)); // >>> Ford, Sam-Bodden, Norem, Royce
bool res8 = db.SortedSetRemove("racer_scores", "Castilla");
Console.WriteLine(res8); // >>> True
long res9 = db.SortedSetRemoveRangeByScore("racer_scores", double.NegativeInfinity, 9);
Console.WriteLine(res9); // >>> 2
RedisValue[] res10 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res10)); // >>> Norem, Royce, Prickett
long? res11 = db.SortedSetRank("racer_scores", "Norem");
Console.WriteLine(res11); // >>> 0
long? res12 = db.SortedSetRank("racer_scores", "Norem", Order.Descending);
Console.WriteLine(res12); // >>> 2
long res13 = db.SortedSetAdd("racer_scores", new[] {
new SortedSetEntry("Norem", 0),
new SortedSetEntry("Sam-Bodden", 0),
new SortedSetEntry("Royce", 0),
new SortedSetEntry("Ford", 0),
new SortedSetEntry("Prickett", 0),
new SortedSetEntry("Castilla", 0)
});
Console.WriteLine(res13); // >>> 3
RedisValue[] res14 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res14)); // >>> Castilla, Ford, Norem, Pricket, Royce, Sam-Bodden
RedisValue[] res15 = db.SortedSetRangeByValue("racer_scores", "A", "L", Exclude.None);
Console.WriteLine(string.Join(", ", res15)); // >>> Castilla, Ford
bool res16 = db.SortedSetAdd("racer_scores", "Wood", 100);
Console.WriteLine(res16); // >>> True
bool res17 = db.SortedSetAdd("racer_scores", "Henshaw", 100);
Console.WriteLine(res17); // >>> True
bool res18 = db.SortedSetAdd("racer_scores", "Henshaw", 150);
Console.WriteLine(res18); // >>> False
double res19 = db.SortedSetIncrement("racer_scores", "Wood", 50);
Console.WriteLine(res19); // >>> 150.0
double res20 = db.SortedSetIncrement("racer_scores", "Henshaw", 50);
Console.WriteLine(res20); // >>> 200.0
}
}
正如你所见,ZADD
类似于 SADD
,但多了一个参数(放在要添加的元素之前),即分数。
ZADD
也是可变参数的,因此你可以自由指定多个分数-值对,即使在上面的示例中没有使用。
使用有序集合,返回按出生年份排序的赛车手列表非常简单,因为实际上它们已经是有序的。
实现说明:有序集合是通过一个双端口的数据结构实现的,该结构包含一个跳表和一个哈希表,因此每次我们添加一个元素时,Redis都会执行一个O(log(N))的操作。这很好,所以当我们请求有序元素时,Redis不需要做任何工作,它已经是有序的。请注意,ZRANGE
的顺序是从低到高,而ZREVRANGE
的顺序是从高到低:
> ZRANGE racer_scores 0 -1
1) "Ford"
2) "Sam-Bodden"
3) "Norem"
4) "Royce"
5) "Castilla"
6) "Prickett"
> ZREVRANGE racer_scores 0 -1
1) "Prickett"
2) "Castilla"
3) "Royce"
4) "Norem"
5) "Sam-Bodden"
6) "Ford"
"""
Code samples for Sorted set doc pages:
https://redis.io/docs/latest/develop/data-types/sorted-sets/
"""
import redis
r = redis.Redis(decode_responses=True)
res1 = r.zadd("racer_scores", {"Norem": 10})
print(res1) # >>> 1
res2 = r.zadd("racer_scores", {"Castilla": 12})
print(res2) # >>> 1
res3 = r.zadd(
"racer_scores",
{"Sam-Bodden": 8, "Royce": 10, "Ford": 6, "Prickett": 14, "Castilla": 12},
)
print(res3) # >>> 4
res4 = r.zrange("racer_scores", 0, -1)
print(res4) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
res5 = r.zrevrange("racer_scores", 0, -1)
print(res5) # >>> ['Prickett', 'Castilla', 'Royce', 'Norem', 'Sam-Bodden', 'Ford']
res6 = r.zrange("racer_scores", 0, -1, withscores=True)
print(
res6
)
# >>> [
# ('Ford', 6.0), ('Sam-Bodden', 8.0), ('Norem', 10.0), ('Royce', 10.0),
# ('Castilla', 12.0), ('Prickett', 14.0)
# ]
res7 = r.zrangebyscore("racer_scores", "-inf", 10)
print(res7) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
res8 = r.zrem("racer_scores", "Castilla")
print(res8) # >>> 1
res9 = r.zremrangebyscore("racer_scores", "-inf", 9)
print(res9) # >>> 2
res10 = r.zrange("racer_scores", 0, -1)
print(res10) # >>> ['Norem', 'Royce', 'Prickett']
res11 = r.zrank("racer_scores", "Norem")
print(res11) # >>> 0
res12 = r.zrevrank("racer_scores", "Norem")
print(res12) # >>> 2
res13 = r.zadd(
"racer_scores",
{
"Norem": 0,
"Sam-Bodden": 0,
"Royce": 0,
"Ford": 0,
"Prickett": 0,
"Castilla": 0,
},
)
print(res13) # >>> 3
res14 = r.zrange("racer_scores", 0, -1)
print(res14) # >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
res15 = r.zrangebylex("racer_scores", "[A", "[L")
print(res15) # >>> ['Castilla', 'Ford']
res16 = r.zadd("racer_scores", {"Wood": 100})
print(res16) # >>> 1
res17 = r.zadd("racer_scores", {"Henshaw": 100})
print(res17) # >>> 1
res18 = r.zadd("racer_scores", {"Henshaw": 150})
print(res18) # >>> 0
res19 = r.zincrby("racer_scores", 50, "Wood")
print(res19) # >>> 150.0
res20 = r.zincrby("racer_scores", 50, "Henshaw")
print(res20) # >>> 200.0
import assert from 'assert';
import { createClient } from 'redis';
const client = createClient();
await client.connect();
const res1 = await client.zAdd('racer_scores', { score: 10, value: 'Norem' });
console.log(res1); // >>> 1
const res2 = await client.zAdd('racer_scores', { score: 12, value: 'Castilla' });
console.log(res2); // >>> 1
const res3 = await client.zAdd('racer_scores', [
{ score: 8, value: 'Sam-Bodden' },
{ score: 10, value: 'Royce' },
{ score: 6, value: 'Ford' },
{ score: 14, value: 'Prickett' },
{ score: 12, value: 'Castilla' }
]);
console.log(res3); // >>> 4
const res4 = await client.zRange('racer_scores', 0, -1);
console.log(res4); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
const res6 = await client.zRangeWithScores('racer_scores', 0, -1);
console.log(res6);
// >>> [
// { value: 'Ford', score: 6 }, { value: 'Sam-Bodden', score: 8 },
// { value: 'Norem', score: 10 }, { value: 'Royce', score: 10 },
// { value: 'Castilla', score: 12 }, { value: 'Prickett', score: 14 }
// ]
const res7 = await client.zRangeByScore('racer_scores', '-inf', 10);
console.log(res7); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
const res8 = await client.zRem('racer_scores', 'Castilla');
console.log(res8); // >>> 1
const res9 = await client.zRemRangeByScore('racer_scores', '-inf', 9);
console.log(res9); // >>> 2
const res10 = await client.zRange('racer_scores', 0, -1);
console.log(res10); // >>> ['Norem', 'Royce', 'Prickett']
const res11 = await client.zRank('racer_scores', 'Norem');
console.log(res11); // >>> 0
const res12 = await client.zRevRank('racer_scores', 'Norem');
console.log(res12); // >>> 2
const res13 = await client.zAdd('racer_scores', [
{ score: 0, value: 'Norem' },
{ score: 0, value: 'Sam-Bodden' },
{ score: 0, value: 'Royce' },
{ score: 0, value: 'Ford' },
{ score: 0, value: 'Prickett' },
{ score: 0, value: 'Castilla' }
]);
console.log(res13); // >>> 3
const res14 = await client.zRange('racer_scores', 0, -1);
console.log(res14); // >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
const res15 = await client.zRangeByLex('racer_scores', '[A', '[L');
console.log(res15); // >>> ['Castilla', 'Ford']
const res16 = await client.zAdd('racer_scores', { score: 100, value: 'Wood' });
console.log(res16); // >>> 1
const res17 = await client.zAdd('racer_scores', { score: 100, value: 'Henshaw' });
console.log(res17); // >>> 1
const res18 = await client.zAdd('racer_scores', { score: 150, value: 'Henshaw' }, { nx: true });
console.log(res18); // >>> 0
const res19 = await client.zIncrBy('racer_scores', 50, 'Wood');
console.log(res19); // >>> 150.0
const res20 = await client.zIncrBy('racer_scores', 50, 'Henshaw');
console.log(res20); // >>> 200.0
package io.redis.examples;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.resps.Tuple;
public class SortedSetsExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
long res1 = jedis.zadd("racer_scores", 10d, "Norem");
System.out.println(res1); // >>> 1
long res2 = jedis.zadd("racer_scores", 12d, "Castilla");
System.out.println(res2); // >>> 1
long res3 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Sam-Bodden", 8d);
put("Royce", 10d);
put("Ford", 6d);
put("Prickett", 14d);
put("Castilla", 12d);
}});
System.out.println(res3); // >>> 4
List<String> res4 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res4); // >>> [Ford, Sam-Bodden, Norem, Royce, Castil, Castilla, Prickett]
List<String> res5 = jedis.zrevrange("racer_scores", 0, -1);
System.out.println(res5); // >>> [Prickett, Castilla, Castil, Royce, Norem, Sam-Bodden, Ford]
List<Tuple> res6 = jedis.zrangeWithScores("racer_scores", 0, -1);
System.out.println(res6); // >>> [[Ford,6.0], [Sam-Bodden,8.0], [Norem,10.0], [Royce,10.0], [Castil,12.0], [Castilla,12.0], [Prickett,14.0]]
List<String> res7 = jedis.zrangeByScore("racer_scores", Double.MIN_VALUE, 10d);
System.out.println(res7); // >>> [Ford, Sam-Bodden, Norem, Royce]
long res8 = jedis.zrem("racer_scores", "Castilla");
System.out.println(res8); // >>> 1
long res9 = jedis.zremrangeByScore("racer_scores", Double.MIN_VALUE, 9d);
System.out.println(res9); // >>> 2
List<String> res10 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res10); // >>> [Norem, Royce, Prickett]
long res11 = jedis.zrank("racer_scores", "Norem");
System.out.println(res11); // >>> 0
long res12 = jedis.zrevrank("racer_scores", "Norem");
System.out.println(res12); // >>> 2
long res13 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Norem", 0d);
put("Sam-Bodden", 0d);
put("Royce", 0d);
put("Ford", 0d);
put("Prickett", 0d);
put("Castilla", 0d);
}});
System.out.println(res13); // >>> 3
List<String> res14 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res14); // >>> [Castilla, Ford, Norem, Prickett, Royce, Sam-Bodden]
List<String> res15 = jedis.zrangeByLex("racer_scores", "[A", "[L");
System.out.println(res15); // >>> [Castilla, Ford]
long res16 = jedis.zadd("racer_scores", 100d, "Wood");
System.out.println(res16); // >>> 1
long res17 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res17); // >>> 1
long res18 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res18); // >>> 0
double res19 = jedis.zincrby("racer_scores", 50d, "Wood");
System.out.println(res19); // >>> 150.0
double res20 = jedis.zincrby("racer_scores", 50d, "Henshaw");
System.out.println(res20); // >>> 200.0
}
}
package example_commands_test
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func ExampleClient_zadd() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res1, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res1) // >>> 1
res2, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res2) // >>> 1
res3, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res3) // >>> 4
}
func ExampleClient_zrange() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res4, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res4)
// >>> [Ford Sam-Bodden Norem Royce Castilla Prickett]
res5, err := rdb.ZRevRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res5)
// >>> [Prickett Castilla Royce Norem Sam-Bodden Ford]
}
func ExampleClient_zrangewithscores() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res6, err := rdb.ZRangeWithScores(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res6)
// >>> [{6 Ford} {8 Sam-Bodden} {10 Norem} {10 Royce} {12 Castilla} {14 Prickett}]
}
func ExampleClient_zrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res7, err := rdb.ZRangeByScore(ctx, "racer_scores",
&redis.ZRangeBy{Min: "-inf", Max: "10"},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res7)
// >>> [Ford Sam-Bodden Norem Royce]
}
func ExampleClient_zremrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res8, err := rdb.ZRem(ctx, "racer_scores", "Castilla").Result()
if err != nil {
panic(err)
}
fmt.Println(res8) // >>> 1
res9, err := rdb.ZRemRangeByScore(ctx, "racer_scores", "-inf", "9").Result()
if err != nil {
panic(err)
}
fmt.Println(res9) // >>> 2
res10, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res10)
// >>> [Norem Royce Prickett]
}
func ExampleClient_zrank() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Prickett", Score: 14},
).Result()
if err != nil {
panic(err)
}
res11, err := rdb.ZRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res11) // >>> 0
res12, err := rdb.ZRevRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res12) // >>> 2
}
func ExampleClient_zaddlex() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
).Result()
res13, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Sam-Bodden", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Ford", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
redis.Z{Member: "Castilla", Score: 0},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res13) // >>> 3
res14, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res14)
// >>> [Castilla Ford Norem Prickett Royce Sam-Bodden]
res15, err := rdb.ZRangeByLex(ctx, "racer_scores", &redis.ZRangeBy{
Min: "[A", Max: "[L",
}).Result()
if err != nil {
panic(err)
}
fmt.Println(res15) // >>> [Castilla Ford]
}
func ExampleClient_leaderboard() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res16, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Wood", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res16) // >>> 1
res17, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res17) // >>> 1
res18, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 150},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res18) // >>> 0
res19, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Wood").Result()
if err != nil {
panic(err)
}
fmt.Println(res19) // >>> 150
res20, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Henshaw").Result()
if err != nil {
panic(err)
}
fmt.Println(res20) // >>> 200
}
using StackExchange.Redis;
public class SortedSetExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
bool res1 = db.SortedSetAdd("racer_scores", "Norem", 10);
Console.WriteLine(res1); // >>> True
bool res2 = db.SortedSetAdd("racer_scores", "Castilla", 12);
Console.WriteLine(res2); // >>> True
long res3 = db.SortedSetAdd("racer_scores", new[]{
new SortedSetEntry("Sam-Bodden", 8),
new SortedSetEntry("Royce", 10),
new SortedSetEntry("Ford", 6),
new SortedSetEntry("Prickett", 14),
new SortedSetEntry("Castilla", 12)
});
Console.WriteLine(res3); // >>> 4
RedisValue[] res4 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res4)); // >>> Ford, Sam-Bodden, Norem, Royce, Castilla, Prickett
RedisValue[] res5 = db.SortedSetRangeByRank("racer_scores", 0, -1, Order.Descending);
Console.WriteLine(string.Join(", ", res5)); // >>> Prickett, Castilla, Royce, Norem, Sam-Bodden, Ford
SortedSetEntry[] res6 = db.SortedSetRangeByRankWithScores("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res6)); // >>> Ford: 6, Sam-Bodden: 8, Norem: 10, Royce: 10, Castilla: 12, Prickett: 14
RedisValue[] res7 = db.SortedSetRangeByScore("racer_scores", double.NegativeInfinity, 10);
Console.WriteLine(string.Join(", ", res7)); // >>> Ford, Sam-Bodden, Norem, Royce
bool res8 = db.SortedSetRemove("racer_scores", "Castilla");
Console.WriteLine(res8); // >>> True
long res9 = db.SortedSetRemoveRangeByScore("racer_scores", double.NegativeInfinity, 9);
Console.WriteLine(res9); // >>> 2
RedisValue[] res10 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res10)); // >>> Norem, Royce, Prickett
long? res11 = db.SortedSetRank("racer_scores", "Norem");
Console.WriteLine(res11); // >>> 0
long? res12 = db.SortedSetRank("racer_scores", "Norem", Order.Descending);
Console.WriteLine(res12); // >>> 2
long res13 = db.SortedSetAdd("racer_scores", new[] {
new SortedSetEntry("Norem", 0),
new SortedSetEntry("Sam-Bodden", 0),
new SortedSetEntry("Royce", 0),
new SortedSetEntry("Ford", 0),
new SortedSetEntry("Prickett", 0),
new SortedSetEntry("Castilla", 0)
});
Console.WriteLine(res13); // >>> 3
RedisValue[] res14 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res14)); // >>> Castilla, Ford, Norem, Pricket, Royce, Sam-Bodden
RedisValue[] res15 = db.SortedSetRangeByValue("racer_scores", "A", "L", Exclude.None);
Console.WriteLine(string.Join(", ", res15)); // >>> Castilla, Ford
bool res16 = db.SortedSetAdd("racer_scores", "Wood", 100);
Console.WriteLine(res16); // >>> True
bool res17 = db.SortedSetAdd("racer_scores", "Henshaw", 100);
Console.WriteLine(res17); // >>> True
bool res18 = db.SortedSetAdd("racer_scores", "Henshaw", 150);
Console.WriteLine(res18); // >>> False
double res19 = db.SortedSetIncrement("racer_scores", "Wood", 50);
Console.WriteLine(res19); // >>> 150.0
double res20 = db.SortedSetIncrement("racer_scores", "Henshaw", 50);
Console.WriteLine(res20); // >>> 200.0
}
}
注意:0 和 -1 表示从元素索引 0 到最后一个元素(-1 在这里的作用与 LRANGE
命令中的情况相同)。
也可以使用WITHSCORES
参数返回分数:
> ZRANGE racer_scores 0 -1 withscores
1) "Ford"
2) "6"
3) "Sam-Bodden"
4) "8"
5) "Norem"
6) "10"
7) "Royce"
8) "10"
9) "Castilla"
10) "12"
11) "Prickett"
12) "14"
"""
Code samples for Sorted set doc pages:
https://redis.io/docs/latest/develop/data-types/sorted-sets/
"""
import redis
r = redis.Redis(decode_responses=True)
res1 = r.zadd("racer_scores", {"Norem": 10})
print(res1) # >>> 1
res2 = r.zadd("racer_scores", {"Castilla": 12})
print(res2) # >>> 1
res3 = r.zadd(
"racer_scores",
{"Sam-Bodden": 8, "Royce": 10, "Ford": 6, "Prickett": 14, "Castilla": 12},
)
print(res3) # >>> 4
res4 = r.zrange("racer_scores", 0, -1)
print(res4) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
res5 = r.zrevrange("racer_scores", 0, -1)
print(res5) # >>> ['Prickett', 'Castilla', 'Royce', 'Norem', 'Sam-Bodden', 'Ford']
res6 = r.zrange("racer_scores", 0, -1, withscores=True)
print(
res6
)
# >>> [
# ('Ford', 6.0), ('Sam-Bodden', 8.0), ('Norem', 10.0), ('Royce', 10.0),
# ('Castilla', 12.0), ('Prickett', 14.0)
# ]
res7 = r.zrangebyscore("racer_scores", "-inf", 10)
print(res7) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
res8 = r.zrem("racer_scores", "Castilla")
print(res8) # >>> 1
res9 = r.zremrangebyscore("racer_scores", "-inf", 9)
print(res9) # >>> 2
res10 = r.zrange("racer_scores", 0, -1)
print(res10) # >>> ['Norem', 'Royce', 'Prickett']
res11 = r.zrank("racer_scores", "Norem")
print(res11) # >>> 0
res12 = r.zrevrank("racer_scores", "Norem")
print(res12) # >>> 2
res13 = r.zadd(
"racer_scores",
{
"Norem": 0,
"Sam-Bodden": 0,
"Royce": 0,
"Ford": 0,
"Prickett": 0,
"Castilla": 0,
},
)
print(res13) # >>> 3
res14 = r.zrange("racer_scores", 0, -1)
print(res14) # >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
res15 = r.zrangebylex("racer_scores", "[A", "[L")
print(res15) # >>> ['Castilla', 'Ford']
res16 = r.zadd("racer_scores", {"Wood": 100})
print(res16) # >>> 1
res17 = r.zadd("racer_scores", {"Henshaw": 100})
print(res17) # >>> 1
res18 = r.zadd("racer_scores", {"Henshaw": 150})
print(res18) # >>> 0
res19 = r.zincrby("racer_scores", 50, "Wood")
print(res19) # >>> 150.0
res20 = r.zincrby("racer_scores", 50, "Henshaw")
print(res20) # >>> 200.0
import assert from 'assert';
import { createClient } from 'redis';
const client = createClient();
await client.connect();
const res1 = await client.zAdd('racer_scores', { score: 10, value: 'Norem' });
console.log(res1); // >>> 1
const res2 = await client.zAdd('racer_scores', { score: 12, value: 'Castilla' });
console.log(res2); // >>> 1
const res3 = await client.zAdd('racer_scores', [
{ score: 8, value: 'Sam-Bodden' },
{ score: 10, value: 'Royce' },
{ score: 6, value: 'Ford' },
{ score: 14, value: 'Prickett' },
{ score: 12, value: 'Castilla' }
]);
console.log(res3); // >>> 4
const res4 = await client.zRange('racer_scores', 0, -1);
console.log(res4); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
const res6 = await client.zRangeWithScores('racer_scores', 0, -1);
console.log(res6);
// >>> [
// { value: 'Ford', score: 6 }, { value: 'Sam-Bodden', score: 8 },
// { value: 'Norem', score: 10 }, { value: 'Royce', score: 10 },
// { value: 'Castilla', score: 12 }, { value: 'Prickett', score: 14 }
// ]
const res7 = await client.zRangeByScore('racer_scores', '-inf', 10);
console.log(res7); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
const res8 = await client.zRem('racer_scores', 'Castilla');
console.log(res8); // >>> 1
const res9 = await client.zRemRangeByScore('racer_scores', '-inf', 9);
console.log(res9); // >>> 2
const res10 = await client.zRange('racer_scores', 0, -1);
console.log(res10); // >>> ['Norem', 'Royce', 'Prickett']
const res11 = await client.zRank('racer_scores', 'Norem');
console.log(res11); // >>> 0
const res12 = await client.zRevRank('racer_scores', 'Norem');
console.log(res12); // >>> 2
const res13 = await client.zAdd('racer_scores', [
{ score: 0, value: 'Norem' },
{ score: 0, value: 'Sam-Bodden' },
{ score: 0, value: 'Royce' },
{ score: 0, value: 'Ford' },
{ score: 0, value: 'Prickett' },
{ score: 0, value: 'Castilla' }
]);
console.log(res13); // >>> 3
const res14 = await client.zRange('racer_scores', 0, -1);
console.log(res14); // >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
const res15 = await client.zRangeByLex('racer_scores', '[A', '[L');
console.log(res15); // >>> ['Castilla', 'Ford']
const res16 = await client.zAdd('racer_scores', { score: 100, value: 'Wood' });
console.log(res16); // >>> 1
const res17 = await client.zAdd('racer_scores', { score: 100, value: 'Henshaw' });
console.log(res17); // >>> 1
const res18 = await client.zAdd('racer_scores', { score: 150, value: 'Henshaw' }, { nx: true });
console.log(res18); // >>> 0
const res19 = await client.zIncrBy('racer_scores', 50, 'Wood');
console.log(res19); // >>> 150.0
const res20 = await client.zIncrBy('racer_scores', 50, 'Henshaw');
console.log(res20); // >>> 200.0
package io.redis.examples;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.resps.Tuple;
public class SortedSetsExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
long res1 = jedis.zadd("racer_scores", 10d, "Norem");
System.out.println(res1); // >>> 1
long res2 = jedis.zadd("racer_scores", 12d, "Castilla");
System.out.println(res2); // >>> 1
long res3 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Sam-Bodden", 8d);
put("Royce", 10d);
put("Ford", 6d);
put("Prickett", 14d);
put("Castilla", 12d);
}});
System.out.println(res3); // >>> 4
List<String> res4 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res4); // >>> [Ford, Sam-Bodden, Norem, Royce, Castil, Castilla, Prickett]
List<String> res5 = jedis.zrevrange("racer_scores", 0, -1);
System.out.println(res5); // >>> [Prickett, Castilla, Castil, Royce, Norem, Sam-Bodden, Ford]
List<Tuple> res6 = jedis.zrangeWithScores("racer_scores", 0, -1);
System.out.println(res6); // >>> [[Ford,6.0], [Sam-Bodden,8.0], [Norem,10.0], [Royce,10.0], [Castil,12.0], [Castilla,12.0], [Prickett,14.0]]
List<String> res7 = jedis.zrangeByScore("racer_scores", Double.MIN_VALUE, 10d);
System.out.println(res7); // >>> [Ford, Sam-Bodden, Norem, Royce]
long res8 = jedis.zrem("racer_scores", "Castilla");
System.out.println(res8); // >>> 1
long res9 = jedis.zremrangeByScore("racer_scores", Double.MIN_VALUE, 9d);
System.out.println(res9); // >>> 2
List<String> res10 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res10); // >>> [Norem, Royce, Prickett]
long res11 = jedis.zrank("racer_scores", "Norem");
System.out.println(res11); // >>> 0
long res12 = jedis.zrevrank("racer_scores", "Norem");
System.out.println(res12); // >>> 2
long res13 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Norem", 0d);
put("Sam-Bodden", 0d);
put("Royce", 0d);
put("Ford", 0d);
put("Prickett", 0d);
put("Castilla", 0d);
}});
System.out.println(res13); // >>> 3
List<String> res14 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res14); // >>> [Castilla, Ford, Norem, Prickett, Royce, Sam-Bodden]
List<String> res15 = jedis.zrangeByLex("racer_scores", "[A", "[L");
System.out.println(res15); // >>> [Castilla, Ford]
long res16 = jedis.zadd("racer_scores", 100d, "Wood");
System.out.println(res16); // >>> 1
long res17 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res17); // >>> 1
long res18 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res18); // >>> 0
double res19 = jedis.zincrby("racer_scores", 50d, "Wood");
System.out.println(res19); // >>> 150.0
double res20 = jedis.zincrby("racer_scores", 50d, "Henshaw");
System.out.println(res20); // >>> 200.0
}
}
package example_commands_test
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func ExampleClient_zadd() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res1, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res1) // >>> 1
res2, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res2) // >>> 1
res3, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res3) // >>> 4
}
func ExampleClient_zrange() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res4, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res4)
// >>> [Ford Sam-Bodden Norem Royce Castilla Prickett]
res5, err := rdb.ZRevRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res5)
// >>> [Prickett Castilla Royce Norem Sam-Bodden Ford]
}
func ExampleClient_zrangewithscores() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res6, err := rdb.ZRangeWithScores(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res6)
// >>> [{6 Ford} {8 Sam-Bodden} {10 Norem} {10 Royce} {12 Castilla} {14 Prickett}]
}
func ExampleClient_zrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res7, err := rdb.ZRangeByScore(ctx, "racer_scores",
&redis.ZRangeBy{Min: "-inf", Max: "10"},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res7)
// >>> [Ford Sam-Bodden Norem Royce]
}
func ExampleClient_zremrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res8, err := rdb.ZRem(ctx, "racer_scores", "Castilla").Result()
if err != nil {
panic(err)
}
fmt.Println(res8) // >>> 1
res9, err := rdb.ZRemRangeByScore(ctx, "racer_scores", "-inf", "9").Result()
if err != nil {
panic(err)
}
fmt.Println(res9) // >>> 2
res10, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res10)
// >>> [Norem Royce Prickett]
}
func ExampleClient_zrank() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Prickett", Score: 14},
).Result()
if err != nil {
panic(err)
}
res11, err := rdb.ZRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res11) // >>> 0
res12, err := rdb.ZRevRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res12) // >>> 2
}
func ExampleClient_zaddlex() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
).Result()
res13, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Sam-Bodden", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Ford", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
redis.Z{Member: "Castilla", Score: 0},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res13) // >>> 3
res14, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res14)
// >>> [Castilla Ford Norem Prickett Royce Sam-Bodden]
res15, err := rdb.ZRangeByLex(ctx, "racer_scores", &redis.ZRangeBy{
Min: "[A", Max: "[L",
}).Result()
if err != nil {
panic(err)
}
fmt.Println(res15) // >>> [Castilla Ford]
}
func ExampleClient_leaderboard() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res16, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Wood", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res16) // >>> 1
res17, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res17) // >>> 1
res18, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 150},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res18) // >>> 0
res19, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Wood").Result()
if err != nil {
panic(err)
}
fmt.Println(res19) // >>> 150
res20, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Henshaw").Result()
if err != nil {
panic(err)
}
fmt.Println(res20) // >>> 200
}
using StackExchange.Redis;
public class SortedSetExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
bool res1 = db.SortedSetAdd("racer_scores", "Norem", 10);
Console.WriteLine(res1); // >>> True
bool res2 = db.SortedSetAdd("racer_scores", "Castilla", 12);
Console.WriteLine(res2); // >>> True
long res3 = db.SortedSetAdd("racer_scores", new[]{
new SortedSetEntry("Sam-Bodden", 8),
new SortedSetEntry("Royce", 10),
new SortedSetEntry("Ford", 6),
new SortedSetEntry("Prickett", 14),
new SortedSetEntry("Castilla", 12)
});
Console.WriteLine(res3); // >>> 4
RedisValue[] res4 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res4)); // >>> Ford, Sam-Bodden, Norem, Royce, Castilla, Prickett
RedisValue[] res5 = db.SortedSetRangeByRank("racer_scores", 0, -1, Order.Descending);
Console.WriteLine(string.Join(", ", res5)); // >>> Prickett, Castilla, Royce, Norem, Sam-Bodden, Ford
SortedSetEntry[] res6 = db.SortedSetRangeByRankWithScores("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res6)); // >>> Ford: 6, Sam-Bodden: 8, Norem: 10, Royce: 10, Castilla: 12, Prickett: 14
RedisValue[] res7 = db.SortedSetRangeByScore("racer_scores", double.NegativeInfinity, 10);
Console.WriteLine(string.Join(", ", res7)); // >>> Ford, Sam-Bodden, Norem, Royce
bool res8 = db.SortedSetRemove("racer_scores", "Castilla");
Console.WriteLine(res8); // >>> True
long res9 = db.SortedSetRemoveRangeByScore("racer_scores", double.NegativeInfinity, 9);
Console.WriteLine(res9); // >>> 2
RedisValue[] res10 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res10)); // >>> Norem, Royce, Prickett
long? res11 = db.SortedSetRank("racer_scores", "Norem");
Console.WriteLine(res11); // >>> 0
long? res12 = db.SortedSetRank("racer_scores", "Norem", Order.Descending);
Console.WriteLine(res12); // >>> 2
long res13 = db.SortedSetAdd("racer_scores", new[] {
new SortedSetEntry("Norem", 0),
new SortedSetEntry("Sam-Bodden", 0),
new SortedSetEntry("Royce", 0),
new SortedSetEntry("Ford", 0),
new SortedSetEntry("Prickett", 0),
new SortedSetEntry("Castilla", 0)
});
Console.WriteLine(res13); // >>> 3
RedisValue[] res14 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res14)); // >>> Castilla, Ford, Norem, Pricket, Royce, Sam-Bodden
RedisValue[] res15 = db.SortedSetRangeByValue("racer_scores", "A", "L", Exclude.None);
Console.WriteLine(string.Join(", ", res15)); // >>> Castilla, Ford
bool res16 = db.SortedSetAdd("racer_scores", "Wood", 100);
Console.WriteLine(res16); // >>> True
bool res17 = db.SortedSetAdd("racer_scores", "Henshaw", 100);
Console.WriteLine(res17); // >>> True
bool res18 = db.SortedSetAdd("racer_scores", "Henshaw", 150);
Console.WriteLine(res18); // >>> False
double res19 = db.SortedSetIncrement("racer_scores", "Wood", 50);
Console.WriteLine(res19); // >>> 150.0
double res20 = db.SortedSetIncrement("racer_scores", "Henshaw", 50);
Console.WriteLine(res20); // >>> 200.0
}
}
操作范围
有序集合比这更强大。它们可以在范围内操作。
让我们获取所有得分在10分或以下的赛车手。我们
使用ZRANGEBYSCORE
命令来完成这个操作:
> ZRANGEBYSCORE racer_scores -inf 10
1) "Ford"
2) "Sam-Bodden"
3) "Norem"
4) "Royce"
"""
Code samples for Sorted set doc pages:
https://redis.io/docs/latest/develop/data-types/sorted-sets/
"""
import redis
r = redis.Redis(decode_responses=True)
res1 = r.zadd("racer_scores", {"Norem": 10})
print(res1) # >>> 1
res2 = r.zadd("racer_scores", {"Castilla": 12})
print(res2) # >>> 1
res3 = r.zadd(
"racer_scores",
{"Sam-Bodden": 8, "Royce": 10, "Ford": 6, "Prickett": 14, "Castilla": 12},
)
print(res3) # >>> 4
res4 = r.zrange("racer_scores", 0, -1)
print(res4) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
res5 = r.zrevrange("racer_scores", 0, -1)
print(res5) # >>> ['Prickett', 'Castilla', 'Royce', 'Norem', 'Sam-Bodden', 'Ford']
res6 = r.zrange("racer_scores", 0, -1, withscores=True)
print(
res6
)
# >>> [
# ('Ford', 6.0), ('Sam-Bodden', 8.0), ('Norem', 10.0), ('Royce', 10.0),
# ('Castilla', 12.0), ('Prickett', 14.0)
# ]
res7 = r.zrangebyscore("racer_scores", "-inf", 10)
print(res7) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
res8 = r.zrem("racer_scores", "Castilla")
print(res8) # >>> 1
res9 = r.zremrangebyscore("racer_scores", "-inf", 9)
print(res9) # >>> 2
res10 = r.zrange("racer_scores", 0, -1)
print(res10) # >>> ['Norem', 'Royce', 'Prickett']
res11 = r.zrank("racer_scores", "Norem")
print(res11) # >>> 0
res12 = r.zrevrank("racer_scores", "Norem")
print(res12) # >>> 2
res13 = r.zadd(
"racer_scores",
{
"Norem": 0,
"Sam-Bodden": 0,
"Royce": 0,
"Ford": 0,
"Prickett": 0,
"Castilla": 0,
},
)
print(res13) # >>> 3
res14 = r.zrange("racer_scores", 0, -1)
print(res14) # >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
res15 = r.zrangebylex("racer_scores", "[A", "[L")
print(res15) # >>> ['Castilla', 'Ford']
res16 = r.zadd("racer_scores", {"Wood": 100})
print(res16) # >>> 1
res17 = r.zadd("racer_scores", {"Henshaw": 100})
print(res17) # >>> 1
res18 = r.zadd("racer_scores", {"Henshaw": 150})
print(res18) # >>> 0
res19 = r.zincrby("racer_scores", 50, "Wood")
print(res19) # >>> 150.0
res20 = r.zincrby("racer_scores", 50, "Henshaw")
print(res20) # >>> 200.0
import assert from 'assert';
import { createClient } from 'redis';
const client = createClient();
await client.connect();
const res1 = await client.zAdd('racer_scores', { score: 10, value: 'Norem' });
console.log(res1); // >>> 1
const res2 = await client.zAdd('racer_scores', { score: 12, value: 'Castilla' });
console.log(res2); // >>> 1
const res3 = await client.zAdd('racer_scores', [
{ score: 8, value: 'Sam-Bodden' },
{ score: 10, value: 'Royce' },
{ score: 6, value: 'Ford' },
{ score: 14, value: 'Prickett' },
{ score: 12, value: 'Castilla' }
]);
console.log(res3); // >>> 4
const res4 = await client.zRange('racer_scores', 0, -1);
console.log(res4); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
const res6 = await client.zRangeWithScores('racer_scores', 0, -1);
console.log(res6);
// >>> [
// { value: 'Ford', score: 6 }, { value: 'Sam-Bodden', score: 8 },
// { value: 'Norem', score: 10 }, { value: 'Royce', score: 10 },
// { value: 'Castilla', score: 12 }, { value: 'Prickett', score: 14 }
// ]
const res7 = await client.zRangeByScore('racer_scores', '-inf', 10);
console.log(res7); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
const res8 = await client.zRem('racer_scores', 'Castilla');
console.log(res8); // >>> 1
const res9 = await client.zRemRangeByScore('racer_scores', '-inf', 9);
console.log(res9); // >>> 2
const res10 = await client.zRange('racer_scores', 0, -1);
console.log(res10); // >>> ['Norem', 'Royce', 'Prickett']
const res11 = await client.zRank('racer_scores', 'Norem');
console.log(res11); // >>> 0
const res12 = await client.zRevRank('racer_scores', 'Norem');
console.log(res12); // >>> 2
const res13 = await client.zAdd('racer_scores', [
{ score: 0, value: 'Norem' },
{ score: 0, value: 'Sam-Bodden' },
{ score: 0, value: 'Royce' },
{ score: 0, value: 'Ford' },
{ score: 0, value: 'Prickett' },
{ score: 0, value: 'Castilla' }
]);
console.log(res13); // >>> 3
const res14 = await client.zRange('racer_scores', 0, -1);
console.log(res14); // >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
const res15 = await client.zRangeByLex('racer_scores', '[A', '[L');
console.log(res15); // >>> ['Castilla', 'Ford']
const res16 = await client.zAdd('racer_scores', { score: 100, value: 'Wood' });
console.log(res16); // >>> 1
const res17 = await client.zAdd('racer_scores', { score: 100, value: 'Henshaw' });
console.log(res17); // >>> 1
const res18 = await client.zAdd('racer_scores', { score: 150, value: 'Henshaw' }, { nx: true });
console.log(res18); // >>> 0
const res19 = await client.zIncrBy('racer_scores', 50, 'Wood');
console.log(res19); // >>> 150.0
const res20 = await client.zIncrBy('racer_scores', 50, 'Henshaw');
console.log(res20); // >>> 200.0
package io.redis.examples;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.resps.Tuple;
public class SortedSetsExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
long res1 = jedis.zadd("racer_scores", 10d, "Norem");
System.out.println(res1); // >>> 1
long res2 = jedis.zadd("racer_scores", 12d, "Castilla");
System.out.println(res2); // >>> 1
long res3 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Sam-Bodden", 8d);
put("Royce", 10d);
put("Ford", 6d);
put("Prickett", 14d);
put("Castilla", 12d);
}});
System.out.println(res3); // >>> 4
List<String> res4 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res4); // >>> [Ford, Sam-Bodden, Norem, Royce, Castil, Castilla, Prickett]
List<String> res5 = jedis.zrevrange("racer_scores", 0, -1);
System.out.println(res5); // >>> [Prickett, Castilla, Castil, Royce, Norem, Sam-Bodden, Ford]
List<Tuple> res6 = jedis.zrangeWithScores("racer_scores", 0, -1);
System.out.println(res6); // >>> [[Ford,6.0], [Sam-Bodden,8.0], [Norem,10.0], [Royce,10.0], [Castil,12.0], [Castilla,12.0], [Prickett,14.0]]
List<String> res7 = jedis.zrangeByScore("racer_scores", Double.MIN_VALUE, 10d);
System.out.println(res7); // >>> [Ford, Sam-Bodden, Norem, Royce]
long res8 = jedis.zrem("racer_scores", "Castilla");
System.out.println(res8); // >>> 1
long res9 = jedis.zremrangeByScore("racer_scores", Double.MIN_VALUE, 9d);
System.out.println(res9); // >>> 2
List<String> res10 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res10); // >>> [Norem, Royce, Prickett]
long res11 = jedis.zrank("racer_scores", "Norem");
System.out.println(res11); // >>> 0
long res12 = jedis.zrevrank("racer_scores", "Norem");
System.out.println(res12); // >>> 2
long res13 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Norem", 0d);
put("Sam-Bodden", 0d);
put("Royce", 0d);
put("Ford", 0d);
put("Prickett", 0d);
put("Castilla", 0d);
}});
System.out.println(res13); // >>> 3
List<String> res14 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res14); // >>> [Castilla, Ford, Norem, Prickett, Royce, Sam-Bodden]
List<String> res15 = jedis.zrangeByLex("racer_scores", "[A", "[L");
System.out.println(res15); // >>> [Castilla, Ford]
long res16 = jedis.zadd("racer_scores", 100d, "Wood");
System.out.println(res16); // >>> 1
long res17 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res17); // >>> 1
long res18 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res18); // >>> 0
double res19 = jedis.zincrby("racer_scores", 50d, "Wood");
System.out.println(res19); // >>> 150.0
double res20 = jedis.zincrby("racer_scores", 50d, "Henshaw");
System.out.println(res20); // >>> 200.0
}
}
package example_commands_test
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func ExampleClient_zadd() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res1, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res1) // >>> 1
res2, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res2) // >>> 1
res3, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res3) // >>> 4
}
func ExampleClient_zrange() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res4, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res4)
// >>> [Ford Sam-Bodden Norem Royce Castilla Prickett]
res5, err := rdb.ZRevRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res5)
// >>> [Prickett Castilla Royce Norem Sam-Bodden Ford]
}
func ExampleClient_zrangewithscores() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res6, err := rdb.ZRangeWithScores(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res6)
// >>> [{6 Ford} {8 Sam-Bodden} {10 Norem} {10 Royce} {12 Castilla} {14 Prickett}]
}
func ExampleClient_zrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res7, err := rdb.ZRangeByScore(ctx, "racer_scores",
&redis.ZRangeBy{Min: "-inf", Max: "10"},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res7)
// >>> [Ford Sam-Bodden Norem Royce]
}
func ExampleClient_zremrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res8, err := rdb.ZRem(ctx, "racer_scores", "Castilla").Result()
if err != nil {
panic(err)
}
fmt.Println(res8) // >>> 1
res9, err := rdb.ZRemRangeByScore(ctx, "racer_scores", "-inf", "9").Result()
if err != nil {
panic(err)
}
fmt.Println(res9) // >>> 2
res10, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res10)
// >>> [Norem Royce Prickett]
}
func ExampleClient_zrank() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Prickett", Score: 14},
).Result()
if err != nil {
panic(err)
}
res11, err := rdb.ZRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res11) // >>> 0
res12, err := rdb.ZRevRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res12) // >>> 2
}
func ExampleClient_zaddlex() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
).Result()
res13, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Sam-Bodden", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Ford", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
redis.Z{Member: "Castilla", Score: 0},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res13) // >>> 3
res14, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res14)
// >>> [Castilla Ford Norem Prickett Royce Sam-Bodden]
res15, err := rdb.ZRangeByLex(ctx, "racer_scores", &redis.ZRangeBy{
Min: "[A", Max: "[L",
}).Result()
if err != nil {
panic(err)
}
fmt.Println(res15) // >>> [Castilla Ford]
}
func ExampleClient_leaderboard() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res16, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Wood", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res16) // >>> 1
res17, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res17) // >>> 1
res18, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 150},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res18) // >>> 0
res19, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Wood").Result()
if err != nil {
panic(err)
}
fmt.Println(res19) // >>> 150
res20, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Henshaw").Result()
if err != nil {
panic(err)
}
fmt.Println(res20) // >>> 200
}
using StackExchange.Redis;
public class SortedSetExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
bool res1 = db.SortedSetAdd("racer_scores", "Norem", 10);
Console.WriteLine(res1); // >>> True
bool res2 = db.SortedSetAdd("racer_scores", "Castilla", 12);
Console.WriteLine(res2); // >>> True
long res3 = db.SortedSetAdd("racer_scores", new[]{
new SortedSetEntry("Sam-Bodden", 8),
new SortedSetEntry("Royce", 10),
new SortedSetEntry("Ford", 6),
new SortedSetEntry("Prickett", 14),
new SortedSetEntry("Castilla", 12)
});
Console.WriteLine(res3); // >>> 4
RedisValue[] res4 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res4)); // >>> Ford, Sam-Bodden, Norem, Royce, Castilla, Prickett
RedisValue[] res5 = db.SortedSetRangeByRank("racer_scores", 0, -1, Order.Descending);
Console.WriteLine(string.Join(", ", res5)); // >>> Prickett, Castilla, Royce, Norem, Sam-Bodden, Ford
SortedSetEntry[] res6 = db.SortedSetRangeByRankWithScores("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res6)); // >>> Ford: 6, Sam-Bodden: 8, Norem: 10, Royce: 10, Castilla: 12, Prickett: 14
RedisValue[] res7 = db.SortedSetRangeByScore("racer_scores", double.NegativeInfinity, 10);
Console.WriteLine(string.Join(", ", res7)); // >>> Ford, Sam-Bodden, Norem, Royce
bool res8 = db.SortedSetRemove("racer_scores", "Castilla");
Console.WriteLine(res8); // >>> True
long res9 = db.SortedSetRemoveRangeByScore("racer_scores", double.NegativeInfinity, 9);
Console.WriteLine(res9); // >>> 2
RedisValue[] res10 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res10)); // >>> Norem, Royce, Prickett
long? res11 = db.SortedSetRank("racer_scores", "Norem");
Console.WriteLine(res11); // >>> 0
long? res12 = db.SortedSetRank("racer_scores", "Norem", Order.Descending);
Console.WriteLine(res12); // >>> 2
long res13 = db.SortedSetAdd("racer_scores", new[] {
new SortedSetEntry("Norem", 0),
new SortedSetEntry("Sam-Bodden", 0),
new SortedSetEntry("Royce", 0),
new SortedSetEntry("Ford", 0),
new SortedSetEntry("Prickett", 0),
new SortedSetEntry("Castilla", 0)
});
Console.WriteLine(res13); // >>> 3
RedisValue[] res14 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res14)); // >>> Castilla, Ford, Norem, Pricket, Royce, Sam-Bodden
RedisValue[] res15 = db.SortedSetRangeByValue("racer_scores", "A", "L", Exclude.None);
Console.WriteLine(string.Join(", ", res15)); // >>> Castilla, Ford
bool res16 = db.SortedSetAdd("racer_scores", "Wood", 100);
Console.WriteLine(res16); // >>> True
bool res17 = db.SortedSetAdd("racer_scores", "Henshaw", 100);
Console.WriteLine(res17); // >>> True
bool res18 = db.SortedSetAdd("racer_scores", "Henshaw", 150);
Console.WriteLine(res18); // >>> False
double res19 = db.SortedSetIncrement("racer_scores", "Wood", 50);
Console.WriteLine(res19); // >>> 150.0
double res20 = db.SortedSetIncrement("racer_scores", "Henshaw", 50);
Console.WriteLine(res20); // >>> 200.0
}
}
我们要求Redis返回所有分数在负无穷到10之间的元素(包括两个极端)。
要删除一个元素,我们只需调用ZREM
并传入赛车手的名字。
也可以删除一定范围的元素。让我们删除赛车手Castilla以及所有
得分严格少于10分的赛车手:
> ZREM racer_scores "Castilla"
(integer) 1
> ZREMRANGEBYSCORE racer_scores -inf 9
(integer) 2
> ZRANGE racer_scores 0 -1
1) "Norem"
2) "Royce"
3) "Prickett"
"""
Code samples for Sorted set doc pages:
https://redis.io/docs/latest/develop/data-types/sorted-sets/
"""
import redis
r = redis.Redis(decode_responses=True)
res1 = r.zadd("racer_scores", {"Norem": 10})
print(res1) # >>> 1
res2 = r.zadd("racer_scores", {"Castilla": 12})
print(res2) # >>> 1
res3 = r.zadd(
"racer_scores",
{"Sam-Bodden": 8, "Royce": 10, "Ford": 6, "Prickett": 14, "Castilla": 12},
)
print(res3) # >>> 4
res4 = r.zrange("racer_scores", 0, -1)
print(res4) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
res5 = r.zrevrange("racer_scores", 0, -1)
print(res5) # >>> ['Prickett', 'Castilla', 'Royce', 'Norem', 'Sam-Bodden', 'Ford']
res6 = r.zrange("racer_scores", 0, -1, withscores=True)
print(
res6
)
# >>> [
# ('Ford', 6.0), ('Sam-Bodden', 8.0), ('Norem', 10.0), ('Royce', 10.0),
# ('Castilla', 12.0), ('Prickett', 14.0)
# ]
res7 = r.zrangebyscore("racer_scores", "-inf", 10)
print(res7) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
res8 = r.zrem("racer_scores", "Castilla")
print(res8) # >>> 1
res9 = r.zremrangebyscore("racer_scores", "-inf", 9)
print(res9) # >>> 2
res10 = r.zrange("racer_scores", 0, -1)
print(res10) # >>> ['Norem', 'Royce', 'Prickett']
res11 = r.zrank("racer_scores", "Norem")
print(res11) # >>> 0
res12 = r.zrevrank("racer_scores", "Norem")
print(res12) # >>> 2
res13 = r.zadd(
"racer_scores",
{
"Norem": 0,
"Sam-Bodden": 0,
"Royce": 0,
"Ford": 0,
"Prickett": 0,
"Castilla": 0,
},
)
print(res13) # >>> 3
res14 = r.zrange("racer_scores", 0, -1)
print(res14) # >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
res15 = r.zrangebylex("racer_scores", "[A", "[L")
print(res15) # >>> ['Castilla', 'Ford']
res16 = r.zadd("racer_scores", {"Wood": 100})
print(res16) # >>> 1
res17 = r.zadd("racer_scores", {"Henshaw": 100})
print(res17) # >>> 1
res18 = r.zadd("racer_scores", {"Henshaw": 150})
print(res18) # >>> 0
res19 = r.zincrby("racer_scores", 50, "Wood")
print(res19) # >>> 150.0
res20 = r.zincrby("racer_scores", 50, "Henshaw")
print(res20) # >>> 200.0
import assert from 'assert';
import { createClient } from 'redis';
const client = createClient();
await client.connect();
const res1 = await client.zAdd('racer_scores', { score: 10, value: 'Norem' });
console.log(res1); // >>> 1
const res2 = await client.zAdd('racer_scores', { score: 12, value: 'Castilla' });
console.log(res2); // >>> 1
const res3 = await client.zAdd('racer_scores', [
{ score: 8, value: 'Sam-Bodden' },
{ score: 10, value: 'Royce' },
{ score: 6, value: 'Ford' },
{ score: 14, value: 'Prickett' },
{ score: 12, value: 'Castilla' }
]);
console.log(res3); // >>> 4
const res4 = await client.zRange('racer_scores', 0, -1);
console.log(res4); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
const res6 = await client.zRangeWithScores('racer_scores', 0, -1);
console.log(res6);
// >>> [
// { value: 'Ford', score: 6 }, { value: 'Sam-Bodden', score: 8 },
// { value: 'Norem', score: 10 }, { value: 'Royce', score: 10 },
// { value: 'Castilla', score: 12 }, { value: 'Prickett', score: 14 }
// ]
const res7 = await client.zRangeByScore('racer_scores', '-inf', 10);
console.log(res7); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
const res8 = await client.zRem('racer_scores', 'Castilla');
console.log(res8); // >>> 1
const res9 = await client.zRemRangeByScore('racer_scores', '-inf', 9);
console.log(res9); // >>> 2
const res10 = await client.zRange('racer_scores', 0, -1);
console.log(res10); // >>> ['Norem', 'Royce', 'Prickett']
const res11 = await client.zRank('racer_scores', 'Norem');
console.log(res11); // >>> 0
const res12 = await client.zRevRank('racer_scores', 'Norem');
console.log(res12); // >>> 2
const res13 = await client.zAdd('racer_scores', [
{ score: 0, value: 'Norem' },
{ score: 0, value: 'Sam-Bodden' },
{ score: 0, value: 'Royce' },
{ score: 0, value: 'Ford' },
{ score: 0, value: 'Prickett' },
{ score: 0, value: 'Castilla' }
]);
console.log(res13); // >>> 3
const res14 = await client.zRange('racer_scores', 0, -1);
console.log(res14); // >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
const res15 = await client.zRangeByLex('racer_scores', '[A', '[L');
console.log(res15); // >>> ['Castilla', 'Ford']
const res16 = await client.zAdd('racer_scores', { score: 100, value: 'Wood' });
console.log(res16); // >>> 1
const res17 = await client.zAdd('racer_scores', { score: 100, value: 'Henshaw' });
console.log(res17); // >>> 1
const res18 = await client.zAdd('racer_scores', { score: 150, value: 'Henshaw' }, { nx: true });
console.log(res18); // >>> 0
const res19 = await client.zIncrBy('racer_scores', 50, 'Wood');
console.log(res19); // >>> 150.0
const res20 = await client.zIncrBy('racer_scores', 50, 'Henshaw');
console.log(res20); // >>> 200.0
package io.redis.examples;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.resps.Tuple;
public class SortedSetsExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
long res1 = jedis.zadd("racer_scores", 10d, "Norem");
System.out.println(res1); // >>> 1
long res2 = jedis.zadd("racer_scores", 12d, "Castilla");
System.out.println(res2); // >>> 1
long res3 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Sam-Bodden", 8d);
put("Royce", 10d);
put("Ford", 6d);
put("Prickett", 14d);
put("Castilla", 12d);
}});
System.out.println(res3); // >>> 4
List<String> res4 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res4); // >>> [Ford, Sam-Bodden, Norem, Royce, Castil, Castilla, Prickett]
List<String> res5 = jedis.zrevrange("racer_scores", 0, -1);
System.out.println(res5); // >>> [Prickett, Castilla, Castil, Royce, Norem, Sam-Bodden, Ford]
List<Tuple> res6 = jedis.zrangeWithScores("racer_scores", 0, -1);
System.out.println(res6); // >>> [[Ford,6.0], [Sam-Bodden,8.0], [Norem,10.0], [Royce,10.0], [Castil,12.0], [Castilla,12.0], [Prickett,14.0]]
List<String> res7 = jedis.zrangeByScore("racer_scores", Double.MIN_VALUE, 10d);
System.out.println(res7); // >>> [Ford, Sam-Bodden, Norem, Royce]
long res8 = jedis.zrem("racer_scores", "Castilla");
System.out.println(res8); // >>> 1
long res9 = jedis.zremrangeByScore("racer_scores", Double.MIN_VALUE, 9d);
System.out.println(res9); // >>> 2
List<String> res10 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res10); // >>> [Norem, Royce, Prickett]
long res11 = jedis.zrank("racer_scores", "Norem");
System.out.println(res11); // >>> 0
long res12 = jedis.zrevrank("racer_scores", "Norem");
System.out.println(res12); // >>> 2
long res13 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Norem", 0d);
put("Sam-Bodden", 0d);
put("Royce", 0d);
put("Ford", 0d);
put("Prickett", 0d);
put("Castilla", 0d);
}});
System.out.println(res13); // >>> 3
List<String> res14 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res14); // >>> [Castilla, Ford, Norem, Prickett, Royce, Sam-Bodden]
List<String> res15 = jedis.zrangeByLex("racer_scores", "[A", "[L");
System.out.println(res15); // >>> [Castilla, Ford]
long res16 = jedis.zadd("racer_scores", 100d, "Wood");
System.out.println(res16); // >>> 1
long res17 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res17); // >>> 1
long res18 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res18); // >>> 0
double res19 = jedis.zincrby("racer_scores", 50d, "Wood");
System.out.println(res19); // >>> 150.0
double res20 = jedis.zincrby("racer_scores", 50d, "Henshaw");
System.out.println(res20); // >>> 200.0
}
}
package example_commands_test
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func ExampleClient_zadd() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res1, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res1) // >>> 1
res2, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res2) // >>> 1
res3, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res3) // >>> 4
}
func ExampleClient_zrange() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res4, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res4)
// >>> [Ford Sam-Bodden Norem Royce Castilla Prickett]
res5, err := rdb.ZRevRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res5)
// >>> [Prickett Castilla Royce Norem Sam-Bodden Ford]
}
func ExampleClient_zrangewithscores() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res6, err := rdb.ZRangeWithScores(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res6)
// >>> [{6 Ford} {8 Sam-Bodden} {10 Norem} {10 Royce} {12 Castilla} {14 Prickett}]
}
func ExampleClient_zrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res7, err := rdb.ZRangeByScore(ctx, "racer_scores",
&redis.ZRangeBy{Min: "-inf", Max: "10"},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res7)
// >>> [Ford Sam-Bodden Norem Royce]
}
func ExampleClient_zremrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res8, err := rdb.ZRem(ctx, "racer_scores", "Castilla").Result()
if err != nil {
panic(err)
}
fmt.Println(res8) // >>> 1
res9, err := rdb.ZRemRangeByScore(ctx, "racer_scores", "-inf", "9").Result()
if err != nil {
panic(err)
}
fmt.Println(res9) // >>> 2
res10, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res10)
// >>> [Norem Royce Prickett]
}
func ExampleClient_zrank() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Prickett", Score: 14},
).Result()
if err != nil {
panic(err)
}
res11, err := rdb.ZRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res11) // >>> 0
res12, err := rdb.ZRevRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res12) // >>> 2
}
func ExampleClient_zaddlex() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
).Result()
res13, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Sam-Bodden", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Ford", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
redis.Z{Member: "Castilla", Score: 0},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res13) // >>> 3
res14, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res14)
// >>> [Castilla Ford Norem Prickett Royce Sam-Bodden]
res15, err := rdb.ZRangeByLex(ctx, "racer_scores", &redis.ZRangeBy{
Min: "[A", Max: "[L",
}).Result()
if err != nil {
panic(err)
}
fmt.Println(res15) // >>> [Castilla Ford]
}
func ExampleClient_leaderboard() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res16, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Wood", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res16) // >>> 1
res17, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res17) // >>> 1
res18, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 150},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res18) // >>> 0
res19, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Wood").Result()
if err != nil {
panic(err)
}
fmt.Println(res19) // >>> 150
res20, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Henshaw").Result()
if err != nil {
panic(err)
}
fmt.Println(res20) // >>> 200
}
using StackExchange.Redis;
public class SortedSetExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
bool res1 = db.SortedSetAdd("racer_scores", "Norem", 10);
Console.WriteLine(res1); // >>> True
bool res2 = db.SortedSetAdd("racer_scores", "Castilla", 12);
Console.WriteLine(res2); // >>> True
long res3 = db.SortedSetAdd("racer_scores", new[]{
new SortedSetEntry("Sam-Bodden", 8),
new SortedSetEntry("Royce", 10),
new SortedSetEntry("Ford", 6),
new SortedSetEntry("Prickett", 14),
new SortedSetEntry("Castilla", 12)
});
Console.WriteLine(res3); // >>> 4
RedisValue[] res4 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res4)); // >>> Ford, Sam-Bodden, Norem, Royce, Castilla, Prickett
RedisValue[] res5 = db.SortedSetRangeByRank("racer_scores", 0, -1, Order.Descending);
Console.WriteLine(string.Join(", ", res5)); // >>> Prickett, Castilla, Royce, Norem, Sam-Bodden, Ford
SortedSetEntry[] res6 = db.SortedSetRangeByRankWithScores("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res6)); // >>> Ford: 6, Sam-Bodden: 8, Norem: 10, Royce: 10, Castilla: 12, Prickett: 14
RedisValue[] res7 = db.SortedSetRangeByScore("racer_scores", double.NegativeInfinity, 10);
Console.WriteLine(string.Join(", ", res7)); // >>> Ford, Sam-Bodden, Norem, Royce
bool res8 = db.SortedSetRemove("racer_scores", "Castilla");
Console.WriteLine(res8); // >>> True
long res9 = db.SortedSetRemoveRangeByScore("racer_scores", double.NegativeInfinity, 9);
Console.WriteLine(res9); // >>> 2
RedisValue[] res10 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res10)); // >>> Norem, Royce, Prickett
long? res11 = db.SortedSetRank("racer_scores", "Norem");
Console.WriteLine(res11); // >>> 0
long? res12 = db.SortedSetRank("racer_scores", "Norem", Order.Descending);
Console.WriteLine(res12); // >>> 2
long res13 = db.SortedSetAdd("racer_scores", new[] {
new SortedSetEntry("Norem", 0),
new SortedSetEntry("Sam-Bodden", 0),
new SortedSetEntry("Royce", 0),
new SortedSetEntry("Ford", 0),
new SortedSetEntry("Prickett", 0),
new SortedSetEntry("Castilla", 0)
});
Console.WriteLine(res13); // >>> 3
RedisValue[] res14 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res14)); // >>> Castilla, Ford, Norem, Pricket, Royce, Sam-Bodden
RedisValue[] res15 = db.SortedSetRangeByValue("racer_scores", "A", "L", Exclude.None);
Console.WriteLine(string.Join(", ", res15)); // >>> Castilla, Ford
bool res16 = db.SortedSetAdd("racer_scores", "Wood", 100);
Console.WriteLine(res16); // >>> True
bool res17 = db.SortedSetAdd("racer_scores", "Henshaw", 100);
Console.WriteLine(res17); // >>> True
bool res18 = db.SortedSetAdd("racer_scores", "Henshaw", 150);
Console.WriteLine(res18); // >>> False
double res19 = db.SortedSetIncrement("racer_scores", "Wood", 50);
Console.WriteLine(res19); // >>> 150.0
double res20 = db.SortedSetIncrement("racer_scores", "Henshaw", 50);
Console.WriteLine(res20); // >>> 200.0
}
}
ZREMRANGEBYSCORE
可能不是最好的命令名称,
但它非常有用,并返回被移除元素的数量。
另一个对排序集合元素非常有用的操作是获取排名操作。可以询问一个元素在有序元素集合中的位置。为了获取排名,还可以使用ZREVRANK
命令,考虑元素以降序方式排序。
> ZRANK racer_scores "Norem"
(integer) 0
> ZREVRANK racer_scores "Norem"
(integer) 3
"""
Code samples for Sorted set doc pages:
https://redis.io/docs/latest/develop/data-types/sorted-sets/
"""
import redis
r = redis.Redis(decode_responses=True)
res1 = r.zadd("racer_scores", {"Norem": 10})
print(res1) # >>> 1
res2 = r.zadd("racer_scores", {"Castilla": 12})
print(res2) # >>> 1
res3 = r.zadd(
"racer_scores",
{"Sam-Bodden": 8, "Royce": 10, "Ford": 6, "Prickett": 14, "Castilla": 12},
)
print(res3) # >>> 4
res4 = r.zrange("racer_scores", 0, -1)
print(res4) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
res5 = r.zrevrange("racer_scores", 0, -1)
print(res5) # >>> ['Prickett', 'Castilla', 'Royce', 'Norem', 'Sam-Bodden', 'Ford']
res6 = r.zrange("racer_scores", 0, -1, withscores=True)
print(
res6
)
# >>> [
# ('Ford', 6.0), ('Sam-Bodden', 8.0), ('Norem', 10.0), ('Royce', 10.0),
# ('Castilla', 12.0), ('Prickett', 14.0)
# ]
res7 = r.zrangebyscore("racer_scores", "-inf", 10)
print(res7) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
res8 = r.zrem("racer_scores", "Castilla")
print(res8) # >>> 1
res9 = r.zremrangebyscore("racer_scores", "-inf", 9)
print(res9) # >>> 2
res10 = r.zrange("racer_scores", 0, -1)
print(res10) # >>> ['Norem', 'Royce', 'Prickett']
res11 = r.zrank("racer_scores", "Norem")
print(res11) # >>> 0
res12 = r.zrevrank("racer_scores", "Norem")
print(res12) # >>> 2
res13 = r.zadd(
"racer_scores",
{
"Norem": 0,
"Sam-Bodden": 0,
"Royce": 0,
"Ford": 0,
"Prickett": 0,
"Castilla": 0,
},
)
print(res13) # >>> 3
res14 = r.zrange("racer_scores", 0, -1)
print(res14) # >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
res15 = r.zrangebylex("racer_scores", "[A", "[L")
print(res15) # >>> ['Castilla', 'Ford']
res16 = r.zadd("racer_scores", {"Wood": 100})
print(res16) # >>> 1
res17 = r.zadd("racer_scores", {"Henshaw": 100})
print(res17) # >>> 1
res18 = r.zadd("racer_scores", {"Henshaw": 150})
print(res18) # >>> 0
res19 = r.zincrby("racer_scores", 50, "Wood")
print(res19) # >>> 150.0
res20 = r.zincrby("racer_scores", 50, "Henshaw")
print(res20) # >>> 200.0
import assert from 'assert';
import { createClient } from 'redis';
const client = createClient();
await client.connect();
const res1 = await client.zAdd('racer_scores', { score: 10, value: 'Norem' });
console.log(res1); // >>> 1
const res2 = await client.zAdd('racer_scores', { score: 12, value: 'Castilla' });
console.log(res2); // >>> 1
const res3 = await client.zAdd('racer_scores', [
{ score: 8, value: 'Sam-Bodden' },
{ score: 10, value: 'Royce' },
{ score: 6, value: 'Ford' },
{ score: 14, value: 'Prickett' },
{ score: 12, value: 'Castilla' }
]);
console.log(res3); // >>> 4
const res4 = await client.zRange('racer_scores', 0, -1);
console.log(res4); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
const res6 = await client.zRangeWithScores('racer_scores', 0, -1);
console.log(res6);
// >>> [
// { value: 'Ford', score: 6 }, { value: 'Sam-Bodden', score: 8 },
// { value: 'Norem', score: 10 }, { value: 'Royce', score: 10 },
// { value: 'Castilla', score: 12 }, { value: 'Prickett', score: 14 }
// ]
const res7 = await client.zRangeByScore('racer_scores', '-inf', 10);
console.log(res7); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
const res8 = await client.zRem('racer_scores', 'Castilla');
console.log(res8); // >>> 1
const res9 = await client.zRemRangeByScore('racer_scores', '-inf', 9);
console.log(res9); // >>> 2
const res10 = await client.zRange('racer_scores', 0, -1);
console.log(res10); // >>> ['Norem', 'Royce', 'Prickett']
const res11 = await client.zRank('racer_scores', 'Norem');
console.log(res11); // >>> 0
const res12 = await client.zRevRank('racer_scores', 'Norem');
console.log(res12); // >>> 2
const res13 = await client.zAdd('racer_scores', [
{ score: 0, value: 'Norem' },
{ score: 0, value: 'Sam-Bodden' },
{ score: 0, value: 'Royce' },
{ score: 0, value: 'Ford' },
{ score: 0, value: 'Prickett' },
{ score: 0, value: 'Castilla' }
]);
console.log(res13); // >>> 3
const res14 = await client.zRange('racer_scores', 0, -1);
console.log(res14); // >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
const res15 = await client.zRangeByLex('racer_scores', '[A', '[L');
console.log(res15); // >>> ['Castilla', 'Ford']
const res16 = await client.zAdd('racer_scores', { score: 100, value: 'Wood' });
console.log(res16); // >>> 1
const res17 = await client.zAdd('racer_scores', { score: 100, value: 'Henshaw' });
console.log(res17); // >>> 1
const res18 = await client.zAdd('racer_scores', { score: 150, value: 'Henshaw' }, { nx: true });
console.log(res18); // >>> 0
const res19 = await client.zIncrBy('racer_scores', 50, 'Wood');
console.log(res19); // >>> 150.0
const res20 = await client.zIncrBy('racer_scores', 50, 'Henshaw');
console.log(res20); // >>> 200.0
package io.redis.examples;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.resps.Tuple;
public class SortedSetsExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
long res1 = jedis.zadd("racer_scores", 10d, "Norem");
System.out.println(res1); // >>> 1
long res2 = jedis.zadd("racer_scores", 12d, "Castilla");
System.out.println(res2); // >>> 1
long res3 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Sam-Bodden", 8d);
put("Royce", 10d);
put("Ford", 6d);
put("Prickett", 14d);
put("Castilla", 12d);
}});
System.out.println(res3); // >>> 4
List<String> res4 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res4); // >>> [Ford, Sam-Bodden, Norem, Royce, Castil, Castilla, Prickett]
List<String> res5 = jedis.zrevrange("racer_scores", 0, -1);
System.out.println(res5); // >>> [Prickett, Castilla, Castil, Royce, Norem, Sam-Bodden, Ford]
List<Tuple> res6 = jedis.zrangeWithScores("racer_scores", 0, -1);
System.out.println(res6); // >>> [[Ford,6.0], [Sam-Bodden,8.0], [Norem,10.0], [Royce,10.0], [Castil,12.0], [Castilla,12.0], [Prickett,14.0]]
List<String> res7 = jedis.zrangeByScore("racer_scores", Double.MIN_VALUE, 10d);
System.out.println(res7); // >>> [Ford, Sam-Bodden, Norem, Royce]
long res8 = jedis.zrem("racer_scores", "Castilla");
System.out.println(res8); // >>> 1
long res9 = jedis.zremrangeByScore("racer_scores", Double.MIN_VALUE, 9d);
System.out.println(res9); // >>> 2
List<String> res10 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res10); // >>> [Norem, Royce, Prickett]
long res11 = jedis.zrank("racer_scores", "Norem");
System.out.println(res11); // >>> 0
long res12 = jedis.zrevrank("racer_scores", "Norem");
System.out.println(res12); // >>> 2
long res13 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Norem", 0d);
put("Sam-Bodden", 0d);
put("Royce", 0d);
put("Ford", 0d);
put("Prickett", 0d);
put("Castilla", 0d);
}});
System.out.println(res13); // >>> 3
List<String> res14 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res14); // >>> [Castilla, Ford, Norem, Prickett, Royce, Sam-Bodden]
List<String> res15 = jedis.zrangeByLex("racer_scores", "[A", "[L");
System.out.println(res15); // >>> [Castilla, Ford]
long res16 = jedis.zadd("racer_scores", 100d, "Wood");
System.out.println(res16); // >>> 1
long res17 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res17); // >>> 1
long res18 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res18); // >>> 0
double res19 = jedis.zincrby("racer_scores", 50d, "Wood");
System.out.println(res19); // >>> 150.0
double res20 = jedis.zincrby("racer_scores", 50d, "Henshaw");
System.out.println(res20); // >>> 200.0
}
}
package example_commands_test
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func ExampleClient_zadd() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res1, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res1) // >>> 1
res2, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res2) // >>> 1
res3, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res3) // >>> 4
}
func ExampleClient_zrange() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res4, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res4)
// >>> [Ford Sam-Bodden Norem Royce Castilla Prickett]
res5, err := rdb.ZRevRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res5)
// >>> [Prickett Castilla Royce Norem Sam-Bodden Ford]
}
func ExampleClient_zrangewithscores() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res6, err := rdb.ZRangeWithScores(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res6)
// >>> [{6 Ford} {8 Sam-Bodden} {10 Norem} {10 Royce} {12 Castilla} {14 Prickett}]
}
func ExampleClient_zrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res7, err := rdb.ZRangeByScore(ctx, "racer_scores",
&redis.ZRangeBy{Min: "-inf", Max: "10"},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res7)
// >>> [Ford Sam-Bodden Norem Royce]
}
func ExampleClient_zremrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res8, err := rdb.ZRem(ctx, "racer_scores", "Castilla").Result()
if err != nil {
panic(err)
}
fmt.Println(res8) // >>> 1
res9, err := rdb.ZRemRangeByScore(ctx, "racer_scores", "-inf", "9").Result()
if err != nil {
panic(err)
}
fmt.Println(res9) // >>> 2
res10, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res10)
// >>> [Norem Royce Prickett]
}
func ExampleClient_zrank() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Prickett", Score: 14},
).Result()
if err != nil {
panic(err)
}
res11, err := rdb.ZRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res11) // >>> 0
res12, err := rdb.ZRevRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res12) // >>> 2
}
func ExampleClient_zaddlex() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
).Result()
res13, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Sam-Bodden", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Ford", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
redis.Z{Member: "Castilla", Score: 0},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res13) // >>> 3
res14, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res14)
// >>> [Castilla Ford Norem Prickett Royce Sam-Bodden]
res15, err := rdb.ZRangeByLex(ctx, "racer_scores", &redis.ZRangeBy{
Min: "[A", Max: "[L",
}).Result()
if err != nil {
panic(err)
}
fmt.Println(res15) // >>> [Castilla Ford]
}
func ExampleClient_leaderboard() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res16, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Wood", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res16) // >>> 1
res17, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res17) // >>> 1
res18, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 150},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res18) // >>> 0
res19, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Wood").Result()
if err != nil {
panic(err)
}
fmt.Println(res19) // >>> 150
res20, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Henshaw").Result()
if err != nil {
panic(err)
}
fmt.Println(res20) // >>> 200
}
using StackExchange.Redis;
public class SortedSetExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
bool res1 = db.SortedSetAdd("racer_scores", "Norem", 10);
Console.WriteLine(res1); // >>> True
bool res2 = db.SortedSetAdd("racer_scores", "Castilla", 12);
Console.WriteLine(res2); // >>> True
long res3 = db.SortedSetAdd("racer_scores", new[]{
new SortedSetEntry("Sam-Bodden", 8),
new SortedSetEntry("Royce", 10),
new SortedSetEntry("Ford", 6),
new SortedSetEntry("Prickett", 14),
new SortedSetEntry("Castilla", 12)
});
Console.WriteLine(res3); // >>> 4
RedisValue[] res4 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res4)); // >>> Ford, Sam-Bodden, Norem, Royce, Castilla, Prickett
RedisValue[] res5 = db.SortedSetRangeByRank("racer_scores", 0, -1, Order.Descending);
Console.WriteLine(string.Join(", ", res5)); // >>> Prickett, Castilla, Royce, Norem, Sam-Bodden, Ford
SortedSetEntry[] res6 = db.SortedSetRangeByRankWithScores("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res6)); // >>> Ford: 6, Sam-Bodden: 8, Norem: 10, Royce: 10, Castilla: 12, Prickett: 14
RedisValue[] res7 = db.SortedSetRangeByScore("racer_scores", double.NegativeInfinity, 10);
Console.WriteLine(string.Join(", ", res7)); // >>> Ford, Sam-Bodden, Norem, Royce
bool res8 = db.SortedSetRemove("racer_scores", "Castilla");
Console.WriteLine(res8); // >>> True
long res9 = db.SortedSetRemoveRangeByScore("racer_scores", double.NegativeInfinity, 9);
Console.WriteLine(res9); // >>> 2
RedisValue[] res10 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res10)); // >>> Norem, Royce, Prickett
long? res11 = db.SortedSetRank("racer_scores", "Norem");
Console.WriteLine(res11); // >>> 0
long? res12 = db.SortedSetRank("racer_scores", "Norem", Order.Descending);
Console.WriteLine(res12); // >>> 2
long res13 = db.SortedSetAdd("racer_scores", new[] {
new SortedSetEntry("Norem", 0),
new SortedSetEntry("Sam-Bodden", 0),
new SortedSetEntry("Royce", 0),
new SortedSetEntry("Ford", 0),
new SortedSetEntry("Prickett", 0),
new SortedSetEntry("Castilla", 0)
});
Console.WriteLine(res13); // >>> 3
RedisValue[] res14 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res14)); // >>> Castilla, Ford, Norem, Pricket, Royce, Sam-Bodden
RedisValue[] res15 = db.SortedSetRangeByValue("racer_scores", "A", "L", Exclude.None);
Console.WriteLine(string.Join(", ", res15)); // >>> Castilla, Ford
bool res16 = db.SortedSetAdd("racer_scores", "Wood", 100);
Console.WriteLine(res16); // >>> True
bool res17 = db.SortedSetAdd("racer_scores", "Henshaw", 100);
Console.WriteLine(res17); // >>> True
bool res18 = db.SortedSetAdd("racer_scores", "Henshaw", 150);
Console.WriteLine(res18); // >>> False
double res19 = db.SortedSetIncrement("racer_scores", "Wood", 50);
Console.WriteLine(res19); // >>> 150.0
double res20 = db.SortedSetIncrement("racer_scores", "Henshaw", 50);
Console.WriteLine(res20); // >>> 200.0
}
}
词典编纂分数
在Redis 2.8版本中,引入了一个新特性,允许按字典顺序获取范围,假设有序集合中的所有元素都以相同的分数插入(元素使用C语言的memcmp
函数进行比较,因此保证没有排序规则,每个Redis实例都会返回相同的输出)。
用于操作字典范围的主要命令是 ZRANGEBYLEX
、
ZREVRANGEBYLEX
、ZREMRANGEBYLEX
和 ZLEXCOUNT
。
例如,让我们再次添加我们的著名赛车手列表,但这次为所有元素使用零分。我们会看到,由于排序集合的排序规则,它们已经按字典顺序排序。使用ZRANGEBYLEX
,我们可以请求字典范围:
> ZADD racer_scores 0 "Norem" 0 "Sam-Bodden" 0 "Royce" 0 "Castilla" 0 "Prickett" 0 "Ford"
(integer) 3
> ZRANGE racer_scores 0 -1
1) "Castilla"
2) "Ford"
3) "Norem"
4) "Prickett"
5) "Royce"
6) "Sam-Bodden"
> ZRANGEBYLEX racer_scores [A [L
1) "Castilla"
2) "Ford"
"""
Code samples for Sorted set doc pages:
https://redis.io/docs/latest/develop/data-types/sorted-sets/
"""
import redis
r = redis.Redis(decode_responses=True)
res1 = r.zadd("racer_scores", {"Norem": 10})
print(res1) # >>> 1
res2 = r.zadd("racer_scores", {"Castilla": 12})
print(res2) # >>> 1
res3 = r.zadd(
"racer_scores",
{"Sam-Bodden": 8, "Royce": 10, "Ford": 6, "Prickett": 14, "Castilla": 12},
)
print(res3) # >>> 4
res4 = r.zrange("racer_scores", 0, -1)
print(res4) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
res5 = r.zrevrange("racer_scores", 0, -1)
print(res5) # >>> ['Prickett', 'Castilla', 'Royce', 'Norem', 'Sam-Bodden', 'Ford']
res6 = r.zrange("racer_scores", 0, -1, withscores=True)
print(
res6
)
# >>> [
# ('Ford', 6.0), ('Sam-Bodden', 8.0), ('Norem', 10.0), ('Royce', 10.0),
# ('Castilla', 12.0), ('Prickett', 14.0)
# ]
res7 = r.zrangebyscore("racer_scores", "-inf", 10)
print(res7) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
res8 = r.zrem("racer_scores", "Castilla")
print(res8) # >>> 1
res9 = r.zremrangebyscore("racer_scores", "-inf", 9)
print(res9) # >>> 2
res10 = r.zrange("racer_scores", 0, -1)
print(res10) # >>> ['Norem', 'Royce', 'Prickett']
res11 = r.zrank("racer_scores", "Norem")
print(res11) # >>> 0
res12 = r.zrevrank("racer_scores", "Norem")
print(res12) # >>> 2
res13 = r.zadd(
"racer_scores",
{
"Norem": 0,
"Sam-Bodden": 0,
"Royce": 0,
"Ford": 0,
"Prickett": 0,
"Castilla": 0,
},
)
print(res13) # >>> 3
res14 = r.zrange("racer_scores", 0, -1)
print(res14) # >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
res15 = r.zrangebylex("racer_scores", "[A", "[L")
print(res15) # >>> ['Castilla', 'Ford']
res16 = r.zadd("racer_scores", {"Wood": 100})
print(res16) # >>> 1
res17 = r.zadd("racer_scores", {"Henshaw": 100})
print(res17) # >>> 1
res18 = r.zadd("racer_scores", {"Henshaw": 150})
print(res18) # >>> 0
res19 = r.zincrby("racer_scores", 50, "Wood")
print(res19) # >>> 150.0
res20 = r.zincrby("racer_scores", 50, "Henshaw")
print(res20) # >>> 200.0
import assert from 'assert';
import { createClient } from 'redis';
const client = createClient();
await client.connect();
const res1 = await client.zAdd('racer_scores', { score: 10, value: 'Norem' });
console.log(res1); // >>> 1
const res2 = await client.zAdd('racer_scores', { score: 12, value: 'Castilla' });
console.log(res2); // >>> 1
const res3 = await client.zAdd('racer_scores', [
{ score: 8, value: 'Sam-Bodden' },
{ score: 10, value: 'Royce' },
{ score: 6, value: 'Ford' },
{ score: 14, value: 'Prickett' },
{ score: 12, value: 'Castilla' }
]);
console.log(res3); // >>> 4
const res4 = await client.zRange('racer_scores', 0, -1);
console.log(res4); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett']
const res6 = await client.zRangeWithScores('racer_scores', 0, -1);
console.log(res6);
// >>> [
// { value: 'Ford', score: 6 }, { value: 'Sam-Bodden', score: 8 },
// { value: 'Norem', score: 10 }, { value: 'Royce', score: 10 },
// { value: 'Castilla', score: 12 }, { value: 'Prickett', score: 14 }
// ]
const res7 = await client.zRangeByScore('racer_scores', '-inf', 10);
console.log(res7); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce']
const res8 = await client.zRem('racer_scores', 'Castilla');
console.log(res8); // >>> 1
const res9 = await client.zRemRangeByScore('racer_scores', '-inf', 9);
console.log(res9); // >>> 2
const res10 = await client.zRange('racer_scores', 0, -1);
console.log(res10); // >>> ['Norem', 'Royce', 'Prickett']
const res11 = await client.zRank('racer_scores', 'Norem');
console.log(res11); // >>> 0
const res12 = await client.zRevRank('racer_scores', 'Norem');
console.log(res12); // >>> 2
const res13 = await client.zAdd('racer_scores', [
{ score: 0, value: 'Norem' },
{ score: 0, value: 'Sam-Bodden' },
{ score: 0, value: 'Royce' },
{ score: 0, value: 'Ford' },
{ score: 0, value: 'Prickett' },
{ score: 0, value: 'Castilla' }
]);
console.log(res13); // >>> 3
const res14 = await client.zRange('racer_scores', 0, -1);
console.log(res14); // >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden']
const res15 = await client.zRangeByLex('racer_scores', '[A', '[L');
console.log(res15); // >>> ['Castilla', 'Ford']
const res16 = await client.zAdd('racer_scores', { score: 100, value: 'Wood' });
console.log(res16); // >>> 1
const res17 = await client.zAdd('racer_scores', { score: 100, value: 'Henshaw' });
console.log(res17); // >>> 1
const res18 = await client.zAdd('racer_scores', { score: 150, value: 'Henshaw' }, { nx: true });
console.log(res18); // >>> 0
const res19 = await client.zIncrBy('racer_scores', 50, 'Wood');
console.log(res19); // >>> 150.0
const res20 = await client.zIncrBy('racer_scores', 50, 'Henshaw');
console.log(res20); // >>> 200.0
package io.redis.examples;
import redis.clients.jedis.UnifiedJedis;
import redis.clients.jedis.resps.Tuple;
public class SortedSetsExample {
public void run() {
UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379");
long res1 = jedis.zadd("racer_scores", 10d, "Norem");
System.out.println(res1); // >>> 1
long res2 = jedis.zadd("racer_scores", 12d, "Castilla");
System.out.println(res2); // >>> 1
long res3 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Sam-Bodden", 8d);
put("Royce", 10d);
put("Ford", 6d);
put("Prickett", 14d);
put("Castilla", 12d);
}});
System.out.println(res3); // >>> 4
List<String> res4 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res4); // >>> [Ford, Sam-Bodden, Norem, Royce, Castil, Castilla, Prickett]
List<String> res5 = jedis.zrevrange("racer_scores", 0, -1);
System.out.println(res5); // >>> [Prickett, Castilla, Castil, Royce, Norem, Sam-Bodden, Ford]
List<Tuple> res6 = jedis.zrangeWithScores("racer_scores", 0, -1);
System.out.println(res6); // >>> [[Ford,6.0], [Sam-Bodden,8.0], [Norem,10.0], [Royce,10.0], [Castil,12.0], [Castilla,12.0], [Prickett,14.0]]
List<String> res7 = jedis.zrangeByScore("racer_scores", Double.MIN_VALUE, 10d);
System.out.println(res7); // >>> [Ford, Sam-Bodden, Norem, Royce]
long res8 = jedis.zrem("racer_scores", "Castilla");
System.out.println(res8); // >>> 1
long res9 = jedis.zremrangeByScore("racer_scores", Double.MIN_VALUE, 9d);
System.out.println(res9); // >>> 2
List<String> res10 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res10); // >>> [Norem, Royce, Prickett]
long res11 = jedis.zrank("racer_scores", "Norem");
System.out.println(res11); // >>> 0
long res12 = jedis.zrevrank("racer_scores", "Norem");
System.out.println(res12); // >>> 2
long res13 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{
put("Norem", 0d);
put("Sam-Bodden", 0d);
put("Royce", 0d);
put("Ford", 0d);
put("Prickett", 0d);
put("Castilla", 0d);
}});
System.out.println(res13); // >>> 3
List<String> res14 = jedis.zrange("racer_scores", 0, -1);
System.out.println(res14); // >>> [Castilla, Ford, Norem, Prickett, Royce, Sam-Bodden]
List<String> res15 = jedis.zrangeByLex("racer_scores", "[A", "[L");
System.out.println(res15); // >>> [Castilla, Ford]
long res16 = jedis.zadd("racer_scores", 100d, "Wood");
System.out.println(res16); // >>> 1
long res17 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res17); // >>> 1
long res18 = jedis.zadd("racer_scores", 100d, "Henshaw");
System.out.println(res18); // >>> 0
double res19 = jedis.zincrby("racer_scores", 50d, "Wood");
System.out.println(res19); // >>> 150.0
double res20 = jedis.zincrby("racer_scores", 50d, "Henshaw");
System.out.println(res20); // >>> 200.0
}
}
package example_commands_test
import (
"context"
"fmt"
"github.com/redis/go-redis/v9"
)
func ExampleClient_zadd() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res1, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res1) // >>> 1
res2, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res2) // >>> 1
res3, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res3) // >>> 4
}
func ExampleClient_zrange() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res4, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res4)
// >>> [Ford Sam-Bodden Norem Royce Castilla Prickett]
res5, err := rdb.ZRevRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res5)
// >>> [Prickett Castilla Royce Norem Sam-Bodden Ford]
}
func ExampleClient_zrangewithscores() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res6, err := rdb.ZRangeWithScores(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res6)
// >>> [{6 Ford} {8 Sam-Bodden} {10 Norem} {10 Royce} {12 Castilla} {14 Prickett}]
}
func ExampleClient_zrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res7, err := rdb.ZRangeByScore(ctx, "racer_scores",
&redis.ZRangeBy{Min: "-inf", Max: "10"},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res7)
// >>> [Ford Sam-Bodden Norem Royce]
}
func ExampleClient_zremrangebyscore() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Sam-Bodden", Score: 8},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Ford", Score: 6},
redis.Z{Member: "Prickett", Score: 14},
redis.Z{Member: "Castilla", Score: 12},
).Result()
if err != nil {
panic(err)
}
res8, err := rdb.ZRem(ctx, "racer_scores", "Castilla").Result()
if err != nil {
panic(err)
}
fmt.Println(res8) // >>> 1
res9, err := rdb.ZRemRangeByScore(ctx, "racer_scores", "-inf", "9").Result()
if err != nil {
panic(err)
}
fmt.Println(res9) // >>> 2
res10, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res10)
// >>> [Norem Royce Prickett]
}
func ExampleClient_zrank() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 10},
redis.Z{Member: "Royce", Score: 10},
redis.Z{Member: "Prickett", Score: 14},
).Result()
if err != nil {
panic(err)
}
res11, err := rdb.ZRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res11) // >>> 0
res12, err := rdb.ZRevRank(ctx, "racer_scores", "Norem").Result()
if err != nil {
panic(err)
}
fmt.Println(res12) // >>> 2
}
func ExampleClient_zaddlex() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
_, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
).Result()
res13, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Norem", Score: 0},
redis.Z{Member: "Sam-Bodden", Score: 0},
redis.Z{Member: "Royce", Score: 0},
redis.Z{Member: "Ford", Score: 0},
redis.Z{Member: "Prickett", Score: 0},
redis.Z{Member: "Castilla", Score: 0},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res13) // >>> 3
res14, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result()
if err != nil {
panic(err)
}
fmt.Println(res14)
// >>> [Castilla Ford Norem Prickett Royce Sam-Bodden]
res15, err := rdb.ZRangeByLex(ctx, "racer_scores", &redis.ZRangeBy{
Min: "[A", Max: "[L",
}).Result()
if err != nil {
panic(err)
}
fmt.Println(res15) // >>> [Castilla Ford]
}
func ExampleClient_leaderboard() {
ctx := context.Background()
rdb := redis.NewClient(&redis.Options{
Addr: "localhost:6379",
Password: "", // no password docs
DB: 0, // use default DB
})
res16, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Wood", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res16) // >>> 1
res17, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 100},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res17) // >>> 1
res18, err := rdb.ZAdd(ctx, "racer_scores",
redis.Z{Member: "Henshaw", Score: 150},
).Result()
if err != nil {
panic(err)
}
fmt.Println(res18) // >>> 0
res19, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Wood").Result()
if err != nil {
panic(err)
}
fmt.Println(res19) // >>> 150
res20, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Henshaw").Result()
if err != nil {
panic(err)
}
fmt.Println(res20) // >>> 200
}
using StackExchange.Redis;
public class SortedSetExample
{
public void run()
{
var muxer = ConnectionMultiplexer.Connect("localhost:6379");
var db = muxer.GetDatabase();
bool res1 = db.SortedSetAdd("racer_scores", "Norem", 10);
Console.WriteLine(res1); // >>> True
bool res2 = db.SortedSetAdd("racer_scores", "Castilla", 12);
Console.WriteLine(res2); // >>> True
long res3 = db.SortedSetAdd("racer_scores", new[]{
new SortedSetEntry("Sam-Bodden", 8),
new SortedSetEntry("Royce", 10),
new SortedSetEntry("Ford", 6),
new SortedSetEntry("Prickett", 14),
new SortedSetEntry("Castilla", 12)
});
Console.WriteLine(res3); // >>> 4
RedisValue[] res4 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res4)); // >>> Ford, Sam-Bodden, Norem, Royce, Castilla, Prickett
RedisValue[] res5 = db.SortedSetRangeByRank("racer_scores", 0, -1, Order.Descending);
Console.WriteLine(string.Join(", ", res5)); // >>> Prickett, Castilla, Royce, Norem, Sam-Bodden, Ford
SortedSetEntry[] res6 = db.SortedSetRangeByRankWithScores("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res6)); // >>> Ford: 6, Sam-Bodden: 8, Norem: 10, Royce: 10, Castilla: 12, Prickett: 14
RedisValue[] res7 = db.SortedSetRangeByScore("racer_scores", double.NegativeInfinity, 10);
Console.WriteLine(string.Join(", ", res7)); // >>> Ford, Sam-Bodden, Norem, Royce
bool res8 = db.SortedSetRemove("racer_scores", "Castilla");
Console.WriteLine(res8); // >>> True
long res9 = db.SortedSetRemoveRangeByScore("racer_scores", double.NegativeInfinity, 9);
Console.WriteLine(res9); // >>> 2
RedisValue[] res10 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res10)); // >>> Norem, Royce, Prickett
long? res11 = db.SortedSetRank("racer_scores", "Norem");
Console.WriteLine(res11); // >>> 0
long? res12 = db.SortedSetRank("racer_scores", "Norem", Order.Descending);
Console.WriteLine(res12); // >>> 2
long res13 = db.SortedSetAdd("racer_scores", new[] {
new SortedSetEntry("Norem", 0),
new SortedSetEntry("Sam-Bodden", 0),
new SortedSetEntry("Royce", 0),
new SortedSetEntry("Ford", 0),
new SortedSetEntry("Prickett", 0),
new SortedSetEntry("Castilla", 0)
});
Console.WriteLine(res13); // >>> 3
RedisValue[] res14 = db.SortedSetRangeByRank("racer_scores", 0, -1);
Console.WriteLine(string.Join(", ", res14)); // >>> Castilla, Ford, Norem, Pricket, Royce, Sam-Bodden
RedisValue[] res15 = db.SortedSetRangeByValue("racer_scores", "A", "L", Exclude.None);
Console.WriteLine(string.Join(", ", res15)); // >>> Castilla, Ford
bool res16 = db.SortedSetAdd("racer_scores", "Wood", 100);
Console.WriteLine(res16); // >>> True
bool res17 = db.SortedSetAdd("racer_scores", "Henshaw", 100);
Console.WriteLine(res17); // >>> True
bool res18 = db.SortedSetAdd("racer_scores", "Henshaw", 150);
Console.WriteLine(res18); // >>> False
double res19 = db.SortedSetIncrement("racer_scores", "Wood", 50);
Console.WriteLine(res19); // >>> 150.0
double res20 = db.SortedSetIncrement("racer_scores", "Henshaw", 50);
Console.WriteLine(res20); // >>> 200.0
}
}
范围可以是包含的或排除的(取决于第一个字符),
字符串无限和负无限分别用+
和-
字符串指定。有关更多信息,请参阅文档。
这个功能很重要,因为它允许我们使用有序集合作为通用索引。例如,如果你想通过一个128位无符号整数参数来索引元素,你只需要将元素添加到一个有序集合中,使用相同的分数(例如0),但带有一个16字节的前缀,该前缀由大端序的128位数字组成。由于大端序的数字在按字典顺序(按原始字节顺序)排序时实际上也是按数字顺序排序的,因此你可以请求128位空间中的范围,并获取元素的值,同时丢弃前缀。
更新分数:排行榜
在切换到下一个主题之前,最后一点关于有序集合的说明。
有序集合的分数可以随时更新。只需对已包含在有序集合中的元素调用ZADD
即可更新其分数
(和位置),时间复杂度为O(log(N))。因此,当有大量更新时,有序集合是合适的。
由于这一特性,一个常见的用例是排行榜。 典型的应用是Facebook游戏,你可以结合按高分排序用户的能力,加上获取排名操作,以显示前N名用户,以及用户在排行榜中的排名(例如,“你在这里是第4932名最高分”)。
示例
- There are two ways we can use a sorted set to represent a leaderboard. If we know a racer's new score, we can update it directly via the
ZADD
command. However, if we want to add points to an existing score, we can use theZINCRBY
command.> ZADD racer_scores 100 "Wood" (integer) 1 > ZADD racer_scores 100 "Henshaw" (integer) 1 > ZADD racer_scores 150 "Henshaw" (integer) 0 > ZINCRBY racer_scores 50 "Wood" "150" > ZINCRBY racer_scores 50 "Henshaw" "200"
Are you tired of using redis-cli? Try Redis Insight - the developer GUI for Redis.""" Code samples for Sorted set doc pages: https://redis.io/docs/latest/develop/data-types/sorted-sets/ """ import redis r = redis.Redis(decode_responses=True) res1 = r.zadd("racer_scores", {"Norem": 10}) print(res1) # >>> 1 res2 = r.zadd("racer_scores", {"Castilla": 12}) print(res2) # >>> 1 res3 = r.zadd( "racer_scores", {"Sam-Bodden": 8, "Royce": 10, "Ford": 6, "Prickett": 14, "Castilla": 12}, ) print(res3) # >>> 4 res4 = r.zrange("racer_scores", 0, -1) print(res4) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett'] res5 = r.zrevrange("racer_scores", 0, -1) print(res5) # >>> ['Prickett', 'Castilla', 'Royce', 'Norem', 'Sam-Bodden', 'Ford'] res6 = r.zrange("racer_scores", 0, -1, withscores=True) print( res6 ) # >>> [ # ('Ford', 6.0), ('Sam-Bodden', 8.0), ('Norem', 10.0), ('Royce', 10.0), # ('Castilla', 12.0), ('Prickett', 14.0) # ] res7 = r.zrangebyscore("racer_scores", "-inf", 10) print(res7) # >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce'] res8 = r.zrem("racer_scores", "Castilla") print(res8) # >>> 1 res9 = r.zremrangebyscore("racer_scores", "-inf", 9) print(res9) # >>> 2 res10 = r.zrange("racer_scores", 0, -1) print(res10) # >>> ['Norem', 'Royce', 'Prickett'] res11 = r.zrank("racer_scores", "Norem") print(res11) # >>> 0 res12 = r.zrevrank("racer_scores", "Norem") print(res12) # >>> 2 res13 = r.zadd( "racer_scores", { "Norem": 0, "Sam-Bodden": 0, "Royce": 0, "Ford": 0, "Prickett": 0, "Castilla": 0, }, ) print(res13) # >>> 3 res14 = r.zrange("racer_scores", 0, -1) print(res14) # >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden'] res15 = r.zrangebylex("racer_scores", "[A", "[L") print(res15) # >>> ['Castilla', 'Ford'] res16 = r.zadd("racer_scores", {"Wood": 100}) print(res16) # >>> 1 res17 = r.zadd("racer_scores", {"Henshaw": 100}) print(res17) # >>> 1 res18 = r.zadd("racer_scores", {"Henshaw": 150}) print(res18) # >>> 0 res19 = r.zincrby("racer_scores", 50, "Wood") print(res19) # >>> 150.0 res20 = r.zincrby("racer_scores", 50, "Henshaw") print(res20) # >>> 200.0
import assert from 'assert'; import { createClient } from 'redis'; const client = createClient(); await client.connect(); const res1 = await client.zAdd('racer_scores', { score: 10, value: 'Norem' }); console.log(res1); // >>> 1 const res2 = await client.zAdd('racer_scores', { score: 12, value: 'Castilla' }); console.log(res2); // >>> 1 const res3 = await client.zAdd('racer_scores', [ { score: 8, value: 'Sam-Bodden' }, { score: 10, value: 'Royce' }, { score: 6, value: 'Ford' }, { score: 14, value: 'Prickett' }, { score: 12, value: 'Castilla' } ]); console.log(res3); // >>> 4 const res4 = await client.zRange('racer_scores', 0, -1); console.log(res4); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce', 'Castilla', 'Prickett'] const res6 = await client.zRangeWithScores('racer_scores', 0, -1); console.log(res6); // >>> [ // { value: 'Ford', score: 6 }, { value: 'Sam-Bodden', score: 8 }, // { value: 'Norem', score: 10 }, { value: 'Royce', score: 10 }, // { value: 'Castilla', score: 12 }, { value: 'Prickett', score: 14 } // ] const res7 = await client.zRangeByScore('racer_scores', '-inf', 10); console.log(res7); // >>> ['Ford', 'Sam-Bodden', 'Norem', 'Royce'] const res8 = await client.zRem('racer_scores', 'Castilla'); console.log(res8); // >>> 1 const res9 = await client.zRemRangeByScore('racer_scores', '-inf', 9); console.log(res9); // >>> 2 const res10 = await client.zRange('racer_scores', 0, -1); console.log(res10); // >>> ['Norem', 'Royce', 'Prickett'] const res11 = await client.zRank('racer_scores', 'Norem'); console.log(res11); // >>> 0 const res12 = await client.zRevRank('racer_scores', 'Norem'); console.log(res12); // >>> 2 const res13 = await client.zAdd('racer_scores', [ { score: 0, value: 'Norem' }, { score: 0, value: 'Sam-Bodden' }, { score: 0, value: 'Royce' }, { score: 0, value: 'Ford' }, { score: 0, value: 'Prickett' }, { score: 0, value: 'Castilla' } ]); console.log(res13); // >>> 3 const res14 = await client.zRange('racer_scores', 0, -1); console.log(res14); // >>> ['Castilla', 'Ford', 'Norem', 'Prickett', 'Royce', 'Sam-Bodden'] const res15 = await client.zRangeByLex('racer_scores', '[A', '[L'); console.log(res15); // >>> ['Castilla', 'Ford'] const res16 = await client.zAdd('racer_scores', { score: 100, value: 'Wood' }); console.log(res16); // >>> 1 const res17 = await client.zAdd('racer_scores', { score: 100, value: 'Henshaw' }); console.log(res17); // >>> 1 const res18 = await client.zAdd('racer_scores', { score: 150, value: 'Henshaw' }, { nx: true }); console.log(res18); // >>> 0 const res19 = await client.zIncrBy('racer_scores', 50, 'Wood'); console.log(res19); // >>> 150.0 const res20 = await client.zIncrBy('racer_scores', 50, 'Henshaw'); console.log(res20); // >>> 200.0
package io.redis.examples; import redis.clients.jedis.UnifiedJedis; import redis.clients.jedis.resps.Tuple; public class SortedSetsExample { public void run() { UnifiedJedis jedis = new UnifiedJedis("redis://localhost:6379"); long res1 = jedis.zadd("racer_scores", 10d, "Norem"); System.out.println(res1); // >>> 1 long res2 = jedis.zadd("racer_scores", 12d, "Castilla"); System.out.println(res2); // >>> 1 long res3 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{ put("Sam-Bodden", 8d); put("Royce", 10d); put("Ford", 6d); put("Prickett", 14d); put("Castilla", 12d); }}); System.out.println(res3); // >>> 4 List<String> res4 = jedis.zrange("racer_scores", 0, -1); System.out.println(res4); // >>> [Ford, Sam-Bodden, Norem, Royce, Castil, Castilla, Prickett] List<String> res5 = jedis.zrevrange("racer_scores", 0, -1); System.out.println(res5); // >>> [Prickett, Castilla, Castil, Royce, Norem, Sam-Bodden, Ford] List<Tuple> res6 = jedis.zrangeWithScores("racer_scores", 0, -1); System.out.println(res6); // >>> [[Ford,6.0], [Sam-Bodden,8.0], [Norem,10.0], [Royce,10.0], [Castil,12.0], [Castilla,12.0], [Prickett,14.0]] List<String> res7 = jedis.zrangeByScore("racer_scores", Double.MIN_VALUE, 10d); System.out.println(res7); // >>> [Ford, Sam-Bodden, Norem, Royce] long res8 = jedis.zrem("racer_scores", "Castilla"); System.out.println(res8); // >>> 1 long res9 = jedis.zremrangeByScore("racer_scores", Double.MIN_VALUE, 9d); System.out.println(res9); // >>> 2 List<String> res10 = jedis.zrange("racer_scores", 0, -1); System.out.println(res10); // >>> [Norem, Royce, Prickett] long res11 = jedis.zrank("racer_scores", "Norem"); System.out.println(res11); // >>> 0 long res12 = jedis.zrevrank("racer_scores", "Norem"); System.out.println(res12); // >>> 2 long res13 = jedis.zadd("racer_scores", new HashMap<String,Double>() {{ put("Norem", 0d); put("Sam-Bodden", 0d); put("Royce", 0d); put("Ford", 0d); put("Prickett", 0d); put("Castilla", 0d); }}); System.out.println(res13); // >>> 3 List<String> res14 = jedis.zrange("racer_scores", 0, -1); System.out.println(res14); // >>> [Castilla, Ford, Norem, Prickett, Royce, Sam-Bodden] List<String> res15 = jedis.zrangeByLex("racer_scores", "[A", "[L"); System.out.println(res15); // >>> [Castilla, Ford] long res16 = jedis.zadd("racer_scores", 100d, "Wood"); System.out.println(res16); // >>> 1 long res17 = jedis.zadd("racer_scores", 100d, "Henshaw"); System.out.println(res17); // >>> 1 long res18 = jedis.zadd("racer_scores", 100d, "Henshaw"); System.out.println(res18); // >>> 0 double res19 = jedis.zincrby("racer_scores", 50d, "Wood"); System.out.println(res19); // >>> 150.0 double res20 = jedis.zincrby("racer_scores", 50d, "Henshaw"); System.out.println(res20); // >>> 200.0 } }
package example_commands_test import ( "context" "fmt" "github.com/redis/go-redis/v9" ) func ExampleClient_zadd() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) res1, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Norem", Score: 10}, ).Result() if err != nil { panic(err) } fmt.Println(res1) // >>> 1 res2, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Castilla", Score: 12}, ).Result() if err != nil { panic(err) } fmt.Println(res2) // >>> 1 res3, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Norem", Score: 10}, redis.Z{Member: "Sam-Bodden", Score: 8}, redis.Z{Member: "Royce", Score: 10}, redis.Z{Member: "Ford", Score: 6}, redis.Z{Member: "Prickett", Score: 14}, redis.Z{Member: "Castilla", Score: 12}, ).Result() if err != nil { panic(err) } fmt.Println(res3) // >>> 4 } func ExampleClient_zrange() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Norem", Score: 10}, redis.Z{Member: "Sam-Bodden", Score: 8}, redis.Z{Member: "Royce", Score: 10}, redis.Z{Member: "Ford", Score: 6}, redis.Z{Member: "Prickett", Score: 14}, redis.Z{Member: "Castilla", Score: 12}, ).Result() if err != nil { panic(err) } res4, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result() if err != nil { panic(err) } fmt.Println(res4) // >>> [Ford Sam-Bodden Norem Royce Castilla Prickett] res5, err := rdb.ZRevRange(ctx, "racer_scores", 0, -1).Result() if err != nil { panic(err) } fmt.Println(res5) // >>> [Prickett Castilla Royce Norem Sam-Bodden Ford] } func ExampleClient_zrangewithscores() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Norem", Score: 10}, redis.Z{Member: "Sam-Bodden", Score: 8}, redis.Z{Member: "Royce", Score: 10}, redis.Z{Member: "Ford", Score: 6}, redis.Z{Member: "Prickett", Score: 14}, redis.Z{Member: "Castilla", Score: 12}, ).Result() if err != nil { panic(err) } res6, err := rdb.ZRangeWithScores(ctx, "racer_scores", 0, -1).Result() if err != nil { panic(err) } fmt.Println(res6) // >>> [{6 Ford} {8 Sam-Bodden} {10 Norem} {10 Royce} {12 Castilla} {14 Prickett}] } func ExampleClient_zrangebyscore() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Norem", Score: 10}, redis.Z{Member: "Sam-Bodden", Score: 8}, redis.Z{Member: "Royce", Score: 10}, redis.Z{Member: "Ford", Score: 6}, redis.Z{Member: "Prickett", Score: 14}, redis.Z{Member: "Castilla", Score: 12}, ).Result() if err != nil { panic(err) } res7, err := rdb.ZRangeByScore(ctx, "racer_scores", &redis.ZRangeBy{Min: "-inf", Max: "10"}, ).Result() if err != nil { panic(err) } fmt.Println(res7) // >>> [Ford Sam-Bodden Norem Royce] } func ExampleClient_zremrangebyscore() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Norem", Score: 10}, redis.Z{Member: "Sam-Bodden", Score: 8}, redis.Z{Member: "Royce", Score: 10}, redis.Z{Member: "Ford", Score: 6}, redis.Z{Member: "Prickett", Score: 14}, redis.Z{Member: "Castilla", Score: 12}, ).Result() if err != nil { panic(err) } res8, err := rdb.ZRem(ctx, "racer_scores", "Castilla").Result() if err != nil { panic(err) } fmt.Println(res8) // >>> 1 res9, err := rdb.ZRemRangeByScore(ctx, "racer_scores", "-inf", "9").Result() if err != nil { panic(err) } fmt.Println(res9) // >>> 2 res10, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result() if err != nil { panic(err) } fmt.Println(res10) // >>> [Norem Royce Prickett] } func ExampleClient_zrank() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Norem", Score: 10}, redis.Z{Member: "Royce", Score: 10}, redis.Z{Member: "Prickett", Score: 14}, ).Result() if err != nil { panic(err) } res11, err := rdb.ZRank(ctx, "racer_scores", "Norem").Result() if err != nil { panic(err) } fmt.Println(res11) // >>> 0 res12, err := rdb.ZRevRank(ctx, "racer_scores", "Norem").Result() if err != nil { panic(err) } fmt.Println(res12) // >>> 2 } func ExampleClient_zaddlex() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) _, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Norem", Score: 0}, redis.Z{Member: "Royce", Score: 0}, redis.Z{Member: "Prickett", Score: 0}, ).Result() res13, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Norem", Score: 0}, redis.Z{Member: "Sam-Bodden", Score: 0}, redis.Z{Member: "Royce", Score: 0}, redis.Z{Member: "Ford", Score: 0}, redis.Z{Member: "Prickett", Score: 0}, redis.Z{Member: "Castilla", Score: 0}, ).Result() if err != nil { panic(err) } fmt.Println(res13) // >>> 3 res14, err := rdb.ZRange(ctx, "racer_scores", 0, -1).Result() if err != nil { panic(err) } fmt.Println(res14) // >>> [Castilla Ford Norem Prickett Royce Sam-Bodden] res15, err := rdb.ZRangeByLex(ctx, "racer_scores", &redis.ZRangeBy{ Min: "[A", Max: "[L", }).Result() if err != nil { panic(err) } fmt.Println(res15) // >>> [Castilla Ford] } func ExampleClient_leaderboard() { ctx := context.Background() rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password docs DB: 0, // use default DB }) res16, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Wood", Score: 100}, ).Result() if err != nil { panic(err) } fmt.Println(res16) // >>> 1 res17, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Henshaw", Score: 100}, ).Result() if err != nil { panic(err) } fmt.Println(res17) // >>> 1 res18, err := rdb.ZAdd(ctx, "racer_scores", redis.Z{Member: "Henshaw", Score: 150}, ).Result() if err != nil { panic(err) } fmt.Println(res18) // >>> 0 res19, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Wood").Result() if err != nil { panic(err) } fmt.Println(res19) // >>> 150 res20, err := rdb.ZIncrBy(ctx, "racer_scores", 50, "Henshaw").Result() if err != nil { panic(err) } fmt.Println(res20) // >>> 200 }
using StackExchange.Redis; public class SortedSetExample { public void run() { var muxer = ConnectionMultiplexer.Connect("localhost:6379"); var db = muxer.GetDatabase(); bool res1 = db.SortedSetAdd("racer_scores", "Norem", 10); Console.WriteLine(res1); // >>> True bool res2 = db.SortedSetAdd("racer_scores", "Castilla", 12); Console.WriteLine(res2); // >>> True long res3 = db.SortedSetAdd("racer_scores", new[]{ new SortedSetEntry("Sam-Bodden", 8), new SortedSetEntry("Royce", 10), new SortedSetEntry("Ford", 6), new SortedSetEntry("Prickett", 14), new SortedSetEntry("Castilla", 12) }); Console.WriteLine(res3); // >>> 4 RedisValue[] res4 = db.SortedSetRangeByRank("racer_scores", 0, -1); Console.WriteLine(string.Join(", ", res4)); // >>> Ford, Sam-Bodden, Norem, Royce, Castilla, Prickett RedisValue[] res5 = db.SortedSetRangeByRank("racer_scores", 0, -1, Order.Descending); Console.WriteLine(string.Join(", ", res5)); // >>> Prickett, Castilla, Royce, Norem, Sam-Bodden, Ford SortedSetEntry[] res6 = db.SortedSetRangeByRankWithScores("racer_scores", 0, -1); Console.WriteLine(string.Join(", ", res6)); // >>> Ford: 6, Sam-Bodden: 8, Norem: 10, Royce: 10, Castilla: 12, Prickett: 14 RedisValue[] res7 = db.SortedSetRangeByScore("racer_scores", double.NegativeInfinity, 10); Console.WriteLine(string.Join(", ", res7)); // >>> Ford, Sam-Bodden, Norem, Royce bool res8 = db.SortedSetRemove("racer_scores", "Castilla"); Console.WriteLine(res8); // >>> True long res9 = db.SortedSetRemoveRangeByScore("racer_scores", double.NegativeInfinity, 9); Console.WriteLine(res9); // >>> 2 RedisValue[] res10 = db.SortedSetRangeByRank("racer_scores", 0, -1); Console.WriteLine(string.Join(", ", res10)); // >>> Norem, Royce, Prickett long? res11 = db.SortedSetRank("racer_scores", "Norem"); Console.WriteLine(res11); // >>> 0 long? res12 = db.SortedSetRank("racer_scores", "Norem", Order.Descending); Console.WriteLine(res12); // >>> 2 long res13 = db.SortedSetAdd("racer_scores", new[] { new SortedSetEntry("Norem", 0), new SortedSetEntry("Sam-Bodden", 0), new SortedSetEntry("Royce", 0), new SortedSetEntry("Ford", 0), new SortedSetEntry("Prickett", 0), new SortedSetEntry("Castilla", 0) }); Console.WriteLine(res13); // >>> 3 RedisValue[] res14 = db.SortedSetRangeByRank("racer_scores", 0, -1); Console.WriteLine(string.Join(", ", res14)); // >>> Castilla, Ford, Norem, Pricket, Royce, Sam-Bodden RedisValue[] res15 = db.SortedSetRangeByValue("racer_scores", "A", "L", Exclude.None); Console.WriteLine(string.Join(", ", res15)); // >>> Castilla, Ford bool res16 = db.SortedSetAdd("racer_scores", "Wood", 100); Console.WriteLine(res16); // >>> True bool res17 = db.SortedSetAdd("racer_scores", "Henshaw", 100); Console.WriteLine(res17); // >>> True bool res18 = db.SortedSetAdd("racer_scores", "Henshaw", 150); Console.WriteLine(res18); // >>> False double res19 = db.SortedSetIncrement("racer_scores", "Wood", 50); Console.WriteLine(res19); // >>> 150.0 double res20 = db.SortedSetIncrement("racer_scores", "Henshaw", 50); Console.WriteLine(res20); // >>> 200.0 } }
你会看到,当成员已经存在时(分数被更新),ZADD
返回 0,而 ZINCRBY
返回新的分数。赛车手 Henshaw 的分数从 100 开始,被更改为 150,而不考虑之前的分数,然后增加了 50 到 200。
基本命令
ZADD
向有序集合中添加一个新成员及其关联的分数。如果成员已存在,则更新其分数。ZRANGE
返回排序集合中的成员,按给定范围排序。ZRANK
返回所提供成员的排名,假设排序是升序的。ZREVRANK
返回提供的成员的排名,假设排序集是按降序排列的。
查看完整的有序集合命令列表。
性能
大多数排序集合操作的时间复杂度为O(log(n)),其中n是成员的数量。
在运行ZRANGE
命令时,如果返回值较大(例如,成千上万或更多),请谨慎操作。
该命令的时间复杂度为O(log(n) + m),其中m是返回结果的数量。
替代方案
Redis 有序集合有时用于索引其他 Redis 数据结构。 如果你需要索引和查询数据,可以考虑使用 JSON 数据类型和 Redis Query Engine 功能。
了解更多
- Redis Sorted Sets Explained 是对Redis中排序集合的一个有趣的介绍。
- Redis University's RU101 详细探讨了Redis的有序集合。