redis数据类型

一、key操作

1、keys 查看当前库中所有的 key。

有3个通配符:*,?,[]

  • *:通配任意多个字符
  • ?:通配单个字符
  • []:通配括号内的某1个字符
> keys *
> keys ?ame
name
> keys [a,g,e]ge
ege
age

2、exists 查看key是否存在

判断某个 key 是否存在,返回1表示存在,0不存在。当后面跟多个 key 时,只返回存在的个数,但不返回哪一个存在/不存在。

> exists name
1
#id name age存在,a不存在
> exists id name age a
3

3、查看当前 key 所储存的值的类型。返回当前 key 所储存的值的类型,如string 、list等

> type name
string

 4、删除已存在的key,不存在的 key 会被忽略。当后面跟多个 key 时,则返回删除成功的个数。

> del ege
1
#删除不存在的key
> del kkkkkk
0
> del v1 v2 v3
3

5、expire 设置 key 的过期时间

给 key 设置过期时间,单位为。设置成功返回 1 。 当 key 不存在返回 0。

当设置已经有过期时间的 key 时,会覆盖原来的过期时间。

> expire id 300
(integer) 1
#查看剩余时间
> ttl id
(integer) 298
#当设置已经有过期时间的key时,会覆盖原来的过期时间
> expire id 600
(integer) 1
> ttl id
(integer) 597

 6、ttl 以秒为单位返回 key 的剩余过期时间。当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间

> ttl id
-1
> ttl ids
-2

7、persist 移除key的过期时间

移除给定 key 的过期时间,使得 key 永不过期。当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。

> persist id
0

二、五种基本类型

1、字符串

String是redis最基本的类型,一个key对应一个value。 String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。 String类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M(但是大字符串非常不建议)

String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。

常规key-value

缓存应用: 常规计数:微博数,粉丝数等。

常用命令

 1、set/get

  • set用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类型。
  • get用于获取指定 key 的值。如果 key 不存在,返回 nil 
> get name 
"zhangsan"
> set name xiaobai
OK
> get name 
"xiaobai"
> get namem
(nil)

 2、append

将给定的 value 追加到 key 原值末尾,并返回 key 的长度

  • 如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。
  • 如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样
> append name hello
12
> get name
xiaobaihello

3、strlen

获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误

> strlen name
12
#list1为list类型
> strlen list1
WRONGTYPE Operation against a key holding the wrong kind of value

 4、setex

给指定的 key 设置 value 值及秒级的过期时间。如果 key 已经存在, setex 命令将会替换旧的值,并设置过期时间

setex 和 expire 的区别在于,前者是在创建的 key 时设置过期时间,后者则是设置已经存在的 key。

> setex num 300 v1
OK
> get num
v1
> ttl num
231
> setex num 300 v2
OK
> ttl num
296
> get num
v2

5、 mset/mget

  • 同时设置一个或多个 key-value 。
  • 返回所有(一个或多个)给定 key 的值。
> mset v1 123 v2 456 v3 789
OK
> mget v1 v3 v2
123
789
456

6、setrange/getrange

  • 设置指定区间范围内的值,从 offset 位置开始依次往后设置(包含offset位置),返回字符串的长度
  • 获取指定区间范围内的值,从 start 位置到 end 位置(包含两端)
  • setrange 命令也可以直接创建 key 和 value。
  • getrange 的 end 可以超过字符串长度,超过则为查看 offset 位置到字符串的末尾。
> set data abcdefg
OK
> setrange data 2 xxx
7
> get data
abxxxfg
> getrange data 2 5
xxxf
#end超过字符串的长度,即超过下标
> getrange data 2 9
xxxfg

 7、setnx

只有在 key 不存在时设置 key 的 value 值。成功则返回1,key 存在则返回 0

> setnx data a
(integer) 0
> setnx v5 123
(integer) 1

8、msetnx 原子操作 

当所有 key 都成功设置,返回 1 。如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。

127.0.0.1:6379> msetnx k10 v10 k15 v15 # 原子性操作!
(integer) 0

