Redis常见的数据类型命令

2023-05-16

文章目录

  • 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(偏移量)。

常用命令

命令语法作用
setbitsetbit key offset value设置Bitmaps中某个偏移量的值。
getbitgetbit key offset获取Bitmaps中某个偏移量的值
bitcountbitcount key [start end]统计字符串被设置为1的bit数量
bitopbitop operation destkey key [key …]对一个或多个 Bitmap 进行运算,可用运算符有 AND, OR, XOR 以及 NOT

应用场景

  • 需要保存状态信息的场景:例如打卡天数、活跃用户情况、统计用户是否在线、登录天数等

2、Geospatial

介绍

​ GEO,地理信息的缩写。该类型就是元素的二维坐标,在地图上就是经纬度。Redis基于该类型,提供了经纬度设置、查询、范围查询、距离查询、经纬度 Hash 等常见操作。

常用命令

命令语法作用
geoaddgeoadd key longitude latitude member [longitude latitude member …]用于存储指定的地理空间位置,可以将一个或多个经度(longitude)、纬度(latitude)、位置名称(member)添加到指定的 key 中。
geoposgeopos key member [member ……]从给定的 key 里返回所有指定名称(member)的位置(经度和纬度),不存在的返回 nil。
geodistgeodist key member1 member2 [m|km|ft|mi]用于返回两个给定位置之间的距离。m :米,默认单位。km :千米。mi :英里。ft :英尺。
georadiusgeoradius 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 的空间。

常用命令

命令语法作用
pfaddpfadd key element [element]将所有元素参数添加到 Hyperloglog 数据结构中。如果内部有变动返回1,没有返回0
pfcountpfcount key [key]计算Hyperloglog 近似基数,可以计算多个Hyperloglog ,统计基数总数。
pfmergepfmerge destkey sourcekey [sourcekey …]将一个或多个Hyperloglog(sourcekey) 合并成一个Hyperloglog (destkey )

