Descripción general de Redis y configuración del entorno y cinco tipos de datos

Descripción general y configuración del entorno

¿Qué es Redis?

Redis (servidor de diccionario remoto), es decir, servicio de diccionario remoto.

Es una base de datos de código abierto de tipo registro y valor clave escrita en lenguaje ANSI C, compatible con la red, basada en memoria o persistente, y proporciona API en varios idiomas.
La diferencia es que redis escribe periódicamente datos actualizados en el disco o escribe operaciones de modificación en archivos de registro adicionales y, sobre esta base, realiza la sincronización maestro-esclavo (maestro-esclavo).

Una de las tecnologías NoSQL más populares en este momento.

¿Qué puede hacer Redis?

1. Almacenamiento de memoria, persistencia, la memoria se pierde cuando se apaga, por lo que la persistencia es muy importante (demasiadas personas, aof)
2. Alta eficiencia, se puede utilizar para caché de alta velocidad
3, sistema de publicación y suscripción
4, mapa análisis de aprendizaje
5, temporizador, contador (¡vistas!)
6 ,. . . .

característica

Transacciones de clúster persistentes diversificadas

Sitio web oficial: enlace: enlace .
Dirección de descarga: se Inserte la descripción de la imagen aquí
recomienda construir en un servidor Linux y aprender

Instalación del entorno Redis

Tutorial de descarga e instalación de Liunx: enlace .

Copie el archivo de configuración de Redis y use este archivo. El archivo de configuración se usó originalmente como respaldo
Inserte la descripción de la imagen aquí

1. Reids no se inicia en segundo plano de forma predeterminada, ¡modifique el archivo de configuración!

redis.conf editar este archivo: vim redis.conf
modificar: demonizar este atributo con yes
Inserte la descripción de la imagen aquí

2. ¡Inicie el servicio Redis!

Inserte la descripción de la imagen aquí

3. ¡Pruebe redis-cli para la prueba de conexión!

Inserte la descripción de la imagen aquí
claves *: ver todas las claves

4. ¡Compruebe si el proceso de redis está abierto!

Inserte la descripción de la imagen aquí

5. Apague el servicio Reids. apagar

Inserte la descripción de la imagen aquí
apagar: cerrar redis
salir: salir

6. Compruebe redis, si está cerrado.

Inserte la descripción de la imagen aquí

Prueba de rendimiento (redis-benchmark)

¡redis-benchmark es una herramienta de prueba de estrés!
¡La herramienta oficial de prueba de rendimiento!
Parámetros del comando Redis-benchmark!

Imagen del tutorial para novatos:
Inserte la descripción de la imagen aquí
Prueba simple:
Prueba: 100 conexiones simultáneas 100000 solicitudes

redis-benchmark -h localhost -p 6379 -c 100 -n 100000

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Conocimiento básico

Redis tiene 16 bases de datos de
Inserte la descripción de la imagen aquí
forma predeterminada. La base de datos 0
se utiliza de forma predeterminada. ¡Puede usar seleccionar para cambiar de base de datos!

127.0.0.1:6379> select 3   //切换数据库
OK
127.0.0.1:6379[3]> dbsize   //查看数据库大小
(integer) 0
keys *  //查看所有的key
flushdb  //清空当前数据库
flushall   //清空全部的数据库

Por qué el número de puerto de liunx es 6379.

¡Redis es de un solo hilo!

El cuello de botella de Redis se basa en la memoria y el ancho de banda de red de la máquina, se puede realizar un solo hilo, por lo que se usa un solo hilo.
Redis está escrito en lenguaje C, y los datos oficiales son más de 100,000 QPS, lo que no es peor que Memecache, que también usa key-vale.

¿Por qué Redis tiene un solo subproceso tan rápido?

1. Malentendido 1: ¿Los servidores de alto rendimiento deben tener varios subprocesos?
2, la incomprensión 2: Multi-threading (! Contexto CPU del interruptor) debe ser más eficiente que un único subproceso!
Core: Redis pone todos los datos en la memoria, así que usar eficiencia de la operación de una sola rosca es la más alta, multi-hilo (CPU el contexto cambiará: ¡una operación que consume mucho tiempo!) Para el sistema de memoria, si no hay un cambio de contexto, ¡la eficiencia es la más alta! Se realizan múltiples lecturas y escrituras en una CPU, en el caso de la memoria, esta es la mejor solución.