9、incr、decr

  • 将 key 中储存的数字值增一,并返回 key 增一后的值
  • 将 key 中储存的数字值减一,并返回 key 减一后的值
  • 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incr/decr 操作。
  • 如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误。

> incr v1
1
> incr v1
2
> incr data
ERR value is not an integer or out of range
> decr v2
-1
> decr v2
-2

10、 incrby/decrby

  • 将 key 存储的数字值按照 increment 进行增加,并返回增加后的值。
  • 将 key 存储的数字值按照 decrement 进行减小,并返回减小后的值。
  • 如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 incrby/decrby 操作。
  • 如字符串类型的值不能表示为数字、或者是其他类型,那么返回一个错误
> exists v1
0
> incrby v1 10
10
> get v1
10
> decrby v1 5
5
> incrby data 10
ERR value is not an integer or out of range

 11、getset先get再set

127.0.0.1:6379> getset db mongodb # 没有旧值,返回 nil
(nil)
127.0.0.1:6379> get db
"mongodb"
127.0.0.1:6379> getset db redis # 返回旧值 mongodb
"mongodb"
127.0.0.1:6379> get db
"redis"

2、hash类型

Redis hash 是一个键值对集合,Redis hash 是一个String类型的field和value的映射表,hash特别适合用于存储对象。类似Java里面的Map,每一个 hash 可以存储 2^32-1 个键值对。

 1、hset/hget

  • 给 key 集合中的 field 赋值 value,并返回成功设置的 field 个数
  • 返回 key 哈希中取出 field 字段的值。
  • 如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
  • 如果字段已经存在于哈希表中,旧值将被重写
> hset data id 9 name xiaobai age 22 sex nan
4
> hset data email 123@.com
1
> hget data name
xiaobai

2、hmset/hmget

  • 批量设置 key 中 field 字段的值
  • 批量获取 key 中 field 字段的值
> hmget data id name age
9
xiaobai
22

 3、hexists

判断指定 key 中是否存在 field,存在则返回 1,不存在则返回 0

> hexists data id
(integer) 1
> hexists data ids
(integer) 0

4、hkeys

获取该哈希 key 中所有的 field

> hkeys data
id
name
age
sex
email

 5、hincrby

为哈希表 key 中的 field 字段的值加上增量 increment,并返回操作后的值

  • 增量也可以为负数,相当于对指定字段进行减法操作。
  • 如果哈希表的 key 不存在,一个新的哈希表被创建并执行 hincrby 命令。
  • 如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
  • 对一个储存字符串值的字段执行 hincrby 命令将造成一个错误。
> hincrby data age 1
23
> hget data age
23
> hincrby data age -2
21
> hincrby data2 age 1
1
> hincrby data2 age2 5
5
> hkeys data2
age
age2

6、hdel

删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略,并返回成功删除的个数

> hdel data2 age age2 age3
2

 7、hsetnx

给key哈希表中不存在的的字段赋值 (即不覆盖原来的值),设置成功返回 1,设置失败返回 0

> hsetnx data id 99
0
> hset data ids 99
1

3、list

Redis列表是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾 部(右边)。 它的底层实际是个链表 !对两端操作性能极高,通过索引操作中间的节点性能较差。一个List最多可以包含 2^32 - 1个元素 ( 每个列表超过40亿个元素)

1、rpush、rpush

  • 从左边(头部)插入一个或多个值,并返回列表的长度
  • 从右边(尾部)插入一个或多个值,并返回列表的长度
> lpush data v1 v2 v3
3

2、lrange

返回 key 列表中的 start 和 end 之间的元素(包含 start 和 end)。 其中 0 表示列表的第一个元素,-1表示最后一个元素。

注意:end 值是可以超过列表的长度的,即为查询从 start 位置开始到列表末尾的值。

> lrange data 1 3
v2
v1
v4
> lrange data 4 10
v5
v6

3、lpop、rpop

  • 从列表中移除第一个值,并返回移除的值
  • 从列表中移除最后一个值,并返回移除的值

