Redis入门-redis的五大数据类型+三种特殊的数据类型

news2025/1/18 3:30:39

前言:Redis有五大基本类型与三种特殊类型的介绍

Redis有五大基本类型字符串(string)哈希(hash)列表(list)集合(set)有序集合(sorted set)

  1. 字符串(string)是Redis最基本的类型,可以存储任意类型的数据,如整数、浮点数、二进制数据等。字符串类型的操作包括设置键值对、获取值、增减值等。

  2. 哈希(hash)是一个键值对的集合,类似于关联数组。哈希类型适合存储对象,对象的属性作为键,属性值作为值。哈希类型的操作包括设置键值对、获取值、删除键值对等。

  3. 列表(list)是一个链表结构,可以存储有序的字符串元素。列表类型的操作包括向列表中添加元素、获取元素、删除元素等。列表类型也可以实现队列或栈的功能。

  4. 集合(set)是一个无序的字符串元素的集合,不允许重复元素。集合类型的操作包括添加元素、获取元素、删除元素等。集合类型还支持交集、并集、差集等操作。

  5. 有序集合(sorted set)是一个有序的字符串元素的集合,每个元素都有一个分数,根据分数的大小对元素进行排序。有序集合类型的操作包括添加元素、获取元素、删除元素等。有序集合类型可以用于按分数排序的场景。

除了这五种基本类型,Redis还有三种特殊类型比特图(bitmap)超时哈希(hyperloglog)地理位置(geospatial)

  1. 比特图(bitmap)是一种位操作类型,可以在一个字符串中存储位的序列,支持对位进行操作,如设置位、获取位、统计位等。比特图类型可以实现布隆过滤器、统计在线用户等功能。

  2. 超时哈希(hyperloglog)是一种基数估计算法,可以估计一个集合中的不同元素的个数。超时哈希类型的操作包括添加元素、估计基数等。超时哈希类型适用于需要统计去重后的数据量的场景。

  3. 地理位置(geospatial)是一种可以存储地理位置信息的类型,支持地理位置的存储、计算距离等操作。地理位置类型可以用于地图相关的应用,如附近的人、附近的商家等。

三、五大数据类型

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库高速缓存消息队列MQ代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区

先开启Redis

在这里插入图片描述

Redis-key

在redis中无论什么数据类型,在数据库中都是以key-value形式保存通过进行对Redis-key的操作,来完成对数据库中数据的操作

下面学习的命令:

  • exists key:判断键是否存在
  • del key:删除键值对
  • move key db:将键值对移动到指定数据库
  • expire key second:设置键值对的过期时间
  • type key:查看value的数据类型
127.0.0.1:6379> keys * # 查看当前数据库所有key
(empty list or set)
127.0.0.1:6379> set name qinjiang # set key
OK
127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> keys *
1) "age"
2) "name"
127.0.0.1:6379> move age 1 # 将键值对移动到指定数据库
(integer) 1
127.0.0.1:6379> EXISTS age # 判断键是否存在
(integer) 0 # 不存在
127.0.0.1:6379> EXISTS name
(integer) 1 # 存在
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> keys *
1) "age"
127.0.0.1:6379[1]> del age # 删除键值对
(integer) 1 # 删除个数


127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> EXPIRE age 15 # 设置键值对的过期时间

(integer) 1 # 设置成功 开始计数
127.0.0.1:6379> ttl age # 查看key的过期剩余时间
(integer) 13
127.0.0.1:6379> ttl age
(integer) 11
127.0.0.1:6379> ttl age
(integer) 9
127.0.0.1:6379> ttl age
(integer) -2 # -2 表示key过期,-1表示key未设置过期时间

127.0.0.1:6379> get age # 过期的key 会被自动delete
(nil)
127.0.0.1:6379> keys *
1) "name"

127.0.0.1:6379> type name # 查看value的数据类型
string

关于TTL命令

Redis的key,通过TTL命令返回key的过期时间,一般来说有3种:

  • 当前key没有设置过期时间,所以会返回-1.
  • 当前key有设置过期时间,而且key已经过期,所以会返回-2.
  • 当前key有设置过期时间,且key还没有过期,故会返回key的正常剩余时间.