Cinco tipos de datos

Documento oficial: Redis es un sistema de almacenamiento de estructura de datos en memoria de código abierto (licencia BSD), que se puede utilizar como base de datos, caché y middleware de mensajería. Admite múltiples tipos de estructuras de datos, como cadenas, hashes, listas, conjuntos, conjuntos ordenados y consultas de rango, mapas de bits, hiperloglogs y consultas de radio de índice geoespacial (geoespacial). Redis tiene replicación incorporada, secuencias de comandos LUA, desalojo de LRU, transacciones y diferentes niveles de persistencia de disco, y a través de Redis centinela y partición automática (Cluster)) Brindan alta disponibilidad.
Redis-Key

127.0.0.1:6379> exists name  //判断有没有这个name值key
(integer) 1
move name 1 //移除 
expire name 10   //十秒钟过后过期
ttl name    //查看此信息还有多久过期
type key  //查了当前key的类型

Cuerda

127.0.0.1:6379> set key1 v1   //设置值
OK
127.0.0.1:6379> get key1       //获得值
"v1"
127.0.0.1:6379> keys *         //获得所有的key
"key1"
127.0.0.1:6379> exists key1     //判断某一个key是否存在
(integer) 1
127.0.0.1:6379> append key1 "hello"     //追加一个字符串,如果当前key不存在,就相当于 set key
(integer) 7
127.0.0.1:6379> get key1
"v1hello"
127.0.0.1:6379> strlen key1     //获取字符串的长度!
(integer) 7
127.0.0.1:6379> append key1 ",chaoyang"
(integer) 16
127.0.0.1:6379> 
 //i++
//步长  i+=
127.0.0.1:6379> set views 0 //初始浏览量为0
OK
127.0.0.1:6379> get views
"0"
127.0.0.1:6379> incr views   //自增1 浏览量变为1
(integer) 1
127.0.0.1:6379> incr views
(integer) 2
127.0.0.1:6379> get views
"2"
127.0.0.1:6379> decr views   //自减1    浏览量-1
(integer) 1
127.0.0.1:6379> decr views
(integer) 0
127.0.0.1:6379> incrby views 10   //可以设置步长 ,指定增量
(integer) 10
127.0.0.1:6379> decrby views 5  //可以设置步长,指定减量
(integer) 5
127.0.0.1:6379> 

Intercepción de rango de cadenas

127.0.0.1:6379> set key1 "hello,songchao"
OK
127.0.0.1:6379> get key1
"hello,songchao"
127.0.0.1:6379> getrange key1 0 3   //截取字符串【0,3】
"hell"
127.0.0.1:6379> getrange key1 0 -1  //获取全部的字符串和 get key是一样的
"hello,songchao"

¡Reemplazo de cuerdas!

127.0.0.1:6379> set key2 abcdefg
OK
127.0.0.1:6379> get key2
"abcdefg"
127.0.0.1:6379> setrange key2 2 xx  //替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get key2
"abxxefg"

setex (establecido con expire) establece el tiempo de vencimiento
setnx (establecido si no existe) // no existe en la configuración (se usa a menudo en bloqueos distribuidos!)

127.0.0.1:6379> setex key3 30 "hello"    //key3的值为hello,30秒后过期
OK
127.0.0.1:6379> ttl key3
(integer) 22
127.0.0.1:6379> get key3
"hello"
127.0.0.1:6379> setnx mykey "redis"   //如果mykey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "mykey"
2) "foo"
127.0.0.1:6379> ttl key3
(integer) -2
127.0.0.1:6379> setnx mykey "MongoDB"  //如果mykey存在,创建失败!
(integer) 0
127.0.0.1:6379> get mykey
"redis"
mset 
mget
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3   //同时设置多个值
OK
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
127.0.0.1:6379> mget k1 k2 k3  //同时获取多个值
1) "v1"
2) "v2"
3) "v3"
127.0.0.1:6379> msetnx k1 v1 k4 v4  //msetnx是一个原子性的操作,要么一起成功,要么一起失败!
(integer) 0
127.0.0.1:6379> get k4
(nil)