注意:当列表中的元素全部被移除完,这个列表也就不存在了(值在键在,值光键亡)

> lpop data
v3
> lpop data
v2
> rpop data
v6
> rpop data
v5
> rpop data
v4
> rpop data
v1
> exists data
0

4、 lindex

获取列表 index 位置的值(从左边开始)。

  • index 的值是可以大于列表的长度的,不过查询到的值会为 null。
  • index 的值也可以为负数,负数为从右边开始(例如上面 data 列表的 -1 的值 v6)
> llen data
6
> lindex data 4
v5
> lindex data 10
null
> lindex data -1
v6
> lindex data -5
v2
> lindex data -7
null

 5、llen

获取列表长度,不存在的 key 会返回 0。

> llen data
6

6、lrem

从左边开始删除与 value 相同的 count 个元素,并返回成功删除的个数

> lrem data 2 v1
1
> lrange data 0 -1
v3
v2
v4
v5
v6
> lrem data 2 v
0

 7、 lset

将索引为 index 的值设置为 value,若 index 超过列表长度则会报错

> lset data 0 v0
OK
> lrange data 0 1
v0
v2
> llen data
5
> lset data 5 v0
ERR index out of range
> lset data 8 v0
ERR index out of range

8、linsert

在列表中 value 值的 前边/后边 插入一个 new value 值(从左开始),并返回列表的长度

> lrange data 0 -1
#列表此时为:v0 v2 v4 v5 v6
> linsert data before v2 v1
6
> linsert data after v2 v3
7
> lrange data 0 -1
#列表此时为:v0 v1 v2 v3 v4 v5 v6

 性能总结

它是一个字符串链表,left,right 都可以插入添加 如果键不存在,创建新的链表 如果键已存在,新增内容 如果值全移除,对应的键也就消失了 链表的操作无论是头和尾效率都极高,但假如是对中间元素进行操作,效率就很惨淡了。

list就是链表,略有数据结构知识的人都应该能理解其结构。使用Lists结构,我们可以轻松地实现最新消 息排行等功能。List的另一个应用就是消息队列,可以利用List的PUSH操作,将任务存在List中,然后工 作线程再用POP操作将任务取出进行执行。Redis还提供了操作List中某一段的api,你可以直接查询,删 除List中某一段的元素。 Redis的list是每个子元素都是String类型的双向链表,可以通过push和pop操作从列表的头部或者尾部 添加或者删除元素,这样List即可以作为栈,也可以作为队列。

4、Set(集合)

 Redis 中的 Set 类型是一种无序集合,集合中的元素没有先后顺序但都唯一,当需要存储一个列表数据,又不希望出现重复数据时,Set 是一个很好的选择。Set 是 String 类型的无序集合,它底层其实是一个 value 为 null 的 hash 表,所以添加、删除、查找的时间复杂度都是 O(1)。

1、sadd

将一个或多个元素添加到集合 key 中,已经存在的元素将被忽略,并返回实际插入的个数

> sadd data v1 v2 v2 v3 v4 v5 v5 v6
6
> sadd data v7
1

2、smembers

获取该集合的所有元素

3、sismember

判断集合 key 中是否含有 member 元素,如有返回1,否则返回0

> sismember data v4
1
> sismember data v9
0

 4、scard

返回该集合的元素个数

> scard data
7
> scard data1
0

5、srem

删除集合中的一个或多个成员元素,不存在的成员元素会被忽略,并返回成功删除的个数

> srem data v5 v7 v8 v9
2

 6、spop

随机删除集合中一个元素并返回该元素。

> spop data
v4 #删除的元素为v4

7、srandmember

随机获取集合中 count 个元素,但不会删除,count 不填则随机获取一个元素。

> srandmember data
v6
> srandmember data 1
v3
> srandmember data 2
v6
v1
> srandmember data 2
v2
v1
> srandmember data 4
v6
v3
v1
v2

 8、smove

