Redis常见的数据类型命令

news2024/11/17 13:55:45

文章目录

  • 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 数统计
  • 基数统计

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

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

相关文章

数据库管理工具的使用

目录 摘要 一、Navicat是什么&#xff1f; 二、使用步骤 1.如何下载与安装 2.如何连接远程数据库 总结 摘要 本文主要介绍数据库管理工具的使用 一、Navicat是什么&#xff1f; 它是一款数据库管理工具&#xff0c;将此工具连接数据库,你可以从中看到各种数据库的详细…

JavaScript 面向对象【快速掌握知识点】

目录 类和对象 属性和方法 继承 多态 封装 类和对象 类是用于定义对象的模板或蓝图&#xff1b;它包含对象的属性和方法&#xff0c;我们可以使用class关键字来定义类。 class Person {constructor(name, age) {this.name name;this.age age;}sayHello() {console.log(H…

JSP+SQL电量监视系统设计与实现

技术&#xff1a;Java、JSP等摘要&#xff1a;电脑界常有一股又一股的风潮&#xff0c;在这风潮中&#xff0c;JBuilder 是使用最广泛的工具之一。JBuilder6 提供了可视化集成开发工具&#xff0c;支持开发人员构建标准的爪哇应用系统。其开放的环境、基于组建的开发方式和丰富…

【软件测试面试题】2023年测试人面试专属,最全接口测试面试题大全(附回答)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 1、HTTP和HTTPS协议…

2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A(9)

目录 竞赛内容 模块A 基础设施设置与安全加固 一、项目和任务描述&#xff1a; 二、服务器环境说明 三、具体任务&#xff08;每个任务得分以电子答题卡为准&#xff09; A-1任务一 登录安全加固&#xff08;Windows&#xff09; 1.密码策略 a.更改或创建密码时执行复杂…

17- TensorFlow实现手写数字识别 (tensorflow系列) (项目十七)

项目要点 模型创建: model Sequential()添加卷积层: model.add(Dense(32, activationrelu, input_dim100)) # 第一层需要 input_dim添加dropout: model.add(Dropout(0.2))添加第二次网络: model.add(Dense(512, activationrelu)) # 除了first, 其他层不要输入shape添加输出…

这是一款值得开发人员认真研究的软件,数据库优化,应用服务器安全优化...

1.查询数据库死锁相关信息2.查看数据库的链接情况3.当前实例上的所有用户4.创建数据库独立密码5.查看数据库使用的端口号6.当前数据库设置的最大连接数7.当前数据库最大的理论可连接数8.当前数据库实例的连接数9.当前数据库连接数10.当前数据库连接超时设置11.当前sqlserver 超…

SMART系统—考试监控及阅卷模块的设计与开发

技术&#xff1a;Java、JSP等摘要&#xff1a;Smart在线考试评估系统(简称“SMART系统”)&#xff0c;是基于Browser/Server&#xff08;简称B/S&#xff09;结构的数据库访问模式&#xff0c;采用Struts Spring Hibernate作为平台搭建的框架开发的一套新型智能的远程教育软件…

伺服三环控制深层原理解析

我们平时使用的工业伺服,通常是成套伺服,即驱动器和电机型号存在配对关系。 但有些时候,我们要用电机定转子和编码器制作非成套电机,这种时候,我们需要对驱动器进行各种设置才能驱动电机。 此篇文章将通过介绍伺服控制的三环控制原理入手来说明我们调试非成套伺服时需要…

2023年微信小程序获取手机号授权登录注册详细教程,包含服务端教程

前言 小程序中有很多地方都会用到用户的手机号&#xff0c;比如登陆注册&#xff0c;填写收货地址等等。有了这个组件可以快速获取微信绑定手机号码&#xff0c;无须用户填写。网上大多数教程还是往年的&#xff0c;而微信官方的api已做了修改。本篇文章将使用最新的方法获取手…

【unity学习记录】Canvas Group组件

&#x1f497; 未来的游戏开发程序媛&#xff0c;现在的努力学习菜鸡 &#x1f4a6;本专栏是我关于游戏开发的学习笔记 &#x1f236;本篇是unity的Canvas Group组件 Canvas Group画布组介绍详解1. Alpha2. Interactable3. Blocks Raycasts4. Ignore Parent Groups介绍 画布组…

用反射模拟IOC模拟getBean

IOC就是spring的核心思想之一&#xff1a;控制反转。这里不再赘述&#xff0c;看我的文章即可了解&#xff1a;spring基础思想IOC其次就是java的反射&#xff0c;反射机制是spring的重要实现核心&#xff0c;今天我看spring的三级缓存解决循坏引用的问题时&#xff0c;发现一个…

机器学习——模型评估

在学习得到的模型投放使用之前&#xff0c;通常需要对其进行性能评估。为此&#xff0c;需使用一个“测试集”(testing set&#xff09;来测试模型对新样本的泛化能力&#xff0c;然后以测试集上的“测试误差( tootino error)作为泛化误差的近似。我们假设测试集是从样本真实分…

ShardingSphere水平、垂直分库、分表和公共表

目录一、ShardingSphere简介二、ShardingSphere-分库分表1、垂直拆分&#xff08;1&#xff09;垂直分库&#xff08;2&#xff09;垂直分表2、水平拆分&#xff08;1&#xff09;水平分库&#xff08;2&#xff09;水平分表三、水平分库操作1、创建数据库和表2、配置分片的规则…

中级嵌入式系统设计师2016下半年上午试题及答案解析

中级嵌入式系统设计师2016下半年上午试题 单项选择题 1、(1)用来区分在存储器中以二进制编码形式存放的指令和数据。 A. 指令周期的不同阶段 B. 指令和数据的寻址方式 C. 指令操作码的译码结果 D. 指令和数据所在的存储单元 2、计算机在一个指令周期的过程中,为从…

web服务器(1)

阻塞和非阻塞、同步和异步 网络IO阶段一&#xff1a;数据就绪 操作系统&#xff0c;tcp接受缓冲区 阻塞&#xff1a;调用IO方法的线程进入阻塞状态 非阻塞&#xff1a;不会改变线程的状态&#xff0c;通过返回值判断 网络IO阶段二&#xff1a;数据读写 应用程序 同步…

接口自动化框架---升级版(Pytest+request+Allure)

目录&#xff1a;导读 一、简单介绍 二、目录介绍 三、代码分析 写在最后 接口自动化是指模拟程序接口层面的自动化&#xff0c;由于接口不易变更&#xff0c;维护成本更小&#xff0c;所以深受各大公司的喜爱。 第一版入口&#xff1a;接口自动化框架(PytestrequestAllure…

[Android Studio] Android Studio使用keytool工具读取Debug 调试版数字证书以及release 发布版数字证书

&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Android Debug&#x1f7e7;&#x1f7e8;&#x1f7e9;&#x1f7e6;&#x1f7ea; Topic 发布安卓学习过程中遇到问题解决过程&#xff0c;希望我的解决方案可以对小伙伴们有帮助。 &#x1f4cb;笔记目…

学生宿舍管理系统

技术&#xff1a;Java、JSP等摘要&#xff1a;管理信息系统在现代社会已深入到各行各业&#xff0c;由于计算机技术的迅速发展和普及&#xff0c;信息管理系统MIS事实上已成为计算机管理信息系统,大学生宿舍管理系统就是一个典型的管理信息系统&#xff0c;它可以让宿舍管理工作…

【算法题】最大矩形面积,单调栈解法

力扣&#xff1a;84. 柱状图中最大的矩形 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 题意很简单&#xff0c;翻译一下就是&#xff1a;求该图中…