//对象
set user:1{name:zhangsan,age:3} //设置一个user:1 对象 值为jsion字符来保存一个对象!
//这里的key是一个巧妙的设计:user:{id}:{filed},如此设计在Redis中是完全ok了!
127.0.0.1:6379> mset user:2:name zhangsan user:2:age 2
OK
127.0.0.1:6379> mget user:2:name user:2:age
1) "zhangsan"
2) "2"

getset: obtener primero y luego establecer
se puede usar para operaciones de actualización

127.0.0.1:6379> getset db redis  //如果不存在值,则返回nil
(nil)
127.0.0.1:6379> get db
"redis"
127.0.0.1:6379> getset db mongodb  //如果存在值,获取原来的值,并设置新的值
"redis"
127.0.0.1:6379> get db
"mongodb"

La estructura de datos es la misma.
La cadena es similar al escenario de uso: ¡el valor puede ser nuestro número además de nuestra cadena!

  • encimera
  • Cuente el número de unidades múltiples
  • Numero de fans
  • Almacenamiento de caché de objetos

Lista: tipo de datos básico, lista

Todos los comandos de lista comienzan con L. Los comandos de Redis no distinguen entre mayúsculas y minúsculas

127.0.0.1:6379> lpush list one     //将第一个值插入进去(左边)
(integer) 1
127.0.0.1:6379> lpush list two    //d第二个值
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrange list 0 -1    //获取list中的所有值!
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1    //获取list中具体的值
1) "three"
2) "two"
127.0.0.1:6379> rpush list righr //将一个值插入进去(右边)
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "righr"

#######################################################################################
lpop
rpop
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "righr"
127.0.0.1:6379> lpop list     //移除list的第一个元素
"three"
127.0.0.1:6379> rpop list   //移除list的最后一个元素
"righr"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
#######################################################################################
Lindex

127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
127.0.0.1:6379> lindex list 1   //通过下标获得list中的某一个值
"one"
127.0.0.1:6379> lindex list 0
"two"
#######################################################################################
llen
127.0.0.1:6379> lpush list one
(integer) 1
127.0.0.1:6379> lpush list two
(integer) 2
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> Llen list    //返回列表长度
(integer) 3
#######################################################################################
移除指定的值!
lrem
127.0.0.1:6379> lpush list three
(integer) 4
127.0.0.1:6379> lrange list 0 -1   
1) "three"
2) "three"
3) "two"
4) "one"
127.0.0.1:6379> lrem list 1 one    //移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "three"
3) "two"
127.0.0.1:6379> lrem list 1 three
(integer) 1
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
127.0.0.1:6379> lpush list three
(integer) 3
127.0.0.1:6379> lrem list 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
#######################################################################################
trim 修剪:list:截断
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpush mylist "hello3"
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2  //通过下标截取指定的长度,这个list会被改变,截断了只剩下截取的元素!
OK
127.0.0.1:6379> lrange mylist 0 -1
1) "hello1"
2) "hello2"
#######################################################################################
rpoplpush  //移除列表的最后一个元素,并移动到新的列表中
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "hello1"
(integer) 2
127.0.0.1:6379> rpush mylist "hello2"
(integer) 3
127.0.0.1:6379> rpoplpush mylist myotherlist  //移除列表的最后一个元素,将他移动到新的列表中
"hello2"
127.0.0.1:6379> lrange mylist 0 -1   //查看原来的列表
1) "hello"
2) "hello1"
127.0.0.1:6379> lrange myotherlist 0 -1   //查看目标列表,确实存在改值
1) "hello2"
#######################################################################################
lset 将列表中指定下标的值替换为另外一个值,更新操作
127.0.0.1:6379> exists list    //判断这个列表是否存在
(integer) 0 
127.0.0.1:6379> lpush list value1 
(integer) 1
127.0.0.1:6379> lrange list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item  //如果存在,更新当前下标的值
OK
127.0.0.1:6379> lrange list 0 0 
1) "item"
127.0.0.1:6379> lset list 1 other   //如果不存在,则会报错
(error) ERR index out of range
#######################################################################################
linsert  //将某一个具体的value插入到列表中某个元素的前面或者后面
127.0.0.1:6379> rpush mylist "hello"
(integer) 1
127.0.0.1:6379> rpush mylist "world"
(integer) 2
127.0.0.1:6379> linsert mylist before "world" "other"
(integer) 3
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
127.0.0.1:6379> linsert mylist after world new
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "hello"
2) "other"
3) "world"
4) "new"