关于重命名RENAME和RENAMENX

  • RENAME key newkey修改 key 的名称
  • RENAMENX key newkey仅当 newkey 不存在时,将 key 改名为 newkey 。

更多命令学习:https://www.redis.net.cn/order/

在这里插入图片描述

String(字符串)

  • 追加字符串APPEND key value
  • 获取字符串的长度STRLEN
  • 自增/自减运算 INCR/DECR
  • 自增/自减指定的值 INCRBY/DECRBY
  • 获取某个范围GETRANGE的字符串
  • 替换某个范围的字符串SETRANGE
  • 设置过期时间SETEX
  • 不存在的时候才设置SETNX
  • 批量设置/获取值MSET,MSETNX/MGET
  • 获取当前的值的同时设置一个新值GETSET
127.0.0.1:6379> set k1 v1   # 设置值
OK
127.0.0.1:6379> get k1      # 获得值
"v1"
127.0.0.1:6379> keys *      # 获取所有的key
1) "k1"
127.0.0.1:6379> exists k1   # 判断某个key是否存在
(integer) 1
127.0.0.1:6379> append k1 hello # 追加字符串,如果当前的key不存在,就相当于set
(integer) 7
127.0.0.1:6379> get k1
"v1hello"
127.0.0.1:6379> strlen k1       # 获取字符串的长度
(integer) 7
127.0.0.1:6379> append k1 xiaofan
(integer) 14
127.0.0.1:6379> strlen k1
(integer) 14
127.0.0.1:6379> get k1
"v1helloxiaofan"
######################################################################
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> get views
"0"
127.0.0.1:6379> incrby views 10 # 可以设置步长,指定增量
(integer) 10
127.0.0.1:6379> incrby views 10
(integer) 20
127.0.0.1:6379> decrby views 5
(integer) 15
######################################################################
# 字符串范围 range
127.0.0.1:6379> set k1 hello,kuangshen      # 设置k1的值
OK
127.0.0.1:6379> get k1
"hello,kuangshen"
127.0.0.1:6379> getrange k1 0 3             # 截取字符串[0,3]
"hell"
127.0.0.1:6379> getrange k1 0 -1            # 获取全部的字符串
"hello,kuangshen"
127.0.0.1:6379> set k1 abcdefg
OK
127.0.0.1:6379> get k1
"abcdefg"
127.0.0.1:6379> setrange k1 1 xx            # 替换指定位置开始的字符串
(integer) 7
127.0.0.1:6379> get k1
"axxdefg"
######################################################################
# setex (set with expire) 设置过期时间
# setnx (set if not exist) 不存在再设置(分布式锁会经常用到)
127.0.0.1:6379> setex k3 30 hello
OK
127.0.0.1:6379> ttl k3
(integer) 27
127.0.0.1:6379> get k3
"hello"
127.0.0.1:6379> setnx mykey redis   # 如果mykey不存在,创建mykey
(integer) 1
127.0.0.1:6379> keys *
1) "mykey"
2) "k3"
127.0.0.1:6379> ttl k3
(integer) 6
127.0.0.1:6379> setnx mykey mongodb # mykey存在创建失败
(integer) 0
127.0.0.1:6379> get mykey
"redis"
######################################################################
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)

在这里插入图片描述

# getset    # 先get然后set
 
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"

String类似的使用场景:value除了是字符串还可以是数字,用途举例:

  • 计数器
  • 统计多单位的数量:uid:123666:follow 0
  • 粉丝数
  • 对象存储缓存

List类型(列表)

所有的List命令都是以l开头的,在redis里面我们可以把List玩成,栈、队列、阻塞队列!

  • List当中插入一个元素LPUSH/RPUSH
  • List当中获取指定元素LRANGE
  • 移出List集合中的一个元素LPOP/RPOP
  • 移出List集合中指定的元素LREM
  • 根据索引(下标)获取集合中元素值LINDEX
  • 获取List的长度LLEN
  • ltrim裁剪List为原来的一部分(直接修改原有List集合)
  • 移出列表的最后一个元素,并移动到新的列表中RPOPLPUSH
  • 将列表中指定的下标值替换为另一个值,更新操作,如果下标不存在就会报错
  • 在list集合中的指定元素前面插入值linsert lst before world xiaofan