应用场景

  • 数据量巨大(百万、千万级别以上)的计数场景:例如热门网站每日/每周/每月访问 ip 数统计
  • 基数统计
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redis常见的数据类型命令 的相关文章

  • js练习题(3)

    1 序列 xff1a 1 xff0c 2 xff0c 3 xff0c 5 xff0c 8 xff0c 13 找出第20个数是多少 得出前20个数之和是多少 xff1f span class token keyword function sp
  • JAVA 两数求商

    题目描述 xff1a 给定两个整数 a 和 b xff0c 求它们的除法的商 a b xff0c 要求不得使用乘号 除号 以及求余符号 注意 xff1a 整数除法的结果应当截去 xff08 truncate xff09 其小数部分 xff0
  • 约瑟夫环总结

    约瑟夫环 N个人围成一圈 xff0c 从第一个人开始报数 xff0c 报到m的人出圈 xff0c 剩下的人继续从1开始报数 xff0c 报到m的人出圈 xff0c 如此往复 问题一 xff1a 所有人都出圈 xff0c 求出圈的人的编号顺序
  • Linux操作系统实验:生产者和消费者问题

    一 实验目的及要求 生产者消费者 问题是一个著名的同时性编程问题的集合 通过编写经典的 生产者消费者 问题的实验 xff0c 读者可以进一步熟悉 Linux 中多线程编程 xff0c 并且掌握用信号量处理线程间的同步互斥问题 二 实验仪器设
  • COCO数据集解析

    1 简介 官方网站 xff1a http cocodataset org 全称 xff1a Microsoft Common Objects in Context xff08 MS COCO xff09 支持任务 xff1a Detecti
  • U盘启动盘cmd制作

    U盘 移动硬盘启动盘cmd手工制作 插入 gt 61 8G的u盘 移动硬盘 1 win 43 r打开运行窗口 xff0c 输入cmd回车打开命令行 xff08 命令提示符不分大小写 xff09 2 在DOS命令行窗口中输入 diskpart
  • 系统调用的概念和作用

    一 什么是系统调用 xff0c 有何作用 1 概念 用户接口 命令接口 允许用户直接使用 程序接口 允许用户通过程序间接使用 xff1a 由一组系统调用组成 系统调用 系统调用 是操作系统提供给应用程序 xff08 程序员 编程人员 xff
  • linux系统下键盘按键的重新映射——xmodmap工具和xev工具

    虽然linux下小键盘还是不能用 xff0c 但是找到一篇好文章 linux系统下键盘按键的重新映射 xmodmap工具和xev工具 文章目录 1 xev工具 xff1a 2 xmodmap工具 大家会不会有时候 xff0c 感觉键盘上的某
  • Sorry, you have been blocked(Chatgpt登录被屏蔽)

    解决办法 xff1a 关闭浏览器 xff0c 重新打开 vpn换个地区 xff0c 换个美国的vpn
  • Linux查看ip地址出错,ens33不显示inet解决

    在我的私人博客中也有写 xff0c 大家去看看哦 Linux 查看 ip 地址出错 xff0c ens33 不显示 inet 解决 白都 baidu2001 top 问题 xff1a 在 CentOS7中输入 ip addr 时 xff0c
  • Java多线程(超详解)

    目录 1 线程简介 1 1 程序 1 2 进程 1 3 线程 1 4 多线程 1 5 普通方法调用和多线程 2 线程创建 2 1 继承Thread类 2 2 实现Runnable接口 2 3 实现Callable接口 xff08 了解 xf
  • 学习Java的路线

    JavaSE 18 20天 xff09 数据库 xff08 4天 xff09 前端 xff08 7天 xff09 Javaweb xff08 7天 xff09 SSM框架 xff08 9天 xff09 Linux xff08 7天 xff0
  • Java常用类的使用方法小结

    文章目录 前言一 常用类有哪些 xff1f 二 常用类使用方法1 Object类0 xff09 所用的对象1 xff09 getClass方法2 xff09 hasCode方法3 xff09 toString方法4 xff09 equals
  • Java I/O流

    文章目录 前言一 什么是流 xff1f 二 流的分类1 根据流向来分1 xff09 输入流2 xff09 输出流 2 根据单位来分1 xff09 字节流2 xff09 字符流 3 根据功能来分1 xff09 节点流2 xff09 过滤流 三
  • Java 网络编程

    文章目录 前言一 什么是计算机网络 xff1f 二 网络通信的两个重要因素1 通讯双方的地址1 xff09 ip2 xff09 端口号 2 规则 xff1a 网络协议 三 Ip地址1 InetAddress2 Ip的分类1 xff09 ip
  • ScrumMaster的教练职责

    ScrumMaster是Scrum团队的敏捷教练 Ken Rubin说 xff0c 类似于运动团队的教练 xff0c ScrumMaster观察团队使用Scrum的过程 xff0c 帮助团队提高工作绩效 教练不是顾问 xff0c 不提供解决
  • Java多线程

    文章目录 前言一 多线程1 进程 xff0c 线程 xff0c 多线程2 继承Thread类1 xff09 同时下载多个网图通过继承Thread类 3 实现Runnable接口1 xff09 下载多个网图通过实现Runnable接口2 xf
  • MySQL数据库随笔

    提示 xff1a 本文章仅供个人学习使用 xff0c 如有错误请及时私信通知 文章目录 前言一 MySQL的基本操作命令 xff08 1 xff09 连接数据库 xff08 2 xff09 修改用户密码 xff08 3 xff09 刷新权限
  • mybiatis学习笔记

    mybiatis学习笔记参考于尚硅谷mybatis文档 96 提示 xff1a 这如果有错误的地方 xff0c 请联系博主已更正 xff0c 文章目录 mybiatis学习笔记参考于尚硅谷mybatis文档前言一 Mybatits的特性二
  • KVM 介绍及安装

    KVM 安装 KVM KVM 简介 KVM 全称是 Kernel based Virtual Machine 是 Linux 下 x86 硬件平台上的全功能虚拟化解决方案 xff0c 包含一个可加载的内核模块 kvm ko 提供和虚拟化核心