resumen

  • En realidad, es una lista vinculada, antes de que Node after, left, right se pueda interpolar
  • Si la clave no existe, cree una nueva lista vinculada
  • Si la clave existe, agregue contenido
  • Si se eliminan todos los valores y la lista vinculada está vacía, ¡también significa que no existe!
  • Inserte o cambie el valor en ambos lados, ¡lo más eficiente! El elemento intermedio es una
    cola de mensajes ~ relativamente ineficaz . Cola de mensajes (Lpush Rpop), pila (Lpush Lpop)

Colocar

¡El valor del conjunto no se puede volver a leer!

#######################################################################################
127.0.0.1:6379> sadd myset "hello"  //set集合中添加元素
(integer) 1
127.0.0.1:6379> sadd myset "songchao"
(integer) 1
127.0.0.1:6379> sadd myset "yang"
(integer) 1
127.0.0.1:6379> smembers myset   //查看指定set的所有值
1) "yang"
2) "songchao"
3) "hello"
127.0.0.1:6379> sismember myset hello  //判断某一个值是不是在set集合中
(integer) 1
127.0.0.1:6379> sismember myset world
(integer) 0
#######################################################################################
127.0.0.1:6379> scard myset
(integer) 5   //获取set集合中的内容元素个数!
#######################################################################################
rem 
127.0.0.1:6379> srem myset hello    //移除set集中的指定元素
(integer) 1
127.0.0.1:6379> smembers myset
1) "yang"
2) "songchao"
3) "lovehuahua2"
4) "lovehuahua"
#######################################################################################
set 无序不重复集合。
删除指定的key
127.0.0.1:6379> srandmember myset   //随机抽选出一个元素
"lovehuahua2"
127.0.0.1:6379> srandmember myset
"lovehuahua"
127.0.0.1:6379> srandmember myset
"lovehuahua"
127.0.0.1:6379> srandmember myset 2  //随机冲选出指定个数的元素
1) "lovehuahua"
2) "songchao"
#######################################################################################
随机删除key!
127.0.0.1:6379> smembers myset
1) "lovehuahua2"
2) "lovehuahua"
3) "yang"
4) "songchao"
127.0.0.1:6379> spop myset    //随机删除一些set集合中的元素!
"yang"
127.0.0.1:6379> spop myset
"lovehuahua2"
127.0.0.1:6379> smembers myset
1) "lovehuahua"
2) "songchao"
#######################################################################################
将一个指定的值,移动到另外一个set集合!
127.0.0.1:6379> sadd myset "hello"
(integer) 1
127.0.0.1:6379> sadd myset "world"
(integer) 1
127.0.0.1:6379> sadd myset "chaoyang"
(integer) 1
127.0.0.1:6379> sadd myset2 "set2"
(integer) 1
127.0.0.1:6379> smove myset myset2 "chaoyang"
(integer) 1
127.0.0.1:6379> smembers myset
1) "world"
2) "hello"
127.0.0.1:6379> smembers myset2
1) "set2"
2) "chaoyang"
#######################################################################################
微博,B站,共同关注!(并集)
数字集合类:
差集  交集  并集
127.0.0.1:6379> sadd key1 a
(integer) 1
127.0.0.1:6379> sadd key1 b
(integer) 1
127.0.0.1:6379> sadd key1 c
(integer) 1
127.0.0.1:6379> sadd key2 c
(integer) 1
127.0.0.1:6379> sadd key2 d
(integer) 1
127.0.0.1:6379> sadd key2 e
(integer) 1
127.0.0.1:6379> sdiff key1 key2     //差集
1) "a"
2) "b"
127.0.0.1:6379> sinter key1 key2    //交集
1) "c"
127.0.0.1:6379> sunion key1 key2    //并集
1) "a"
2) "c"
3) "b"
4) "e"
5) "d"
微博,A用户将所有关注的人放在一个set集合中!将他的粉丝也放到一个集合中!
共同关注,共同爱好,二度好友,推荐好友!(六度分隔理论)