在这里插入图片描述

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> lrange list 0 -1    # 获取list中的值
1) "three"
2) "two"
3) "one"
127.0.0.1:6379> lrange list 0 1     # 通过区间获取具体的值
1) "three"
2) "two"
127.0.0.1:6379> rpush list four # 将一个值或者多个值,插入到列表尾部(右)
(integer) 4
127.0.0.1:6379> lrange list 0 -1
1) "three"
2) "two"
3) "one"
4) "four"
127.0.0.1:6379> lpop list       # 移出list的第一个元素(左)
"three"
127.0.0.1:6379> rpop list       # 移出list的最后一个元素(右)
"four"
127.0.0.1:6379> lrange list 0 -1
1) "two"
2) "one"
 
######################################################################
# lindex 根据下标获取元素
127.0.0.1:6379> lindex list 0
"two"
127.0.0.1:6379> lindex list 1
"one"
127.0.0.1:6379> llen list   # 获取长度
######################################################################
# 移出指定的值!
127.0.0.1:6379> lpush list one two three
(integer) 3
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 2 three
(integer) 2
127.0.0.1:6379> lrange list 0 -1
1) "two"
######################################################################
# 截断
127.0.0.1:6379> lrange list 0 -1        
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> ltrim list 1 2  # 通过下标截取指定的长度,这个list已经改变了,截断了,只剩下截取的元素
OK
127.0.0.1:6379> lrange list 0 -1
1) "b"
2) "c"
 
######################################################################
# rpoplpush 移除列表的最后一个元素,将他移动到新的列表当中
127.0.0.1:6379> rpush list1 a b c d
(integer) 4
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
127.0.0.1:6379> rpoplpush list1 list2   # 移除列表的最后一个元素,将他移动到新的列表中!
"d"
127.0.0.1:6379> rpoplpush list1 list2
"c"
127.0.0.1:6379> lrange list1 0 -1
1) "a"
2) "b"
127.0.0.1:6379> lrange list2 0 -1
1) "c"
2) "d"
######################################################################
# lset 更新list当中存在的元素
127.0.0.1:6379> exists list
(integer) 0
127.0.0.1:6379> lset list 0 item
(error) ERR no such key
127.0.0.1:6379> lpush list a 
(integer) 1
127.0.0.1:6379> lset list 0 item    # 如果存在当前下标值,则更新
OK
127.0.0.1:6379> lrange list 0 -1
1) "item"
127.0.0.1:6379> lset list 1 value   # 如果不存在当前下标值,则报错
(error) ERR index out of range
######################################################################
127.0.0.1:6379> linsert list before b xxx
(integer) 6
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "xxx"
3) "b"
4) "c"
5) "d"
6) "b"
127.0.0.1:6379> linsert list after b yyy
(integer) 7
127.0.0.1:6379> lrange list 0 -1
1) "a"
2) "xxx"
3) "b"
4) "yyy"
5) "c"
6) "d"
7) "b"

set(无序集合)

  • 集合中添加元素sadd myset hello kuangshen lovekuangshen
  • 查看集合中的元素SMEMBERS
  • 判断某个元素是否存在于集合中SISMEMBER myset hello
  • 获取集合中元素个数SCARD
  • 移出集合中指定的元素值SREM
  • 随机获取Set集合中的值SRANDMEMBER
  • 随机删除集合中的一个元素SPOP
  • 移动指定的元素到另一个集合当中去SMOVE
  • 差集/交集/并集SDIFF/SINTER/SUNION
