Redis常见的数据类型命令
文章目录
- Redis 常见的数据类型及命令
- 一、常见的NoSQL
- 二、Redis 简介
- 三、key 键的一些操作命令
- 四、Redis的五种基本数据结构
- 1、String(字符串)
- 介绍
- 常用命令
- 1.1 set/get
- 1.2 append
- 1.3 strlen
- 1.4 setex
- 1.5 mset/mget
- 1.6 setrange/getrange
- 1.7 setnx
- 1.8 incr/decr
- 1.9 incrby/decrby
- 1.10 getset
- 应用场景
- 2、List(列表)
- 介绍
- 常用命令
- 2.1 lpush/rpush
- 2.2 lrange
- 2.3 lpop/rpop
- 2.4 lindex
- 2.5 llen
- 2.6 lrem
- 2.7 lset
- 2.8 linsert
- 应用场景
- 3、Set(集合)
- 介绍
- 常用命令
- 3.1 sadd
- 3.2 smembers
- 3.3 sismember
- 3.4 scard
- 3.5 srem
- 3.6 spop
- 3.7 srandmember
- 3.8 smove
- 3.9 sinter
- 3.10 sunion
- 3.11 sdiff
- 应用场景
- 4、Hash(哈希)
- 介绍
- 常用命令
- 4.1 hset/hget
- 4.2 hmset/hmget
- 4.3 hexists
- 4.4 hkeys
- 4.5 hincrby
- 4.6 hdel
- 4.7 hsetnx
- 应用场景
- 5、Zset(有序集合)
- 介绍
- 常用命令
- 5.1 zadd
- 5.2 zrange
- 5.3 zrangebyscore
- 5.4 zrem
- 5.5 zincrby
- 5.6 zcount
- 5.7 zrank
- 应用场景
- 五、Redis的三种特殊数据结构
- 1、Bitmaps
- 介绍
- 常用命令
- 应用场景
- 2、Geospatial
- 介绍
- 常用命令
- 应用场景
- 3、Hyperloglog
- 介绍
- 常用命令
- 应用场景
Redis 常见的数据类型及命令
一、常见的NoSQL
NoSQL(Not Only SQL ),即“不仅仅是SQL”,泛指非关系型的数据库,主要针对的是键值、文档以及图形类型数据存储。并且,NoSQL 数据库天生支持分布式,数据冗余和数据分片等特性,旨在提供可扩展的高可用高性能数据存储解决方案。
1、KV型NoSQL(Redis)
键值数据库是一种较简单的数据库,其中每个项目都包含键和值。这是极为灵活的 NoSQL 数据库类型,因为应用可以完全控制 value 字段中存储的内容,没有任何限制。Redis 和 DynanoDB 是两款非常流行的键值数据库
- 数据基于内存,读写效率高
- KV型数据,时间复杂度为O(1),查询速度快
2、列式NoSQL(HBase)
按照列进行数据存储,该类型便于存储结构化和半结构化的数据,可以方便做数据压缩和针对某一列或者某几列的数据查询。 HBase 和 Cassandra 是两款非常流行的宽列存储数据库
3、文档型NoSQL(MongDB)
文档型NoSql指的是将半结构化数据存储为文档的一种NoSql,文档型NoSql通常以 JSON 或者 XML 格式存储数据。MongoDB 就是一款非常流行的文档数据库
4、搜索性NoSQL(ElasticSearch)
搜索型NoSql的诞生正是为了解决关系型数据库全文搜索能力较弱的问题,ElasticSearch 是搜索型 NoSql 的代表产品。ES的全文搜索特性使它成为构建搜索引擎的利器。除此之外,ES很好的支持了复杂聚合查询这一特点还使得ES非常适合拿来作数据分析使用
严格的说,ES 不是一个数据库,而是一个搜索引擎,ES的方方面面也都是围绕搜索设计的
关系型数据库(SQL)和非关系型数据库(NoSQL)的区别:
1)关系型数据库(SQL数据库):关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织
优点:
- 易于维护:都是使用表结构,格式一致;
- 使用方便:SQL 语言通用,可用于复杂查询;
- 复杂操作:支持 SQL,可用于一个表以及多个表之间非常复杂的查询。
缺点:
- 读写性能比较差,尤其是海量数据的高效率读写;
- 固定的表结构,灵活度稍欠;
2)非关系型数据库(NoSQL数据库)
优点:
- 格式灵活:存储数据的格式可以是 key-value 形式、文档形式、图片形式等等,使用灵活,应用场景广泛,而关系型数据库则只支持基础类型。
- 速度快:NoSQL 可以使用硬盘或者随机存储器作为载体,而关系型数据库只能使用硬盘;
- 高扩展性;
- 成本低:NoSQL 数据库部署简单,基本都是开源软件。
缺点:
- 不提供 SQL 支持,学习和使用成本较高;
- 无事务处理;
- 数据结构相对复杂,复杂查询方面稍欠。
二、Redis 简介
Redis 是一个基于 C 语言开发的开源数据库(BSD 许可)。与传统数据库不同的是 Redis 的数据是存在内存中的(内存数据库),读写速度非常快,被广泛应用于缓存方向。并且,Redis 存储的是 KV 键值对数据。它的特点如下:
- 基于内存运行,性能高效
- 支持分布式,理论上可以无限扩展
- key-value 存储系统
- 开源的使用 ANSIC 语言编写、遵守 BSD 协议、支持网络、可基于内存亦可持久化的日志型、KeyValue数据库,并提供多种语言的API
Redis 默认支持16个数据库,可以通过调整Redis的配置文件 redis/redis.conf 中的 databases 来修改这一个值,设置完毕后重启Redis便完成配置。
Redis 的默认端口号是 6379
可以通过 select 命令来切换数据库,例如:select 1;select 0;
三、key 键的一些操作命令
1、keys 查看当前库所有key
1)命令:keys
2)作用:查看当前库中所有的 key。
3)语法:keys *
有3个通配符:*,?,[]
- *:通配任意多个字符
- ?:通配单个字符
- []:通配括号内的某1个字符
> keys *
> keys ?ame
name
> keys [a,g,e]ge
ege
age
2、exists 查看key是否存在
1)命令:exists
2)作用:判断某个 key 是否存在,返回1表示存在,0不存在。当后面跟多个 key 时,只返回存在的个数,但不返回哪一个存在/不存在。
3)语法:exists key [key …]
> exists name
1
#id name age存在,a不存在
> exists id name age a
3
注意:关键字(exists等)都可以通过tab键来补全,而且命令行或者第三方工具都会有命令语法提示。
3、type 查看key的类型
1)命令:type
2)作用:查看当前 key 所储存的值的类型。返回当前 key 所储存的值的类型,如string 、list等。
3)语法:type key
> type name
string
4、del 删除已存在的key
1)命令:del
2)作用:删除已存在的key,不存在的 key 会被忽略。当后面跟多个 key 时,则返回删除成功的个数。
3)语法:del key [key …]
> del ege
1
#删除不存在的key
> del kkkkkk
0
> del v1 v2 v3
3
5、expire 设置 key 的过期时间
1)命令:expire
2)作用:给 key 设置过期时间,单位为秒。设置成功返回 1 。 当 key 不存在返回 0。
3)语法:expire key seconds
> expire id 300
(integer) 1
#查看剩余时间
> ttl id
(integer) 298
#当设置已经有过期时间的key时,会覆盖原来的过期时间
> expire id 600
(integer) 1
> ttl id
(integer) 597
当设置已经有过期时间的 key 时,会覆盖原来的过期时间。
6、ttl 查看key的剩余过期时间
1)命令:ttl
2)作用:以秒为单位返回 key 的剩余过期时间。当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。
3)语法:ttl key
> ttl id
-1
> ttl ids
-2
7、persist 移除key的过期时间
1)命令:persist
2)作用:移除给定 key 的过期时间,使得 key 永不过期。当过期时间移除成功时,返回 1 。 如果 key 不存在或 key 没有设置过期时间,返回 0 。
3)语法:expire key
> persist id
0
四、Redis的五种基本数据结构
1、String(字符串)
介绍
String 是 Redis 最基本的类型,一个 key 对应一个 value。String 是二进制安全的,意味着 String 可以包含任何数据,比如序列化对象或者一张图片。String 最多可以放 512M 的数据(但是大字符串非常不建议)。
常用命令
1.1 set/get
1)命令:
- set
- get
2)作用:
- 用于设置给定 key 的值。如果 key 已经存储其他值, set 就重写旧值,且无视类型。
- 用于获取指定 key 的值。如果 key 不存在,返回 nil 。
3)语法:
- set key value
- get key
> get name
"zhangsan"
> set name xiaobai
OK
> get name
"xiaobai"
> get namem
(nil)
1.2 append
1)命令:append
2)作用:将给定的 value 追加到 key 原值末尾,并返回 key 的长度
3)语法:append key value
> append name hello
12
> get name
xiaobaihello
注意:
- 如果 key 已经存在并且是一个字符串, append 命令将 value 追加到 key 原来的值的末尾。
- 如果 key 不存在, append 就简单地将给定 key 设为 value ,就像执行 set key value 一样。
1.3 strlen
1)命令:strlen
2)作用:获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。
3)语法:strlen key
> strlen name
12
#list1为list类型
> strlen list1
WRONGTYPE Operation against a key holding the wrong kind of value
1.4 setex
1)命令:setex
2)作用:给指定的 key 设置 value 值及秒级的过期时间。如果 key 已经存在, setex 命令将会替换旧的值,并设置过期时间。
3)语法:setex key seconds value
> setex num 300 v1
OK
> get num
v1
> ttl num
231
> setex num 300 v2
OK
> ttl num
296
> get num
v2
setex 和 expire 的区别在于,前者是在创建的 key 时设置过期时间,后者则是设置已经存在的 key。
1.5 mset/mget
1)命令:
- mset
- mget
2)作用:
- 同时设置一个或多个 key-value 。
- 返回所有(一个或多个)给定 key 的值。
3)语法:
- mset key value [key value …]
- mget key [key …]
> mset v1 123 v2 456 v3 789
OK
> mget v1 v3 v2
123
789
456
1.6 setrange/getrange
1)命令:
- setrange
- getrange
2)作用:
- 设置指定区间范围内的值,从 offset 位置开始依次往后设置(包含offset位置),返回字符串的长度
- 获取指定区间范围内的值,从 start 位置到 end 位置(包含两端)
3)语法:
- setrange key offset value
- getrange key start end
> set data abcdefg
OK
> setrange data 2 xxx
7
> get data
abxxxfg
> getrange data 2 5
xxxf
#end超过字符串的长度,即超过下标
> getrange data 2 9
xxxfg
注意:
- setrange 命令也可以直接创建 key 和 value。
- getrange 的 end 可以超过字符串长度,超过则为查看 offset 位置到字符串的末尾。
1.7 setnx
1)命令:setnx
2)作用:只有在 key 不存在时设置 key 的 value 值。成功则返回1,key 存在则返回 0。
3)语法:setnx key value
> setnx data a
(integer) 0
> setnx v5 123
(integer) 1
1.8 incr/decr
1)命令:
- incr
- decr
2)作用:
- 将 key 中储存的数字值增一,并返回 key 增一后的值
- 将 key 中储存的数字值减一,并返回 key 减一后的值
3)语法:
- incr key
- decr 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
1.9 incrby/decrby
1)命令:
- incrby
- decrby
2)作用:
- 将 key 存储的数字值按照 increment 进行增加,并返回增加后的值。
- 将 key 存储的数字值按照 decrement 进行减小,并返回减小后的值。
3)语法:
- incrby key increment
- decrby 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
1.10 getset
1)命令:getset
2)作用:将给定 key 值设为 value,并返回 key 的旧值(old value),即先 get 然后立即 set
3)语法:getset key value
注意:
- 当 key 不存在时,getset 等同于 set;当 key 存在时,getset 等同于重命名
- getset 重命名与 get 重命名的区别在于,前者会返回旧值,而后者不会
> exists v1
0
> getset v1 123
null
> get v1
123
> getset v1 456
123
> get v1
456
应用场景
- 计数器:例如统计网站的访问量等
- 分布式锁
- 需要存储常规数据的场景:session、token、图片地址、序列化后的对象等
2、List(列表)
介绍
List 是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。底层是一个双向链表,对两端操作性能极高,通过索引操作中间的节点性能较差。
一个List最多可以包含 2^32 - 1个元素 ( 每个列表超过40亿个元素)。
常用命令
2.1 lpush/rpush
1)命令:
- lpush
- rpush
2)作用:
- 从左边(头部)插入一个或多个值,并返回列表的长度
- 从右边(尾部)插入一个或多个值,并返回列表的长度
3)语法:
- lpush key value [value …]
- rpush key value [value …]
> lpush data v1 v2 v3
3
> lrange data 0 -1
v3
v2
v1
> rpush data v4 v5 v6
6
> lrange data 0 -1
v3
v2
v1
v4
v5
v6
上述的插入元素的过程具体如下图示(下面涉及到 data 列表的都可以参考这张图):
2.2 lrange
1)命令:lrange
2)作用:返回 key 列表中的 start 和 end 之间的元素(包含 start 和 end)。 其中 0 表示列表的第一个元素,-1表示最后一个元素。
3)语法:lrange key start end
注意:end 值是可以超过列表的长度的,即为查询从 start 位置开始到列表末尾的值。
> lrange data 1 3
v2
v1
v4
> lrange data 4 10
v5
v6
2.3 lpop/rpop
1)命令:
- lpop
- rpop
2)作用:
- 从列表中移除第一个值,并返回移除的值
- 从列表中移除最后一个值,并返回移除的值
3)语法:
- lpop key
- rpop key
注意:当列表中的元素全部被移除完,这个列表也就不存在了(值在键在,值光键亡)。
> lpop data
v3
> lpop data
v2
> rpop data
v6
> rpop data
v5
> rpop data
v4
> rpop data
v1
> exists data
0
2.4 lindex
1)命令:lindex
2)作用:获取列表 index 位置的值(从左边开始)。
3)语法:lindex key 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
2.5 llen
1)命令:llen
2)作用:获取列表长度,不存在的 key 会返回 0。
3)语法:llen key
> llen data
6
# l 不存在
> llen l
0
2.6 lrem
1)命令:lrem
2)作用:从左边开始删除与 value 相同的 count 个元素,并返回成功删除的个数。
3)语法:lrem key count value
> lrem data 2 v1
1
> lrange data 0 -1
v3
v2
v4
v5
v6
> lrem data 2 v
0
2.7 lset
1)命令:lset
2)作用:将索引为 index 的值设置为 value,若 index 超过列表长度则会报错。
3)语法:lset key index value
> 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
2.8 linsert
1)命令:linsert
2)作用:在列表中 value 值的 前边/后边 插入一个 new value 值(从左开始),并返回列表的长度
3)语法:
- linsert key before value newvalue
- linsert key after value newvalue
> 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
应用场景
- 消息队列
- 信息流展示:如最新列表、关注的人列表、粉丝列表、排行榜等等
3、Set(集合)
介绍
Redis 中的 Set 类型是一种无序集合,集合中的元素没有先后顺序但都唯一,当需要存储一个列表数据,又不希望出现重复数据时,Set 是一个很好的选择。Set 是 String 类型的无序集合,它底层其实是一个 value 为 null 的 hash 表,所以添加、删除、查找的时间复杂度都是 O(1)。
常用命令
3.1 sadd
1)命令:sadd
2)作用:将一个或多个元素添加到集合 key 中,已经存在的元素将被忽略,并返回实际插入的个数。
3)语法:sadd key member [member …]
> sadd data v1 v2 v2 v3 v4 v5 v5 v6
6
> sadd data v7
1
> smembers data
v7
v6
v3
v4
v1
v5
v2
3.2 smembers
1)命令:smembers
2)作用:获取该集合的所有元素。
3)语法:smembers key
3.3 sismember
1)命令:sismembers
2)作用:判断集合 key 中是否含有 member 元素,如有返回1,否则返回0。
3)语法:sismember key member
> sismember data v4
1
> sismember data v9
0
3.4 scard
1)命令:scard
2)作用:返回该集合的元素个数。
3)语法:scard key
> scard data
7
> scard data1
0
3.5 srem
1)命令:srem
2)作用:删除集合中的一个或多个成员元素,不存在的成员元素会被忽略,并返回成功删除的个数
3)语法:srem key member [member …]
#v8 v9不存在
> srem data v5 v7 v8 v9
2
3.6 spop
1)命令:spop
2)作用:随机删除集合中一个元素并返回该元素。
3)语法:spop key
> spop data
v4 #删除的元素为v4
3.7 srandmember
1)命令:srandmember
2)作用:随机获取集合中 count 个元素,但不会删除。
3)语法:srandmember key [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
3.8 smove
1)命令:smove
2)作用:将 member 元素从 source 集合移动到 destination 集合中,成功移动返回1,否则返回0
3)语法:smove source destination member
注意:
- destination 集合可以不存在。
- 如果 source 集合不存在或不包含指定的 member 元素,则 smove 命令不执行任何操作,仅返回0 。
> smove data data2 v3
1
> smembers data2
v3
> smove data data2 v9
0
> smembers data
v6
v1
v2
3.9 sinter
1)命令:sinter
2)作用:返回两个集合的交集元素。
3)语法:sinter key [key …]
> 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
3.10 sunion
1)命令:sunion
2)作用:返回两个集合的并集元素。
3)语法:sunion key [key …]
> sunion data1
v6
v4
v5
v2
v1
#并集
> sunion data1 data2
v6
v4
v9
v8
v1
v5
v2
v0
3.11 sdiff
1)命令:sdiff
2)作用:返回两个集合的差集元素(要求:在前者集合中的元素,后者集合没有的元素)
3)语法:sdiff key [key …]
> sdiff data1
v6
v4
v5
v2
v1
> sdiff data1 data2
v5
v1
v2
应用场景
- 需要存放的数据不能重复的场景:例如文章点赞、动态点赞,签到打卡等
- 需要获取多个数据源交集、并集、差集的场景:例如共同好友、共同粉丝、关注的人等
- 需要随机获取数据源中的元素的场景:例如抽奖系统、随机等
4、Hash(哈希)
介绍
Hash是一个键值对的集合。Hash 是一个 String 类型的 field(字段) 和 value(值) 的映射表,hash特别适合用于存储对象。可以当做 Java 中的 Map<String, String> 对待。每一个 hash 可以存储 2^32-1 个键值对。
常用命令
4.1 hset/hget
1)命令:
- hset
- hget
2)作用:
- 给 key 集合中的 field 赋值 value,并返回成功设置的 field 个数
- 返回 key 哈希中取出 field 字段的值。
3)语法:
- hset key field value [field value …]
- hget key field
注意:
- 如果哈希表不存在,一个新的哈希表被创建并进行 HSET 操作。
- 如果字段已经存在于哈希表中,旧值将被重写。
> hset data id 9 name xiaobai age 22 sex nan
4
> hset data email 123@.com
1
> hget data name
xiaobai
4.2 hmset/hmget
1)命令:
- hmset
- hmget
2)作用:
- 批量设置 key 中 field 字段的值
- 批量获取 key 中 field 字段的值
3)语法:
- hmset key field value [field value …]
- hmget key field [field …]
> hmget data id name age
9
xiaobai
22
4.3 hexists
1)命令:hexists
2)作用:判断指定 key 中是否存在 field,存在则返回 1,不存在则返回 0
3)语法:
> hexists data id
(integer) 1
> hexists data ids
(integer) 0
4.4 hkeys
1)命令:hkeys
2)作用:获取该哈希 key 中所有的 field
3)语法:hkeys key
> hkeys data
id
name
age
sex
email
4.5 hincrby
1)命令:hincrby
2)作用:为哈希表 key 中的 field 字段的值加上增量 increment,并返回操作后的值
3)语法: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
4.6 hdel
1)命令:hdel
2)作用:删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略,并返回成功删除的个数
3)语法: hdel key field [field …]
> hdel data2 age age2 age3
2
4.7 hsetnx
1)命令:hsetnx
2)作用:给key哈希表中不存在的的字段赋值 (即不覆盖原来的值),设置成功返回 1,设置失败返回 0
3)语法: hsetnx key field value
#data中存在id字段
> hsetnx data id 99
0
> hset data ids 99
1
应用场景
- 存储对象信息:例如购物车中的商品信息
- 存储表的信息
5、Zset(有序集合)
介绍
Zset与Set非常相似,是一个没有重复元素的String集合。不同之处是Zset的每个元素都关联了一个分数(score),这个分数被用来按照从低分到高分的方式排序集合中的元素。集合的元素是唯一的,但分数可以重复。
因为元素是有序的,所以可以根据分数(score)或者次序(position)来获取一个范围内的元素。
常用命令
5.1 zadd
1)命令:zadd
2)作用:将一个或多个元素(member)及分数(score)加入到有序集 key 中
3)语法:zadd key score member [score member …]
注意:
- 如果某个元素已经是有序集的元素,那么更新这个元素的分数值,并通过重新插入这个元素,来保证该元素在正确的位置上。
- 分数值可以是整数值或双精度浮点数。
- 如果有序集合 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
5.2 zrange
1)命令:zrange
2)作用:返回 key 集合中的索引 start 和索引 end 之间的元素(包含 start 和 end)
3)语法:zrange key start end [withscores]
注意:
- 其中元素的位置按分数值递增(从小到大)来排序。 其中 0 表示列表的第一个元素,-1表示最后一个元素。
- withscores 是可选参数,是否返回分数。
> zrange data 0 1
java
python
> zrange data 0 1 withscores
java
100
python
300
5.3 zrangebyscore
1)命令:zrangebyscore
2)作用:返回key集合中的分数minscore 和分数maxscore 之间的元素(包含minscore 和maxscore )。其中元素的位置按分数值递增(从小到大)来排序。
3)语法: zrangebyscore key minscore maxscore [withscores]
> zrangebyscore data 300 500 withscores
python
300
c++
500
5.4 zrem
1)命令:zrem
2)作用:删除 key 集合下的 member 元素,并返回成功删除的个数
3)语法:zrem key member [member …]
> zrem data php
1
5.5 zincrby
1)命令:zincrby
2)作用:为元素 member 的 score 加上 increment 的值,并返回处理后的值
3)语法: zincrby key increment member
> zincrby data 100 java
200
> zincrby data -100 c++
400
5.6 zcount
1)命令:zcount
2)作用:统计该集合在minscore 到maxscore分数区间中元素的个数
3)语法: zcount key minscore maxscore
> zcount data 100 300
2
5.7 zrank
1)命令:zrank
2)作用:返回 member 元素在集合中的排名,从 0 开始。没有该元素则返回 null
3)语法: zrank key member
> zrank data java
0
> zrank data java1
null
应用场景
- 需要根据某个权重进行排序的场景:例如微信步数排行榜、直播间送礼物排行榜、游戏中的段位排行榜
- 需要存储的数据有优先级或重要程度的场景:例如优先级任务队列
五、Redis的三种特殊数据结构
1、Bitmaps
介绍
Bitmap 存储的是连续的二进制数字(0 和 1),通过 Bitmap, 只需要一个 bit 位来表示某个元素对应的值或者状态,key 就是对应元素本身 8 个 bit 可以组成一个 byte,所以 Bitmap 本身会极大的节省储存空间。可以将 Bitmap 看作是一个存储二进制数字(0 和 1)的数组,数组中每个元素的下标叫做 offset(偏移量)。
常用命令
命令 | 语法 | 作用 |
---|---|---|
setbit | setbit key offset value | 设置Bitmaps中某个偏移量的值。 |
getbit | getbit key offset | 获取Bitmaps中某个偏移量的值 |
bitcount | bitcount key [start end] | 统计字符串被设置为1的bit数量 |
bitop | bitop operation destkey key [key …] | 对一个或多个 Bitmap 进行运算,可用运算符有 AND, OR, XOR 以及 NOT |
应用场景
- 需要保存状态信息的场景:例如打卡天数、活跃用户情况、统计用户是否在线、登录天数等
2、Geospatial
介绍
GEO,地理信息的缩写。该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度 Hash 等常见操作。
常用命令
命令 | 语法 | 作用 |
---|---|---|
geoadd | geoadd key longitude latitude member [longitude latitude member …] | 用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。 |
geopos | geopos key member [member ……] | 从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。 |
geodist | geodist key member1 member2 [m|km|ft|mi] | 用于返回两个给定位置之间的距离。m :米,默认单位。km :千米。mi :英里。ft :英尺。 |
georadius | georadius key longitude latitude radius m|km|ft|mi | 以给定的经纬度(longitude latitude)为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离(radius )的所有位置元素。 |
应用场景
- 需要管理使用地理空间数据的场景:附近的好友、两地之间的距离、附近的商场等
3、Hyperloglog
介绍
HyperLogLog 是一种有名的基数计数概率算法 ,基于 LogLog Counting(LLC) 优化改进得来,并不是 Redis 特有的,Redis 只是实现了这个算法并提供了一些开箱即用的 API。
Redis 提供的 HyperLogLog 占用空间非常非常小,只需要 12k 的空间就能存储接近 2 * 64 个不同元素。并且,Redis 对 HyperLogLog 的存储结构做了优化,采用两种方式计数:
- 稀疏矩阵 :计数较少的时候,占用空间很小。
- 稠密矩阵 :计数达到某个阈值的时候,占用 12k 的空间。
常用命令
命令 | 语法 | 作用 |
---|---|---|
pfadd | pfadd key element [element] | 将所有元素参数添加到 Hyperloglog 数据结构中。如果内部有变动返回1,没有返回0 |
pfcount | pfcount key [key] | 计算Hyperloglog 近似基数,可以计算多个Hyperloglog ,统计基数总数。 |
pfmerge | pfmerge destkey sourcekey [sourcekey …] | 将一个或多个Hyperloglog(sourcekey) 合并成一个Hyperloglog (destkey ) |
应用场景
- 数据量巨大(百万、千万级别以上)的计数场景:例如热门网站每日/每周/每月访问 ip 数统计
- 基数统计
相关文章:
Redis常见的数据类型命令
文章目录Redis 常见的数据类型及命令一、常见的NoSQL二、Redis 简介三、key 键的一些操作命令四、Redis的五种基本数据结构1、String(字符串)介绍常用命令1.1 set/get1.2 append1.3 strlen1.4 setex1.5 mset/mget1.6 setrange/getrange1.7 setnx1.8 incr…...
Python3+Selenium3自动化测试-(准备)
最近在学习selenium自动化测试相关的内容,所以将实际准备情况做一记录, # 系统:win10(64位) # 浏览器:Chrome(67.0)、Firefox(61.0)、IE # python版本:3.6.5 # Selenium:3.13.0Selenium简介 Selenium是一…...
VUE的安装和创建
安装node.js 进入node官网进行下载,然后一直下一步。 测试是否安装成功: 命令提示窗下执行:npm -v 若出现版本号,则安装成功。 安装npm源: npm config set registry http://registry.npm.taobao.org 查看:…...
ETL工具(kettle) 与 ETL产品(BeeloadBeeDI) 差之毫厘,谬以千里
E T L——是英文Extract-Transform-Load的缩写,用来描述将数据从来源端经过抽取(extract)、转换(transform)、加载(load)至目的端的过程。工具——原指工作时所需用的器具,后引申为达…...
轻松入门H3C无线AC上线AP【入门篇】
我们知道华三的最新模拟器支持了无线AC的配置,今天就浅浅的出个无线AC的教程,你上也会的那种。今天我们模拟的是二层环境下,笔者准备了2个AP,以此展示AP上线到AC的教程,并且用手机测试WiFi连接正常,且客户端…...
尚医通(二十五)就医提醒和预约统计
目录一、就医提醒1、搭建定时任务模块二、后台管理系统-预约统计功能1、开发每天预约数据接口2、封装远程调用接口3、搭建统计分析模块4、整合统计功能前端一、就医提醒 我们通过定时任务,每天8点执行,提醒就诊 1、搭建定时任务模块 (1&…...
网页js版音频数字信号处理:H5录音+特定频率信号的特征分析和识别提取
文章目录一、网页中的音频数据源二、FFT:时域转频域三、信号的特征分析四、信号的识别提取附录音频数字信号处理 Audio DSP (Digital Signal Processing) 是一个复杂又专业的话题,本文介绍的是如何从音频中实时分析和识别出特定频率信号的一种方法&#…...
uniapp结合腾讯云及时通信IM的聊天记录本地存储方案
uniapp结合腾讯云及时通信IM的聊天记录本地存储方案 UniApp 是一个跨平台的应用开发框架,可以使用 Vue.js 开发多端应用(如H5、小程序、App等)。在 UniApp 中,可以使用 uni-app 提供的文件系统 API 完成本地文件存储的操作。 1.…...
PyQGIS开发 -- 基础学习笔记
1、自主学习QGIS开发虽然QGIS本身功能强大,但还是架不住我们要编写新的功能、新的业务流程、新的算法。前文中我们提到,扩展QGIS有2种方法,一是用Python、C来写QGIS的插件;另一种就是基于QGIS的C API开发独立应用程序。然而后者资…...
一篇了解模块打包工具之 ——webpack(1)
本篇采用问题引导的方式来学习webpack,借此梳理一下自己对webpack的理解,将所有的知识点连成一条线,形成对webpack的记忆导图。 最终目标,手动构建一个vue项目,目录结构参考vue-cli创建出来的项目 一、问问题 1. 第…...
k8s学习之路 | Day16 k8s 中的容器初探
文章目录容器镜像镜像名称镜像拉取策略私有仓库的拉取策略容器的环境变量和启动命令容器的环境变量容器的启动命令容器的生命周期钩子postStartpreStop容器的探针startupProbelivenessProbereadinessProbek8s 集群中最小的管理单元就是一个Pod,而Pod里面才是容器&am…...
export、import、commit、save、load的区别
目录1. docker export 和 docker import2. docker commit3.docker save 和 docker load1. docker export 和 docker import docker export 容器ID/容器Name > xxx.tar 导出一个容器快照 docker import xxx.tar NewImageName:tag 导入一个容器快照到本地镜像库 适用场景&a…...
多部委联合举办中国人工智能大赛启动会在厦召开,快商通亮相发言
站在“第二个百年奋斗目标”的新起点上,为深入推动我国人工智能产业创新发展,发掘一批人工智能优秀团队, 国家互联网信息办公室、工业和信息化部、公安部、国家广播电视总局、厦门市人民政府将联合主办第四届中国人工智能大赛 。快商通联合创…...
js红宝书学习笔记(1-6章)
就按照原书中写的章节顺序记笔记了, 还有可能我学过js一段时间了,可能有些对于新手的细节会忽略,但是会尽量写全的~ 1.第一章 什么是JavaScript 1.1讲了一些历史,所以我们从1.2开始看 1.2 JavaScript的实现 完整的JaveScript包…...
第十四届蓝桥杯第三期官方模拟赛C\C++题解
文章目录A-填空题题意算法参考代码(C)B-填空题题意算法参考代码(C)C-填空题题意算法参考代码(C)D-填空题题意算法参考代码(C)E-填空题题意算法参考代码(C)F题…...
API接口安全
目前项目都是前后端分离或者有对外提供接口的需求,在这些情况下,就要考虑接口安全。 如果不重视接口安全,可能导致严重的危害,例如数据盗取,服务宕机等。 可能的安全问题: 1.明文密码被攻击者抓包看到 前端可对密码或…...
2023前端一面vue面试题合集
函数式组件优势和原理 函数组件的特点 函数式组件需要在声明组件是指定 functional:true不需要实例化,所以没有this,this通过render函数的第二个参数context来代替没有生命周期钩子函数,不能使用计算属性,watch不能通过$emit 对外暴露事件&…...
【Leetcode 剑指Offer】第 5 天 查找算法(中等)
查找算法剑指 Offer 04. 二维数组中的查找剑指 Offer 11. 旋转数组的最小数字剑指 Offer 50. 第一个只出现一次的字符Python字典基础哈希表(python中是dict())有序哈希表第一个中等,后两个简单题。剑指 Offer 04. 二维数组中的查找 题&#…...
薯条投放适合哪些笔记?小红书薯条投放的3种模式
随着小红书平台的种草推广模式兴盛,薯条投放这个词也渐渐进入大众的视野,今天就来给大家讲讲什么是薯条投放,以及薯条投放适合哪些笔记。一、什么是薯条投放?薯条是一款为小红书用户打造的笔记推广工具,用户可选择推广目标&#…...
记录第一个Python练习的过程
题目如下 编写一个名为collatz()的函数,它有一个名为number的参数。如果参数是偶数,那么collatz()就打印出number // 2,并返回该值。如果number是奇数,collatz()就打印并返回3 * number 1。 然后编写一个程序,让用户…...
【Python】3.3实现多线程
程序Program进程Process线程Thread为完成特定任务而用计算机语言编写的一组计算机能识别和执行的指令的集合。程序是指令、数据及其组织形式的描述,一段静态代码,静态对象。计算机中的程序关于某数据集合上的一次执行过程。进程是程序的实体,…...
在linux中使用lftp和sftp下载文件(夹)
一、首先确保你的系统中已经下载了lftp和sftp。 1.安装lftp sudo apt install lftp sudo apt install screen 2.安装sftp 在Linux系统中,一般RedHat系统默认已经安装了openssh-client和openssh-server,即默认已经集成了sftp服务,不需要重…...
Docker简介与用法
文章目录1、Docker简介1.1、Docker能解决什么问题1.2、什么是虚拟机技术1.2.1、虚拟机的缺点1.3、什么是容器1.3.1、容器与虚拟机比较1.4、分析 Docker 容器架构1.4.1、Docker客户端和服务器1.4.2、Docker 镜像(Image)1.4.3、Docker 容器(Container)1.4.4、Docker 仓库(reposit…...
基于海鸥算法改进的DELM分类-附代码
海鸥算法改进的深度极限学习机DELM的分类 文章目录海鸥算法改进的深度极限学习机DELM的分类1.ELM原理2.深度极限学习机(DELM)原理3.海鸥算法4.海鸥算法改进DELM5.实验结果6.参考文献7.Matlab代码1.ELM原理 ELM基础原理请参考:https://blog.c…...
linux基本功系列之mount命令实战
文章目录前言一. mount命令的介绍二. 语法格式及常用选项三. 参考案例3.1 将iso镜像挂载到/mnt上3.2 把某个分区挂载到/sdb1上3.3 用只读的形式把/dev/sdb2挂载到/sdb2上3.4 设置自动挂载总结前言 大家好,又见面了,我是沐风晓月,本文是专栏【…...
力扣Top100题之两数相加(Java解法)
0 题目描述 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数…...
【测试】Python手机自动化测试库uiautomator2和weditor的详细使用
1.说明 我们之前在电脑操作手机进行自动化测试,基本上都是通过Appium的,这个工具确实强大,搭配谷歌官方的UiAutomator基本上可以完成各种测试,但缺点也很明显,配置环境太麻烦了,需要jdk、sdk等,…...
《NFL橄榄球》:旧金山49人·橄榄1号位
旧金山四九人(San Francisco 49ers,又译旧金山淘金者) 是美国全国橄榄球联盟球队。成立于1946年,最初作为全美橄榄球联合会(AAFC)的一员参加比赛,后于1950年与克利夫兰布朗一同加入由美国橄榄球联合会合并而成的NFL。现任主教练为…...
spark为什么比hadoop快
网上一堆人根本对计算框架一知半解就出来糊弄人,常见解答有: spark是基于内存计算,所以快。这跟废话似的,mr计算的时候不也是基于内存? mr shuffle落盘。这也是胡扯, spark shuffle不落盘? 实际…...
跨境人都在用的指纹浏览器到底有什么魔力?三分钟带你了解透彻
什么是指纹浏览器?这是东哥近期收到最多的粉丝私信咨询,指纹两个字大家都很熟悉,指纹浏览器就变得陌生起来。之前东哥也跟大家分享过很多次指纹浏览器的用法,鉴于还是很多人不认识这个好用的工具,东哥今天就来详细给大…...
电子商务网站建设基础项目实训报告/吉林百度seo公司
0x00 概述 最近在看关于嵌入式Linux关于Boot的一些资料,准备了一些资料。现在在这里将最近学习到的一些知识做个总结。 这次的总结主要关于Boot的一些参数解析与相应的启动流程总结。 使用了飞凌科技的IMXQ6的开发板2016.06的BOOT适配板搭配的源码进行分析。 因为M…...
大众点评网怎么做团购网站/如何免费引流推广
13年蓝桥杯javaB组1. 煤球数目2.生日蜡烛3.凑算式4.分小组5.抽签6. 方格填数7. 剪邮票1. 煤球数目 有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成…...
上海做oocl船的公司网站/网络黄页推广软件
转载:https://www.jqhtml.com/11084.html既然已经有像 Scrapy 这样优秀的爬虫框架,为何还要造轮子呢?嗯,其实最主要的还是想要将学习到 Python 知识综合起来,提高一下自己。推荐下我自己创建的Python学习交流群9604104…...
做网站要学些什么/宣传方式有哪些
今天需要将测试系统迁移到生产系统,于是在生产库中创建相应用户基表空间后,将测试系统的数据通过exp/imp(数据量不大)迁移到生产库上。通过windows下自带的ftp服务器上传到unix服务器上后,通过imp showy查看导入的内容以降低出错的概率&#…...
盈利网站/免费建站免费网站
智力游戏 19十五益智游戏(2)这个游戏非常简单。首先,把数字分成三组,每组的和为0这里,分成(-4、-1、5)、(4、6、-10)、(3、-3)如果有多种分组方案…...
wordpress怎么添加音乐播放器/2023年5月疫情爆发
One option is have temp buffer start some known size then increase it if see it’s not enough with vsnprintf. Are there better approach? Thanks您可以使用vasprintf(),但这会进行不必要的堆分配 – 平均来说不太可能更快.使用alloca可以避免堆.或者,您可以直接写入返…...