将 member 元素从 source 集合移动到 destination 集合中,成功移动返回1,否则返回0

  • destination 集合可以不存在。
  • 如果 source 集合不存在或不包含指定的 member 元素,则 smove 命令不执行任何操作,仅返回0 
> smove data data2 v3
1
> smembers data2
v3
> smove data data2 v9
0
> smembers data
v6
v1
v2

9、sinter

返回两个集合的交集元素

> sadd data1 v2 v4 v5 v6 v1
5
> sadd data2 v4 v6 v8 v9 v0
5
#交集
> sinter data1 data2
v6
v4
#自己的话则全部
> sinter data1
v6
v5
v4
v2
v1

 10、sunion

返回两个集合的并集元素

11、sdiff

返回两个集合的差集元素(要求:在前者集合中的元素,后者集合没有的元素)

> sdiff data1
v6
v4
v5
v2
v1
> sdiff data1 data2
v5
v1
v2

 在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为 集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功 能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集 合中。

5、Zset(sorted set:有序集合)

Redis zset 和 set 一样,也是String类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。 Redis正是通过分数来为集合中的成员进行从小到大的排序,zset的成员是唯一的,但是分数(Score) 却可以重复。

在set基础上,加一个score值。之前set是k1 v1 v2 v3,现在zset是 k1 score1 v1 score2 v2

1、zadd

将一个或多个元素(member)及分数(score)加入到有序集 key 中

 

  • 如果某个元素已经是有序集的元素,那么更新这个元素的分数值,并通过重新插入这个元素,来保证该元素在正确的位置上。
  • 分数值可以是整数值或双精度浮点数
  • 如果有序集合 key 不存在,则创建一个空的有序集并执行 zadd 操作。
> zadd data 100 java 300 python 500 c++
3
> zadd key 200 java
1
> zadd data 600.00 php
1
> zrange data 0 -1
java
python
c++
php

 2、zrange

返回 key 集合中的索引 start 和索引 end 之间的元素(包含 start 和 end)

  • 其中元素的位置按分数值递增(从小到大)来排序。 其中 0 表示列表的第一个元素,-1表示最后一个元素。
  • withscores 是可选参数,是否返回分数。
> zrange data 0 1
java
python
> zrange data 0 1 withscores
java
100
python
300

 3、zrangebyscore

返回key集合中的分数minscore 和分数maxscore 之间的元素(包含minscore 和maxscore )。其中元素的位置按分数值递增(从小到大)来排序

> zrangebyscore data 300 500 withscores
python
300
c++
500

4、zrem

删除 key 集合下的 member 元素,并返回成功删除的个数

 

> zrem data php
1

 5、zincrby

为元素 member 的 score 加上 increment 的值,并返回处理后的值

> zincrby data 100 java
200
> zincrby data -100 c++
400

6、zcount

统计该集合在minscore 到maxscore分数区间中元素的个数

> zcount data 100 300
2

 7、zrank

返回 member 元素在集合中的排名,从 0 开始。没有该元素则返回 null

> zrank data java
0
> zrank data java1
null

 

和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,比如 一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分, 这样在数据插入集合的时候,就已经进行了天然的排序。可以用sorted set来做带权重的队列,比如普 通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让 重要的任务优先执行。 排行榜应用,取TOP N操作 !

三、特殊类型三种

1、HyperLogLog

1.1、概述

实际项目种经常遇到统计网站pv(pageview页面访问量的问题),可以使用redis的incr、incrby轻松实现

但是类似UV(userVistor独立访客)、独立ip数量、搜索记录数等需要去重和计数的问题如何解决?这种集合种不重复元素个数的问题称为基数问题

1.2、什么是基数?

比如数据集{1、3、5、7、5、7、8、9},基数集就是{1、3、5、7、8、9},基数就是6,基数估计指的是在误差范围内,快速计算基数

1.3、基数解决方案

数据存储在mysql表中,使用 distinct count计算不重复个数

使用redis提供的hash、set、bitmaps等数据结构处理