127.0.0.1:6379> sadd myset LBJ        # set集合中添加值 
(integer) 1
127.0.0.1:6379> sadd myset KD
(integer) 1
127.0.0.1:6379> sadd myset CURRY
(integer) 1
127.0.0.1:6379> smembers myset      # 遍历set集合   
1) "lovexiaofan"
2) "xiaofan"
3) "hello"
127.0.0.1:6379> sismember myset xiaofan # 判断某个值是不是在集合中 
(integer) 1
127.0.0.1:6379> sismember myset xf
(integer) 0
127.0.0.1:6379> scard myset # 获取set集合中元素的个数
(integer) 3
 
127.0.0.1:6379> srem myset hello    # 删除set中的指定的元素
(integer) 1
127.0.0.1:6379> smembers myset
1) "lovexiaofan"
2) "xiaofan"
######################################################################
# set是无序集合,随机抽取元素
127.0.0.1:6379> smembers myset  
1) "wenfeiyang"
2) "lovexiaofan"
3) "xiaofan"
127.0.0.1:6379> srandmember myset 1     # 随机抽取一个元素
1) "wenfeiyang"
127.0.0.1:6379> srandmember myset 1
1) "wenfeiyang"
127.0.0.1:6379> srandmember myset 1
1) "lovexiaofan"
127.0.0.1:6379> srandmember myset 1
1) "xiaofan"
#####################################################################随机删除一些set集合中的值
127.0.0.1:6379> smembers myset
1) "wenfeiyang"
2) "lovexiaofan"
3) "xiaofan"
127.0.0.1:6379> spop myset 1    # 随机删除一些set集合中的值
1) "lovexiaofan"
127.0.0.1:6379> spop myset
"xiaofan"
127.0.0.1:6379> smembers myset
1) "wenfeiyang"
######################################################################
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> smembers myset
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> sadd myset1 xiaofan
(integer) 1
127.0.0.1:6379> smembers myset
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> smembers myset1
1) "xiaofan"
127.0.0.1:6379> smove myset myset1 a    # 把指定元素从一个set集合移动到另一个set集合
(integer) 1
127.0.0.1:6379> smembers myset1
1) "a"
2) "xiaofan"
127.0.0.1:6379> smembers myset
1) "b"
2) "c"
---------------SADD--SCARD--SMEMBERS--SISMEMBER--------------------

127.0.0.1:6379> SADD myset m1 m2 m3 m4 # 向myset中增加成员 m1~m4
(integer) 4
127.0.0.1:6379> SCARD myset # 获取集合的成员数目
(integer) 4
127.0.0.1:6379> smembers myset # 获取集合中所有成员
1) "m4"
2) "m3"
3) "m2"
4) "m1"
127.0.0.1:6379> SISMEMBER myset m5 # 查询m5是否是myset的成员
(integer) 0 # 不是,返回0
127.0.0.1:6379> SISMEMBER myset m2
(integer) 1 # 是,返回1
127.0.0.1:6379> SISMEMBER myset m3
(integer) 1

---------------------SRANDMEMBER--SPOP----------------------------------

127.0.0.1:6379> SRANDMEMBER myset 3 # 随机返回3个成员
1) "m2"
2) "m3"
3) "m4"
127.0.0.1:6379> SRANDMEMBER myset # 随机返回1个成员
"m3"
127.0.0.1:6379> SPOP myset 2 # 随机移除并返回2个成员
1) "m1"
2) "m4"
# 将set还原到{m1,m2,m3,m4}

---------------------SMOVE--SREM----------------------------------------

127.0.0.1:6379> SMOVE myset newset m3 # 将myset中m3成员移动到newset集合
(integer) 1
127.0.0.1:6379> SMEMBERS myset
1) "m4"
2) "m2"
3) "m1"
127.0.0.1:6379> SMEMBERS newset
1) "m3"
127.0.0.1:6379> SREM newset m3 # 从newset中移除m3元素
(integer) 1
127.0.0.1:6379> SMEMBERS newset
(empty list or set)

# 下面开始是多集合操作,多集合操作中若只有一个参数默认和自身进行运算
# setx=>{m1,m2,m4,m6}, sety=>{m2,m5,m6}, setz=>{m1,m3,m6}

-----------------------------SDIFF 不同的地方------------------------------------