随机推荐

  • 接口(interface)

    目录 一 简介 二 接口的使用 使用interface来定义 在Java中 xff0c 接口和类是两个并列的结构 如何定义接口 xff1a 定义接口中的成员 JDK7以及以前 xff1a 只能定义全局常量和抽象方法 JDK8中 xff1a
  • FileReader && FileWriter && FileInputStream && FileOutputStream

    目录 一 读入数据的基本操作 将day09下的hello txt文件内容读入程序中 xff0c 并输出到控制台 1 步骤 xff1a 2 完整代码 3 异常的处理 xff1a 为了保证流资源一定可以执行关闭操作 xff0c 需要使用try
  • 多表的查询

    目录 一 为什么需要多表查询 xff1f x1f41f 查询一个员工名为 Abel 的人在哪个城市工作 xff1f 二 如何实现多表查询 1 出现笛卡尔积 xff08 交叉连接 xff09 的错误 错误的实现方式 错误的原因 2 多表查询的
  • MySQL数据类型

    目录 一 MySQL中的数据类型 常见数据类型的属性 关于属性 1 创建数据库时指明字符集 2 创建表的时候 xff0c 指明表的字符集 3 创建表 xff0c 指明表中的字段时 xff0c 可以指定字段的字符集 二 整数类型 xff08
  • 批量插入

    目录 一 批量插入数据 JDBC的批量处理语句的方法 二 高效的批量插入 1 举例 xff1a 向goods表中插入20000条数据 goods表的创建 方式一 xff1a 使用Statement 方式二 xff1a 使用PreparedS
  • Gateway新一代网关

    目录 一 概述 1 官网 2 介绍 3 作用 4 微服务架构中网关的位置 5 有Zuul了怎么又出来了gateway 我们为什么选择Gateway xff1f Zuul1 x模型 x1f41f Servlet的生命周期 gateway模型
  • android tensorflow文字识别身份证识别ocr文字识别商用源码

    一 xff0c 文字识别简介 计算机文字识别 xff0c 俗称光学字符识别 xff0c 英文全称是Optical Character Recognition 简称OCR xff0c 它是利用光学技术和计算机技术把印在或写在纸上的文字读取出来
  • idea报错:无法访问org.springframework.web.bind.annotation.RestController和程序包com.sun.org.slf4j.internal不存在

    目录 1 错误具体信息 报错日志 2 原因 3 修改过程 4 程序包com sun org slf4j internal不存在 o 解决 1 错误具体信息 报错日志 INFO INFO maven compiler plugin 3 10
  • Java基础 —— 编程入门

    一 比特 bit 和字节 byte 一个0或者一个1存储为一个比特 bit xff0c 是计算机中最小的存储单位 计算机中是最基本的存储单元是字节 byte 每个字节由8个比特构成 计算机就是一系列的电路开关 每个开关存在两种状态 关 of
  • JDK、JRE、JVM的关系

    参考文章 xff1a 面试官 xff1a JDK JRE JVM 三者什么关系 xff1f 腾讯云开发者社区 腾讯云 tencent com 一 什么是JDK JDK xff1a Java Development Kit的简称 xff0c
  • 问题解决:Mybatis-Plus自增主键超级大!

    1 先瞅瞅是不是自增主键没加注解 xff1f xff08 加了哇 xff0c 没问题哇 xff0c 怎么还那么大呢 xff09 2 奥对 xff0c 看看是不是包导错了 似乎也没问题 再添几条数据试试 xff0c id越来越大 突然想到 x
  • FTP匿名登录

    介绍 从一个服务到另一个服务的目标 凭据可能会丢失在可公开访问的文件夹中的某个位置 xff0c 这将允许我们通过一个远程shell登录 xff0c 该shell不受监控 配置错误的服务可能会泄露信息 xff0c 使我们能够模拟受害者的数字身
  • Unable to start ServletWebServerApplicationContext due to missing ServletWeb解决办法

    当在springboot启动项目的时候报这种错误 xff1a 仔细一看 xff0c 报错原因是因为缺少ServletWebServerFactory的bean 既然是跟Servlet有关 xff0c 那么很可能是在web层面出现了问题 那么
  • 数据库锁概述

    行锁和表锁 主要是针对锁粒度划分的 xff0c 一般分为行锁 表锁 库锁 行锁 xff1a 访问数据库的时候 xff0c 锁定整个行数据 xff0c 防止并发错误 表锁 xff1a 访问数据库的时候 xff0c 锁定整个表数据 xff0c
  • Spring 常用注解

    Spring 常用注解 64 Component xff08 任何层 xff09 64 Controller 64 Service 64 Repository xff08 dao xff09 xff1a 用于实例化对象 64 Autowir
  • MyBatis 传递多个参数的4种方式

    MyBatis 传递多个参数的4种方式 方式1 xff1a 顺序传参 xff08 不推荐 xff09 span class token class name Employee span span class token function s
  • Java中String类的常用方法

    文章目录 Java 中 String 类的常用方法一 String 类的概念二 常用的构造方法三 常用方法1 toString 2 length 3 getBytes 4 toCharArray 5 charAt int index 6 i
  • ASR项目实战-数据

    使用机器学习方法来训练模型 xff0c 使用训练得到的模型来预测语音数据 xff0c 进而得到识别的结果文本 xff0c 这是实现语音识别产品的一般思路 本文着重介绍通用语音识别产品对于数据的诉求 对数据的要求 训练集 相关要求 xff0c
  • 如何写一棵简单的二叉查找树

    二叉查找树 完整代码 xff1a https github com problemin Algorithm blob master src Tree BSTree java 二叉排序树 xff08 Binary Sort Tree xff0
  • Redis常见的数据类型命令

    文章目录 Redis 常见的数据类型及命令一 常见的NoSQL二 Redis 简介三 key 键的一些操作命令四 Redis的五种基本数据结构1 String xff08 字符串 xff09 介绍常用命令1 1 set get1 2 app