Picadillo

Colección de mapas, mapa de claves! ¡En este momento el valor es una colección de mapas! La esencia no es muy diferente del tipo String, ¡sigue siendo una simple clave-valor!

#######################################################################################
127.0.0.1:6379> hset myhash field1 chaoyang   //set一个具体key-value
(integer) 1
127.0.0.1:6379> hget myhash field1   //获取一个字段值
"chaoyang"
127.0.0.1:6379> hmset myhash field1 hello field2 world  //set多个key-value
OK
127.0.0.1:6379> hmget myhash field1 field2  //获取多个字段值
1) "hello"
2) "world"
127.0.0.1:6379> hgetall myhash   //获取全部的数据
1) "field1"
2) "hello"
3) "field2"
4) "world"
127.0.0.1:6379> hdel myhash field1   //删除hash指定key字段!对应的value值也就消失了!
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
#######################################################################################
hlen
127.0.0.1:6379> hmset myhash field1 hello field2 world
OK
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
3) "field1"
4) "hello"
127.0.0.1:6379> hlen myhash   //获取hash表的字段数量!
(integer) 2
#######################################################################################
127.0.0.1:6379> hexists myhash field1   //判断hash中指定字段是否存在!
(integer) 1
127.0.0.1:6379> hexists myhash field3
(integer) 0
#######################################################################################
#只获得所有field
#只获得所有value
127.0.0.1:6379> hkeys myhash
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash
1) "world"
2) "hello"
#######################################################################################
incr   decr
127.0.0.1:6379> hset myhash field3 5   //指定增量
(integer) 1
127.0.0.1:6379> hincrby myhash field3 1
(integer) 6
127.0.0.1:6379> hincrby myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello   //如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world   //如果存在则不能设置
(integer) 0

Hash modificó la edad del nombre de usuario de los datos, se puede usar para almacenar información del usuario, cambiando la información con frecuencia.

Zset (conjunto ordenado)

Sobre la base de set, se agrega un valor, set k1 v1, zset k1 score1 v1

127.0.0.1:6379> zadd myset 1 one    //添加一个值
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three   //添加多个值
(integer) 2
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
#######################################################################################
排序如何实现
127.0.0.1:6379> zadd salary 2500 godan   //添加三个用户
(integer) 1
127.0.0.1:6379> zadd salary 2500 zhangsan
(integer) 1
127.0.0.1:6379> zadd salary 500 chaoyang
(integer) 1
127.0.0.1:6379> zrevrange salary 0 -1    //从大到小进行排序
1) "godan"
2) "chaoyang"
127.0.0.1:6379> zrangebyscore salary -inf +inf  //显示全部的用户  从小到大!
1) "chaoyang"
2) "godan"
3) "zhangsan"
127.0.0.1:6379> zrangebyscore salary -inf +inf withscores   //显示全部的用户并且附带成绩
1) "chaoyang"
2) "500"
3) "godan"
4) "2500"
5) "zhangsan"
6) "2500"
127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores   //显示工资小于2500员工的升序排序!
1) "chaoyang"
2) "500"
3) "godan"
4) "2500"
5) "zhangsan"
6) "2500"
#######################################################################################
移除rem中的元素!
127.0.0.1:6379> zrange salary 0 -1
1) "chaoyang"
2) "godan"
3) "zhangsan"
127.0.0.1:6379> zrem salary zhangsan    //移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "chaoyang"
2) "godan"
127.0.0.1:6379> zcard salary   //获取有序集合中的个数
(integer) 2
#######################################################################################
127.0.0.1:6379> zadd myset 1 hello
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 chaoyang
(integer) 2
127.0.0.1:6379> zcount myset 1 3    //获取指定区间的成员数量!
(integer) 6
127.0.0.1:6379> zcount myset 1 2
(integer) 4

Ideas de casos: configure la clasificación para almacenar la tabla de puntuación de la clase y la tabla de sueldos para ordenar.
Noticias ordinarias, 1, noticias importantes 2, ¡juzga con el peso!
La aplicación de la tabla de clasificación está implementada, ¡haz la prueba Top N!