上面解决方案随着数据不断增加 导致空间越来越大,对于非常大的数据集不切实际,为了降低一定的精度来平衡存储空间,redis推出了hyperloglog用来做基数统计,特点是在输入元素非常大时计算空间是固定的并且很小,每个hyperloglog键只需12KB内存就可以计算接近2^63个不同元素的基数,但是只会基数估计,不能像集合那样返回输入的各个元素

命令

[PFADD key element [element ...] 添加指定元素到 HyperLogLog 中。

[PFCOUNT key [key ...] 返回给定 HyperLogLog 的基数估算值。

[PFMERGE destkey sourcekey [sourcekey ...] 将多个 HyperLogLog 合并为一个 HyperLogLog,并 集计算

127.0.0.1:6379> PFADD mykey a b c d e f g h i j
1
127.0.0.1:6379> PFCOUNT mykey
10
127.0.0.1:6379> PFADD mykey2 i j z x c v b n m
1
127.0.0.1:6379> PFMERGE mykey3 mykey mykey2
OK
127.0.0.1:6379> PFCOUNT mykey3
15

2、BitMap

2.1、为什么有BitMap类型

在开发中,可能会遇到这种情况:需要统计用户的某些信息,如活跃或不活跃,登录或者不登录;又如 需要记录用户一年的打卡情况,打卡了是1, 没有打卡是0,如果使用普通的 key/value存储,则要记录 365条记录,如果用户量很大,需要的空间也会很大,所以 Redis 提供了 Bitmap 位图这中数据结构, Bitmap 就是通过操作二进制位来进行记录,即为 0 和 1;如果要记录 365 天的打卡情况,使用 Bitmap 表示的形式大概如下:0101000111000111...........................,这样有什么好处呢?当然就是节约内存 了,365 天相当于 365 bit,又 1 字节 = 8 bit , 所以相当于使用 46 个字节即可。

2.2、Bitmap 理解

可以把Bitmap 想象成一个以位为单位的数组,数组的每个单元只能存储1 0 数组得下标在BitMaps中叫做偏移量

2.3、命令

setbit 设置操作

SETBIT key offset value : 设置 key 的第 offset 位为value (1或0)

getbit 获取操作

GETBIT key offset 获取offset设置的值,未设置过默认返回0

bitcount 统计操作

bitcount key [start, end] 统计 key 上位为1的个数

3、GEO

3.1、概述

Redis 的 GEO 特性在 Redis 3.2 版本中推出, 这个功能可以将用户给定的地理位置信息储存起来, 并对 这些信息进行操作。来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能。geo的数据类型为 zset。 GEO 的数据结构总共有六个常用命令:geoadd、geopos、geodist、georadius、 georadiusbymember、gethash

官方文档:Redis GEOADD 命令_将指定的地理空间位置(纬度、经度、名称)添加到指定的key中

3.2、命令

geoadd

# 语法
geoadd key longitude latitude member ...
# 将给定的空间元素(纬度、经度、名字)添加到指定的键里面。
# 这些数据会以有序集he的形式被储存在键里面,从而使得georadius和georadiusbymember这样的
命令可以在之后通过位置查询取得这些元素。
# geoadd命令以标准的x,y格式接受参数,所以用户必须先输入经度,然后再输入纬度。
# geoadd能够记录的坐标是有限的:非常接近两极的区域无法被索引。
# 有效的经度介于-180-180度之间,有效的纬度介于-85.05112878 度至 85.05112878 度之间。,
当用户尝试输入一个超出范围的经度或者纬度时,geoadd命令将返回一个错误。

测试 :百度搜索经纬度查询,模拟真实数据
127.0.0.1:6379> geoadd china:city 116.23 40.22 北京
(integer) 1
127.0.0.1:6379> geoadd china:city 121.48 31.40 上海 113.88 22.55 深圳 120.21
30.20 杭州
(integer) 3
127.0.0.1:6379> geoadd china:city 106.54 29.40 重庆 108.93 34.23 西安 114.02
30.58 武汉
(integer) 3

geopos

# 语法
geopos key member [member...]
#从key里返回所有给定位置元素的位置(经度和纬度)

127.0.0.1:6379> geopos china:city 北京
1) 1) "116.23000055551528931"
2) "40.2200010338739844"
127.0.0.1:6379> geopos china:city 上海 重庆
1) 1) "121.48000091314315796"
2) "31.40000025319353938"
2) 1) "106.54000014066696167"
2) "29.39999880018641676"
127.0.0.1:6379> geopos china:city 新疆
1) (nil)