127.0.0.1:6379> SDIFF setx sety setz # 等价于setx-sety-setz
1) "m4"
127.0.0.1:6379> SDIFF setx sety # setx - sety
1) "m4"
2) "m1"
127.0.0.1:6379> SDIFF sety setx # sety - setx
1) "m5"


-------------------------SINTER---------------------------------------
# 共同关注(交集)

127.0.0.1:6379> SINTER setx sety setz # 求 setx、sety、setx的交集
1) "m6"
127.0.0.1:6379> SINTER setx sety # 求setx sety的交集
1) "m2"
2) "m6"

-------------------------SUNION---------------------------------------

127.0.0.1:6379> SUNION setx sety setz # setx sety setz的并集
1) "m4"
2) "m6"
3) "m3"
4) "m2"
5) "m1"
6) "m5"
127.0.0.1:6379> SUNION setx sety # setx sety 并集
1) "m4"
2) "m6"
3) "m2"
4) "m1"
5) "m5"

Hash集合

在这里插入图片描述

  • 设置一个具体的字段值hset myhash field2 value2
  • 设置多个个具体的字段值hmset myhash field2 value2 field3 value3
  • 获取多个指定的字段值hmget myhash field1 field2
  • 获取全部的值hgetall myhash
  • 删除hash指定的键HDEL myhash field1
  • 获取键值对的个数HLEN判断hash中指定字段是否存在HEXISTS
  • 获取所有的key、valueHKEYS/HVALS
127.0.0.1:6379> hset myhash field1 kuangshen    # set一个具体的值key-value
(integer) 1
127.0.0.1:6379> hget myhash field1              # 获取一个字段值
"kuangshen"
127.0.0.1:6379> hmset myhash field1 hello field2 world  # 设置多个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              # 删除某个指定的key字段,对应的value值也就消失了
(integer) 1
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
######################################################################
127.0.0.1:6379> hset myhash field1 hello field2 world
(integer) 1
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
 
######################################################################
127.0.0.1:6379> hkeys myhash    # 获取所有的key
1) "field2"
2) "field1"
127.0.0.1:6379> hvals myhash    # 获取所有的value
1) "world"
2) "hello"
 
127.0.0.1:6379> hset myhash field3 10
(integer) 1
127.0.0.1:6379> hincrby myhash field3 2     # 增量运算
(integer) 12
127.0.0.1:6379> hgetall myhash
1) "field2"
2) "world"
3) "field1"
4) "hello"
5) "field3"
6) "12"
 
127.0.0.1:6379> hsetnx myhash field4 value4     # 如果不存在设置成功
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 abc        # 如果存在则设置失败
(integer) 0
 
######################################################################

Zset有序集合

  • 添加元素zadd myset 1 one 2 two 3 three
  • 获取所有元素zrange myset 0 -1
  • 排序ZREVRANGEBYSCORE key max min WITHSCORES LIMIT offset count
  • 升序/降序zrange myzset 0 -1/ZREVRANGE myzset 0 -1
  • 获取指定区间的元素个数zcount myzset 1 4
127.0.0.1:6379> zadd myset 1 one 2 two 3 three      # 添加值
(integer) 3
127.0.0.1:6379> zrange myset 0 -1
1) "one"
2) "two"
3) "three"
######################################################################
127.0.0.1:6379> zadd salary 2500 a 5000 b 500 c
(integer) 3
127.0.0.1:6379> zrange salary 0 -1      # 显示全部用户,从小到大
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> zrangebyscore salary -inf +inf      # zrangebyscore 从小到大
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> zrevrangebyscore salary +inf -inf   # zrevrangebyscore 从大到小
1) "b"
2) "a"
3) "c"
127.0.0.1:6379> zrevrangebyscore salary +inf -inf withscores    # 显示全部用户并且附带成绩
1) "b"
2) "5000"
3) "a"
4) "2500"
5) "c"
6) "500"
######################################################################
127.0.0.1:6379> zrem salary a       # 移出某个元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1
1) "c"
2) "b"
 
127.0.0.1:6379> zcard salary    # 有序集合中的个数
(integer) 2
 