Tres tipos de datos especiales

Ubicación geográfica geoespacial detallada

ubicación geoespacial ubicación de
amigos, personas cercanas, cálculo de la distancia en taxi?
¡Redis Geo se lanzó en Redis 3.2! Esta función puede calcular la información de ubicación geográfica, la distancia entre los dos lugares y las personas en un radio de unas pocas millas.
Puede consultar algunos datos de prueba: http://life.chacuo.net/postion/
Inserte la descripción de la imagen aquí
Documento oficial: https://www.redis.net.cn/order/3685.html La
longitud válida varía de -180 grados a 180 grados .
La latitud efectiva es de -85.05112878 grados a 85.05112878 grados.
Cuando la posición de las coordenadas excede el rango especificado arriba, el comando devolverá un error.

getadd

#getadd 添加地理位置
#规则:两级无法直接添加,可以直接下载城市数据,直接通过java程序一次性导入!
#参数key值(纬度、经度、名称)
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijin
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqin 114.05 22.52 shengzheng
(integer) 2
127.0.0.1:6379> geoadd china:city 120.16 30.24 hangzhou 108.96 34.26 xian
(integer) 2

getpos: Obtiene la posición actual: ¡debe ser un valor de coordenada!

127.0.0.1:6379> geopos china:city beijin  //获取指定的城市的经纬度和维度!
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
127.0.0.1:6379> geopos china:city beijin chongqin
1) 1) "116.39999896287918091"
   2) "39.90000009167092543"
2) 1) "106.49999767541885376"
   2) "29.52999957900659211"

geodista

¡La distancia entre los dos!
unidad:

  • m significa que la unidad es metro. km significa que la unidad son kilómetros. mi significa que la unidad es milla. ft significa que la unidad son pies.
127.0.0.1:6379> geodist china:city beijin shanghai km     //查看北京到上海的直线距离
"1067.3788"
127.0.0.1:6379> geodist china:city beijin chongqin km   //查看北京到重庆的直线距离
"1464.0708"

georadius: toma la latitud y la longitud indicadas como centro
. ¿Personas cercanas a mí? (¡Obtén la dirección y ubicación de todas las personas cercanas!) ¡Consulta por radio!
Deben introducirse todos los datos: china: ciudad

127.0.0.1:6379> georadius china:city 110 30 1000 km   //以110,30这个经纬度为中心,寻找方圆1000km的以内的城市
1) "chongqin"
2) "xian"
3) "shengzheng"
4) "hangzhou"
127.0.0.1:6379> georadius china:city 110 30 500 km
1) "chongqin"
2) "xian"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist   //显示到中间距离的位置
1) 1) "chongqin"
   2) "341.9374"
2) 1) "xian"
   2) "483.8340"
127.0.0.1:6379> georadius china:city 110 30 500 km withcoord  //显示他人的定位信息
1) 1) "chongqin"
   2) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) 1) "108.96000176668167114"
      2) "34.25999964418929977"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1           //筛选出指定的结果
1) 1) "chongqin"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 2
1) 1) "chongqin"
   2) "341.9374"
   3) 1) "106.49999767541885376"
      2) "29.52999957900659211"
2) 1) "xian"
   2) "483.8340"
   3) 1) "108.96000176668167114"
      2) "34.25999964418929977"

GEORADIUSBYMEMBER

# 找出位于指定范围内的元素,中心点是由给定的位置元素决定
127.0.0.1:6379> georadiusbymember china:city beijin 1000 km
1) "beijin"
2) "xian"
127.0.0.1:6379> georadiusbymember china:city beijin 400 km
1) "beijin"
127.0.0.1:6379> georadiusbymember china:city shanghai 400 km
1) "hangzhou"
2) "shanghai"

Comando GEOHASH-Devuelve la representación Geohash de uno o más elementos de ubicación

¡Este comando devolverá una cadena Geohash de 11 caracteres!

#将二维的经纬度转换为唯一的字符串,如果两个字符串越接近,那么则距离越近!
127.0.0.1:6379> geohash china:city beijin chongqin
1) "wx4fbxxfke0"
2) "wm5xzrybty0"

