Queridos amigos, la última vez hablamos sobre las operaciones relacionadas de Set in Redis y algunos escenarios aplicables, como la lotería . El sorted_set vamos a hablar hoy es en realidad una especie de conjunto, y también tiene las características del conjunto de- la duplicación . A diferencia de set, sorted_set está ordenado, lo que se puede ver en el significado literal.
¿Cómo se ordena sorted_set y según qué reglas? Mira abajo.
Veamos primero qué comandos proporciona sorted_set.
127.0.0.1:6379> help @sorted_set
BZPOPMAX key [key ...] timeout
summary: Remove and return the member with the highest score from one or more sorted sets, or block until one is available
since: 5.0.0
BZPOPMIN key [key ...] timeout
summary: Remove and return the member with the lowest score from one or more sorted sets, or block until one is available
since: 5.0.0
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
summary: Add one or more members to a sorted set, or update its score if it already exists
since: 1.2.0
ZCARD key
summary: Get the number of members in a sorted set
since: 1.2.0
ZCOUNT key min max
summary: Count the members in a sorted set with scores within the given values
since: 2.0.0
ZINCRBY key increment member
summary: Increment the score of a member in a sorted set
since: 1.2.0
ZINTERSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
summary: Intersect multiple sorted sets and store the resulting sorted set in a new key
since: 2.0.0
ZLEXCOUNT key min max
summary: Count the number of members in a sorted set between a given lexicographical range
since: 2.8.9
ZPOPMAX key [count]
summary: Remove and return members with the highest scores in a sorted set
since: 5.0.0
ZPOPMIN key [count]
summary: Remove and return members with the lowest scores in a sorted set
since: 5.0.0
ZRANGE key start stop [WITHSCORES]
summary: Return a range of members in a sorted set, by index
since: 1.2.0
ZRANGEBYLEX key min max [LIMIT offset count]
summary: Return a range of members in a sorted set, by lexicographical range
since: 2.8.9
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
summary: Return a range of members in a sorted set, by score
since: 1.0.5
ZRANK key member
summary: Determine the index of a member in a sorted set
since: 2.0.0
ZREM key member [member ...]
summary: Remove one or more members from a sorted set
since: 1.2.0
ZREMRANGEBYLEX key min max
summary: Remove all members in a sorted set between the given lexicographical range
since: 2.8.9
ZREMRANGEBYRANK key start stop
summary: Remove all members in a sorted set within the given indexes
since: 2.0.0
ZREMRANGEBYSCORE key min max
summary: Remove all members in a sorted set within the given scores
since: 1.2.0
ZREVRANGE key start stop [WITHSCORES]
summary: Return a range of members in a sorted set, by index, with scores ordered from high to low
since: 1.2.0
ZREVRANGEBYLEX key max min [LIMIT offset count]
summary: Return a range of members in a sorted set, by lexicographical range, ordered from higher to lower strings.
since: 2.8.9
ZREVRANGEBYSCORE key max min [WITHSCORES] [LIMIT offset count]
summary: Return a range of members in a sorted set, by score, with scores ordered from high to low
since: 2.2.0
ZREVRANK key member
summary: Determine the index of a member in a sorted set, with scores ordered from high to low
since: 2.0.0
ZSCAN key cursor [MATCH pattern] [COUNT count]
summary: Incrementally iterate sorted sets elements and associated scores
since: 2.8.0
ZSCORE key member
summary: Get the score associated with the given member in a sorted set
since: 1.2.0
ZUNIONSTORE destination numkeys key [key ...] [WEIGHTS weight] [AGGREGATE SUM|MIN|MAX]
summary: Add multiple sorted sets and store the resulting sorted set in a new key
since: 2.0.0
Como puede ver, la mayoría de los comandos en sorted_set comienzan con Z porque set ocupa S. También hay palabras clave REV en algunos comandos, que representan Reverse, es decir, reverso.
Además, hay dos comandos que comienzan con B, donde B significa Bloqueado, es decir, bloqueado, que también se explica en el documento de ayuda anterior (bloquee hasta que haya uno disponible).
Hay muchos comandos, así que vamos a clasificarlos a grandes rasgos.
Uso básico de sorted_set
A continuación, analizamos el uso específico de los comandos de uso común.
1. Operación básica
Como se puede ver en el comando ZADD, al agregar elementos a la clave, hay una puntuación de parámetro. Así es, sorted_set establece una puntuación para cada elemento y, al agregarlos, los ordena en orden ascendente de acuerdo con esta puntuación.
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
summary: Add one or more members to a sorted set, or update its score if it already exists
since: 1.2.0
/* 将笔试成绩(tom-100,jack-60,tony-80)放入名为 writtenTestScore 的
有序集合里,返回元素个数3*/
127.0.0.1:6379> zadd writtenTestScore 100 tom 60 jack 80 tony
(integer) 3
/面试成绩*/
127.0.0.1:6379> zadd interviewScore 70 tom 80 jack 60 tony
(integer) 3
/*zrange列出所有元素*/
127.0.0.1:6379> zrange writtenTestScore 0 -1
1) "jack"
2) "tony"
3) "tom"
/*zrange列出所有元素(笔试成绩),带分值*/
127.0.0.1:6379> zrange writtenTestScore 0 -1 withscores
1) "jack"
2) "60"
3) "tony"
4) "80"
5) "tom"
6) "100"
/*列出面试成绩*/
127.0.0.1:6379> zrange interviewScore 0 -1 withscores
1) "tony"
2) "60"
3) "tom"
4) "70"
5) "jack"
6) "80"
A continuación se muestran algunas operaciones para eliminar elementos, incluidas
ZPOPMAX / BZPOPMAX, ZPOPMIN / BZPOPMIN 、 ZREM 等。
127.0.0.1:6379> ZADD testREM 1 a 2 b 3 c 4 d
(integer) 4
127.0.0.1:6379> zpopmax testREM
1) "d"
2) "4"
127.0.0.1:6379> zrem testREM a
(integer) 1
/*删除10个最大的元素并返回*/
127.0.0.1:6379> zpopmax testREM 10
1) "c"
2) "3"
3) "b"
4) "2"
/*元素为空,阻塞1s后,返回空*/
127.0.0.1:6379> BZPOPMAX testREM 1
(nil)
(1.01s
/*取某个元素的分值*/
127.0.0.1:6379> ZSCORE interviewScore tony
"60"
Dos, operaciones estadísticas
Las operaciones estadísticas generalmente incluyen dos tipos, uno es tomar el número o rango de elementos y el otro es tomar una lista de elementos.
/*列出80-100分数段的元素个数*/
127.0.0.1:6379> zcount writtenTestScore 80 100
(integer) 2
/*返回集合中元素个数*/
127.0.0.1:6379> zcard writtenTestScore
(integer) 3
/*取jack的排名*/
127.0.0.1:6379> ZRANK writtenTestScore jack
(integer) 0
/*取出80-100分数段的元素*/
127.0.0.1:6379> ZRANGEBYSCORE writtenTestScore 80 100 withscores
1) "tony"
2) "80"
3) "tom"
4) "100"
/*取笔试分数最高的前两名*/
127.0.0.1:6379> ZREVRANGE writtenTestScore 0 1 withscores
1) "tom"
2) "100"
3) "tony"
4) "80"
Tres, operaciones aritméticas
127.0.0.1:6379> ZRANGE writtenTestScore 0 -1 withscores
1) "jack"
2) "60"
3) "tony"
4) "80"
5) "tom"
6) "100"
Después de sumar los puntos de Jack, Jack ocupó el segundo lugar.
127.0.0.1:6379> ZINCRBY writtenTestScore 30 jack
"90"
127.0.0.1:6379> ZRANGE writtenTestScore 0 -1 withscores
1) "tony"
2) "80"
3) "jack"
4) "90"
5) "tom"
6) "100"
En otras palabras, cada cambio de sorted_set al conjunto mantiene un orden ordenado por puntuación en cualquier momento.
Veamos la operación de unión e intersección.
Con el fin de facilitar la comprensión de la intersección y la unión, establecimos escritoTestScore y respectivamente
Interview_Score realiza la operación de agregar elementos. Es decir, Polly solo participó en la prueba escrita y Lucy solo participó en la entrevista.
127.0.0.1:6379> zadd writtenTestScore 50 polly
(integer) 1
127.0.0.1:6379> ZRANGE writtenTestScore 0 -1 withscores
1) "polly"
2) "50"
3) "tony"
4) "80"
5) "jack"
6) "90"
7) "tom"
8) "100"
127.0.0.1:6379> zadd interviewScore 50 lucy
(integer) 1
127.0.0.1:6379> ZRANGE interviewScore 0 -1 withscores
1) "lucy"
2) "50"
3) "tony"
4) "60"
5) "tom"
6) "70"
7) "jack"
8) "80"
Suponga que desea ordenar por las puntuaciones totales de la prueba escrita (ponderación 0,6) y la entrevista (ponderación 0,4), puede utilizar ZUNIONSTORE para lograrlo.
127.0.0.1:6379> ZUNIONSTORE result 2 writtenTestScore interviewScore weights 0.6 0.4 aggregate sum
(integer) 5
/*lucy只参加了面试,50*0.4=20; tony笔试80*0.6+面试60*0.4=72*/
127.0.0.1:6379> ZRANGE result 0 -1 withscores
1) "lucy"
2) "20"
3) "polly"
4) "30"
5) "tony"
6) "72"
7) "jack"
8) "86"
9) "tom"
10) "88"
Suponiendo que haya cambios en los requisitos, las condiciones se incrementan: se asiste a entrevistas y exámenes escritos. En este caso, puede utilizar la operación de intersección establecida ZINTERSTORE.
127.0.0.1:6379> ZINTERSTORE result 2 writtenTestScore interviewScore weights 0.6 0.4 aggregate sum
(integer) 3
127.0.0.1:6379> ZRANGE result 0 -1 withscores
1) "tony"
2) "72"
3) "jack"
4) "86"
5) "tom"
6) "88"
Acerca del algoritmo de clasificación sorted_set
Sorted_set mantiene una ordenación en cualquier momento para las operaciones de cambios de conjuntos, como zadd, zrem, zpop, zincrby, etc.
Simplemente comprenda, el algoritmo de clasificación aquí se implementa con skipList (lista de omisión). Por ejemplo, el algoritmo para saltar la tabla es similar a cuando buscamos una determinada página en un libro, primero encontraremos la tabla de contenido. Por supuesto, puede haber más de un nivel de "directorio" de la tabla de salto.
para resumir
Para resumir un poco, esta vez compartí los tres tipos de operaciones de sorted_set, que son operaciones básicas (que incluyen agregar y eliminar), operaciones estadísticas (número de elementos en el conjunto que cumplen con ciertas condiciones, clasificación y lista de elementos) operaciones, y operaciones (intersección, unión, adición) operaciones.
sorted_set generalmente es adecuado para clasificaciones, por ejemplo, de acuerdo con el número dinámico de me gusta (como el valor de la clave en el conjunto), la clasificación de la tasa de clics de las publicaciones, etc.
Comprensión simple, sorted_set se implementa mediante una tabla de salto.
Bueno, este es el caso de este intercambio, nos vemos la próxima vez.
Préstame atención y sigue exportando productos secos técnicos.