######################################################################
127.0.0.1:6379> zadd myset 1 hello 2 world 3 xiaofan
(integer) 3
127.0.0.1:6379> zcount myset 1 3    # 获取指定区间之间的成员数量
(integer) 3
127.0.0.1:6379> zcount myset 1 2
(integer) 2
127.0.0.1:6379> zcount myset 1 1
(integer) 1

四、三种特殊的数据类型

geospatial 地理位置

  • 获取经纬度的测试数据:http://www.jsons.cn/lngcode/

  • 官方文档:[geoadd - Redis中文开发手册 ] - 在线原生手册 - php中文网

1、geoadd 添加地理位置

# 注意
# 1. 经纬度
# 2. 官方文档
 
127.0.0.1:6379> geoadd china:city 116.405285 39.904989 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.472644 31.231706 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.504962 29.533155 chongqing
(integer) 1
127.0.0.1:6379> geoadd china:city 120.153576 30.287459 hangzhou
(integer) 1
127.0.0.1:6379> geoadd china:city 125.14904 42.927 xian
(integer) 1
127.0.0.1:6379> geoadd china:city 112.549248 37.857014 taiyuan
(integer) 1

2、geopos 获取指定城市的经纬度

127.0.0.1:6379> geopos china:city taiyuan
1) 1) "112.54924803972244263"
   2) "37.85701483724372451"
127.0.0.1:6379> geopos china:city beijing
1) 1) "116.40528291463851929"
   2) "39.9049884229125027"

3、geodist 获取两个位置之间的距离

m 为米。
km 为千米。
mi 为英里。
ft 为英尺。
 
127.0.0.1:6379> geodist china:city beijing taiyuan km
"404.1120"
127.0.0.1:6379> geodist china:city beijing shanghai
"1067597.9668"
127.0.0.1:6379> geodist china:city beijing shanghai km
"1067.5980"

4、GEORADIUS具体指定位置多少范围内的所有城市

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km
1) "chongqing"
2) "hangzhou"
3) "taiyuan"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1) "chongqing"
 
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord
1) 1) "chongqing"
   2) 1) "106.50495976209640503"
      2) "29.53315530684997015"
2) 1) "hangzhou"
   2) 1) "120.15357345342636108"
      2) "30.28745790721532671"
3) 1) "taiyuan"
   2) 1) "112.54924803972244263"
      2) "37.85701483724372451"
      
# 获取指定的个数,最近的count
127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km withcoord count 2
1) 1) "chongqing"
   2) 1) "106.50495976209640503"
      2) "29.53315530684997015"
2) 1) "taiyuan"
   2) 1) "112.54924803972244263"
      2) "37.85701483724372451"

5、GEORADIUSBYMEMBER 找出位于指定元素周围的其他元素

127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km 
1) "taiyuan"
2) "beijing"
3) "xian"

6、geohash 命令,返回一个或者多个位置元素的geohash表示

geohash 命令,返回一个或者多个位置元素的geohash表示

127.0.0.1:6379> geohash china:city beijing chongqing
1) "wx4g0b7xrt0"
2) "wm78p86e170"

7、 GEO 底层的实现原理其实就是Zset!我们可以使用Zset命令来操作geo!

127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqing"
2) "hangzhou"
3) "shanghai"
4) "taiyuan"
5) "beijing"
6) "xian"
127.0.0.1:6379> ZREM china:city xian
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1) "chongqing"
2) "hangzhou"
3) "shanghai"
4) "taiyuan"
5) "beijing"

Hyperloglog 基数统计