¡El principio de implementación subyacente de GEO es en realidad Zset! ¡Podemos usar el comando Zset para manipular geo!

127.0.0.1:6379> zrange china:city 0 -1    //查看地图中全部的元素!
1) "chongqin"
2) "xian"
3) "shengzheng"
4) "hangzhou"
5) "shanghai"
6) "beijin"
127.0.0.1:6379> zrem china:city beijin     //移除指定的元素
(integer) 1
127.0.0.1:6379> zrange china:city 0 -1
1) "chongqin"
2) "xian"
3) "shengzheng"
4) "hangzhou"
5) "shanghai"

Estadísticas base de Hyperloglog

¿Qué es la base?

A {1,3,5,7,8,7}
B {1,3,5,7,8}
base (elementos no repetidos) = 5, ¡el error es aceptable!

Introducción

¡La versión Redis 2.8.9 actualizó la estructura de datos de Hyperloglog!
¡Algoritmo de estadísticas cardinales de Redis Hyperloglog!
Ventajas: La memoria ocupada es fija y la tecnología de 2 ^ 64 elementos diferentes solo necesita desperdiciar 12 KB de memoria. Si desea comparar desde la perspectiva de la memoria, ¡Hyperloglog es la primera opción!
El UV de la página web (una persona visita un sitio web muchas veces, ¡pero aún cuenta como una persona!) La
forma tradicional, set guarda la identificación del usuario y ¡Entonces puede contar el número de elementos en el conjunto Juez como estándar!
Si este método guarda una gran cantidad de ID de usuario, ¡será más problemático! Nuestro propósito es contar, no guardar la identificación del usuario;
¡tasa de error del 0,81%! ¡Las tareas de estadísticas UV se pueden ignorar!

Prueba de uso

127.0.0.1:6379> pfadd mykey a b c d e f g h i j   //创建第一组元素mykey
(integer) 1 
127.0.0.1:6379> pfcount mykey    //统计mykey元素的基数数量
(integer) 10
127.0.0.1:6379> pfadd mykey2 i j z x c v b n m   //创建第二组元素mykey2
(integer) 1
127.0.0.1:6379> pfcount mykey2
(integer) 9
127.0.0.1:6379> pfmerge mykey3 mykey mykey2   //合并两组mykey mykey => mykey3  并集
OK
127.0.0.1:6379> pfcount mykey3  //看并集的数量!
(integer) 15

Si se permite la tolerancia a fallos, entonces se puede utilizar Htperloglog.
Si la tolerancia a fallas no está permitida, simplemente use set o su propio tipo de datos.

Operaciones de transacción básicas de Bitmaps

Almacenamiento de bits

Estadísticas de información del usuario, activo e inactivo! ¡Has iniciado sesión, no has iniciado sesión! ¡Regístrese, regístrese 365! En ambos estados, puede utilizar Bitmaps! Bitmaps bitmap, estructura de datos! ¡Todos son bits binarios operativos para grabar, y solo hay dos estados de 0 y 1!
365 días = 365 bits 1 byte = 8
Inserte la descripción de la imagen aquí
bits 46 bytes aproximadamente. Utilice mapa de bits para registrar registros de lunes a domingo.
Lunes: 1 Martes: 1 Miércoles: 0 .. . .

127.0.0.1:6379> setbit sign 0 1
(integer) 0
127.0.0.1:6379> setbit sign 1 1
(integer) 0
127.0.0.1:6379> setbit sign 2 0
(integer) 0
127.0.0.1:6379> setbit sign 3 0
(integer) 0
127.0.0.1:6379> setbit sign 4 1
(integer) 0
127.0.0.1:6379> setbit sign 5 0
(integer) 0
127.0.0.1:6379> setbit sign 6 0
(integer) 0

Compruebe si hay un check-in en un día determinado

127.0.0.1:6379> getbit sign 3
(integer) 0
127.0.0.1:6379> getbit sign 4
(integer) 1

Operación de estadísticas, ¡cuente el número de días registrados!

127.0.0.1:6379> bitcount sign   //统计这周的打卡记录,就可以看到是否有全勤
(integer) 3

Supongo que te gusta

Origin blog.csdn.net/yang13676084606/article/details/105160395
Recomendado
Clasificación