geodist

# 语法
geodist key member1 member2 [unit]
# 返回两个给定位置之间的距离,如果两个位置之间的其中一个不存在,那么命令返回空值。
# 指定单位的参数unit必须是以下单位的其中一个:
# m表示单位为米
# km表示单位为千米
# mi表示单位为英里
# ft表示单位为英尺
# 如果用户没有显式地指定单位参数,那么geodist默认使用米作为单位。
#geodist命令在计算距离时会假设地球为完美的球形,在极限情况下,这一假设最大会造成0.5%的误
差。

测试
127.0.0.1:6379> geodist china:city 北京 上海
"1088785.4302"
127.0.0.1:6379> geodist china:city 北京 上海 km
"1088.7854"
127.0.0.1:6379> geodist china:city 重庆 北京 km
"1491.6716"

georadius

# 语法
georadius key longitude latitude radius m|km|ft|mi [withcoord][withdist]
[withhash][asc|desc][count count]
# 以给定的经纬度为中心, 找出某一半径内的元素

测试:重新连接 redis-cli,增加参数 --raw ,可以强制输出中文,不然会乱码

[root@kuangshen bin]# redis-cli --raw -p 6379
# 在 china:city 中寻找坐标 100 30 半径为 1000km 的城市
127.0.0.1:6379> georadius china:city 100 30 1000 km
重庆
西安
# withdist 返回位置名称和中心距离
127.0.0.1:6379> georadius china:city 100 30 1000 km withdist
重庆
635.2850
西安
963.3171
# withcoord 返回位置名称和经纬度
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord
重庆
106.54000014066696167
29.39999880018641676
西安
108.92999857664108276
34.23000121926852302
# withdist withcoord 返回位置名称 距离 和经纬度 count 限定寻找个数
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord withdist count
1
重庆
635.2850
106.54000014066696167
29.39999880018641676
127.0.0.1:6379> georadius china:city 100 30 1000 km withcoord withdist count
2
重庆
635.2850
106.54000014066696167
29.39999880018641676
西安
963.3171
108.92999857664108276
34.23000121926852302

georadiusbymember

# 语法
georadiusbymember key member radius m|km|ft|mi [withcoord][withdist]
[withhash][asc|desc][count count]
# 找出位于指定范围内的元素,中心点是由给定的位置元素决定

127.0.0.1:6379> GEORADIUSBYMEMBER china:city 北京 1000 km
北京
西安
127.0.0.1:6379> GEORADIUSBYMEMBER china:city 上海 400 km
杭州
上海

geohash

# 语法
geohash key member [member...]
# Redis使用geohash将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似
表示距离越近。

127.0.0.1:6379> geohash china:city 北京 重庆
wx4sucu47r0
wm5z22h53v0
127.0.0.1:6379> geohash china:city 北京 上海
wx4sucu47r0
wtw6sk5n300

zrem

GEO没有提供删除成员的命令,但是因为GEO的底层实现是zset,所以可以借用zrem命令实现对地理位 置信息的删除.

127.0.0.1:6379> geoadd china:city 116.23 40.22 beijin
1
127.0.0.1:6379> zrange china:city 0 -1 # 查看全部的元素
重庆
西安
深圳
武汉
杭州
上海
beijin
北京
127.0.0.1:6379> zrem china:city beijin # 移除元素
1
127.0.0.1:6379> zrem china:city 北京 # 移除元素
1
127.0.0.1:6379> zrange china:city 0 -1
重庆
西安
深圳
武汉
杭州
上海

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序三两行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值