在这里插入图片描述

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   # 统计第一组元素的个数,会移除相同元素
(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     # 合并第一组元素和第二组元素,去掉一个相同的元素
OK
127.0.0.1:6379> PFCOUNT mykey3
(integer) 15

在这里插入图片描述

Bitmaps

在这里插入图片描述

127.0.0.1:6379> setbit sign 0 0     # 设置数据
(integer) 0
127.0.0.1:6379> setbit sign 1 0
(integer) 0
127.0.0.1:6379> setbit sign 2 1
(integer) 0
127.0.0.1:6379> setbit sign 3 1
(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 1
(integer) 0
 
127.0.0.1:6379> getbit sign 6   # 获取指定数据
(integer) 1
127.0.0.1:6379> getbit sign 5
(integer) 0
 
127.0.0.1:6379> bitcount sign   # 统计1的个数
(integer) 4

Redis入门-redis的五大数据类型+三种特殊的数据类型 到此完结,笔者归纳、创作不易,大佬们给个3连再起飞吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1370611.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ATTCK视角下的信息收集:Sysmon检测

目录 1、简介 2、使用Sysmon 3、检测Sysmon是否安装运行 4、检测Sysmon是否被卸载 5、使Sysmon在终端隐匿运行的技术 1、简介 Sysmon(系统监视器)是由windows sysinternals 出品的Sysinternals 系列工具中的一个 它是windows系统服务和设备驱动程…

VMware通过微PE安装window XP系统

软/硬件版本:微PE V1.3、VMware Workstation 12 Pro、windows xp professional sp3 目录:①不成功的3点原因;②安装教程 安装不成功的原因有3点: 1、VMware磁盘格式选择IDE,否则系统安装界面将出现0x0000007B错误代码。…

【机器学习】常见算法详解第2篇:K近邻算法各种距离度量(已分享,附代码)

本系列文章md笔记(已分享)主要讨论机器学习算法相关知识。机器学习算法文章笔记以算法、案例为驱动的学习,伴随浅显易懂的数学知识,让大家掌握机器学习常见算法原理,应用Scikit-learn实现机器学习算法的应用&#xff0…

k8s源码阅读环境配置

源码阅读环境配置 k8s代码的阅读可以让我们更加深刻的理解k8s各组件的工作原理,同时提升我们Go编程能力。 IDE使用Goland,代码阅读环境需要进行如下配置: 从github上下载代码:https://github.com/kubernetes/kubernetes在GOPATH目…

YOLOv3算法较YOLOv1及YOLOv2的区别

yoloV3以V1,V2为基础进行的改进,主要有:利用多尺度特征进行目标检测;先验框更丰富;调整了网络结构;对象分类使用logistic代替了softmax,更适用于多标签分类任务。 3.1算法简介 YOLOv3是YOLO (You Only Lo…

Python基础语法(上)——基本语法、顺序语句、判断语句、循环语句(有C++基础快速掌握Python语言)

文章目录 0.python小技巧与易错点1.python 与 c 语法有哪些区别2.Python基本语法2.1python的变量类型2.2python中的运算符2.3python中的表达式2.4python中的输入输出 3.python判断语句3.1基本用法:3.2关于else if 的用法3.3关于pass语句3.4python变量的作用域3.5pyt…

2024年1月9日

2024年1月9日09:26:57待在工作室玩千恋万花和登录PTA练习习题 2024年1月9日09:28:02判断素数肯定会成为考试的关键点之一 2024年1月9日15:13:49完成java的复习 2024年1月9日15:16:41判断反馈类型 2024年1月9日15:20:29行列式求系数通过沙路法展开得到 2024年1月9日15:21:1…

【leetcode】力扣算法之删除链表中倒数第n个节点【中等难度】

删除链表中倒数第n个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 用例 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5] 输入:head [1], n 1 输出:[] 输入:head …

【OSG案例详细分析与讲解】之二:【着色文件转换为字符数组】

文章目录 一、【着色文件转换为字符数组】前言 二、【着色文件转换为字符数组】Shader转换 三、【着色文件转换为字符数组】转换函数 1.转换函数 2.字符替换函数 四、【着色文件转换为字符数组】示例 1.GLSL2Cpp.cpp文件: 2.Qt pro文件: 五、【着色文件转…

知识点整理[(GraphGeo) DATA AND PROBLEM DEFINITION]

3 DATA AND PROBLEM DEFINITION 3.1 Data Collection 问题一:IP定位数据集构成 回答: 包含数以百万计的IP地址,这些IP地址包括: (1)它们具有自己的知识(如自主系统(AS)和WHOIS数据); (2)网络测量

Python-抖音无法拒绝的表白代码【附源码】

一个无法被拒绝的表白代码 运行效果: 一:主程序: import sys import cfg import random import pygame from tkinter import Tk, messagebox Function:按钮类 Initial Args:--x, y: 按钮左上角坐标--width, height: 按钮宽高--text: 按钮显…

Vant2组件库van-list+Toast下拉加载滚动条回顶问题

目录 List 列表 Toast 轻提示 解决方案 1、不使用 Toast 的 加载提示 2、修改调整 pointer-event 属性值 3、判断是否为第一次加载再使用 背景 &#xff1a; 移动端项目 开发时&#xff0c;有数据长列表展示的场景需求&#xff0c;此时就用到了 Vant2 组件库里面的 <v…

【信息安全】深度分析邮件安全及钓鱼攻击防范

本博文共计3100余字&#xff0c;预计需阅读20分钟 【邮件安全建设】 一、前言 邮件系统作为企业办公网络架构中重要的组成部分&#xff0c;同时也是业务高频使用的办公应用&#xff0c;一旦出现安全问题&#xff0c;业务将会被严重干扰甚至中断&#xff0c;本篇博客通过攻守两…

react中实现拓扑图

react中实现拓扑图关系图 需求echarts代码react代码 需求 项目中的原型图需要使用react实现一个拓扑图&#xff08;关系图&#xff09; 通过查找&#xff0c;找到了可以使用的类似的原型&#xff1a;以下图片地址。 通过项目需要以及修改&#xff0c;形成了下边的样式 echar…

Java--业务场景:获取请求的ip属地信息

文章目录 前言步骤在pom文件中引入下列依赖IpUtil工具类在Controller层编写接口&#xff0c;获取请求的IP属地测试接口 IpInfo类中的方法 前言 很多时候&#xff0c;项目里需要展示用户的IP属地信息&#xff0c;所以这篇文章就记录一下如何在Java Spring boot项目里获取请求的…

Java--业务场景:在Spring项目启动时加载Java枚举类到Redis中(补充)

文章目录 前言步骤测试结果 前言 通过Java–业务场景&#xff1a;在Spring项目启动时加载Java枚举类到Redis中,我们成功将Java项目里的枚举类加载到Redis中了&#xff0c;接下来我们只需要写接口获取需要的枚举值数据就可以了&#xff0c;下面一起来编写这个接口吧。 步骤 在…

[算法与数据结构][c++][python]:C++与Python中的赋值、浅拷贝与深拷贝

C与Python中的赋值、浅拷贝与深拷贝 写在前面&#xff1a;Python和C中的赋值与深浅拷贝&#xff0c;由于其各自语言特性的问题&#xff0c;在概念和实现上稍微有点差异&#xff0c;本文将这C和Python中的拷贝与赋值放到一起&#xff0c;希望通过对比学习两语言实现上的异同点&a…

超市商品管理系统设计 C++实现

超市商品管理系统设计—C实现 文章目录 超市商品管理系统设计---C实现一、内容要求大纲图 二、源代码&#xff08;包含大量注释&#xff09;1、main.cpp文件2、supermarket.h文件3、supermarket.cpp文件4、administrator.h文件5、administrator.cpp文件6、user.h文件7、user.cp…

系列十二、数组

一、数组 1.1、概述 数组是指可以同时存放固定长度的同一类型的数据。 1.2、数组的声明 数组的声明有三种方式&#xff0c;具体如下&#xff1a; 1.2.1、方式一 /*** 声明数组的第一种方式* cityArray&#xff1a;数组名&#xff0c;注意:不包括[]*/ Test public void d…

MySQL的导入导出及备份

一.准备导入之前 二.navicat导入导出 ​编辑 三.MySQLdump命令导入导出 四.load data file命令的导入导出 五.远程备份 六. 思维导图 一.准备导入之前 需要注意&#xff1a; 在导出和导入之前&#xff0c;确保你有足够的权限。在进行导入操作之前&#xff0c;确保目标数据…