Redis数据类型

1.概述

Redis是基于内存的Key-Value数据库。
它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis支持数据的备份,即master-slave模式的数据备份。
优势:
1、完全基于内存,绝大部分请求是纯粹的内存操作。
2、数据结构简单,对数据操作也简单。
3、采用单线程,避免了不必要的上下文切换和竞争条件。
4、使用多路I/O复用模型,非阻塞IO。
原子 – Redis的单个操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 发布/订阅, 通知, key 过期等等特性。

2.Redis基本命令

Redis select 命令用于切换到指定的数据库,index 是从 0 开始的整数。默认使用数据库 0

127.0.0.1:6379> SELECT 1
OK

Redis keys 命令用于查找所有符合给定模式 pattern 的 key 。

127.0.0.1:6379> keys *

  1. “age”
  2. “name”

匹配模式:
h?llo 匹配 hello, hallo 和 hxllo
h*llo 匹配 hllo 和 heeeello
h[ae]llo 匹配 hello 和hallo, 不匹配 hillo
h[^e]llo 匹配 hallo, hbllo, … 不匹配 hello
h[a-b]llo 匹配 hallo 和 hbllo

Redis exists 命令用于检查给定 key 是否存在。

127.0.0.1:6379> exists age # 判断键是否存在
(integer) 1 # 存在
127.0.0.1:6379> exists name
(integer) 1 # 存在

Redis move 命令用于将当前数据库的 key 移动到选定的数据库 db 当中。
如果 key 在目标数据库中已存在,或者 key 在源数据库中不存,则key 不会被移动。

127.0.0.1:6379> move age 2 # 将键值对移动到指定数据库
(integer) 1
127.0.0.1:6379> EXISTS age # 判断键是否存在
(integer) 0 # 不存在

Redis del 命令用于删除给定的一个或多个 key 。
不存在的 key 会被忽略。

127.0.0.1:6379> del age # 删除键值对
(integer) 1 # 删除个数

Redis expire 命令设置 key 的过期时间(seconds)。 设置的时间过期后,key 会被自动删除。带有超时时间的 key 通常被称为易失的(volatile)。

127.0.0.1:6379> expire age 15 # 设置键值对的过期时间
(integer) 1 # 设置成功 开始计数

Redis ttl 命令以秒为单位返回 key 的剩余过期时间。用户客户端检查 key 还可以存在多久。
返回值
整数: 剩余超时秒数,失败返回负数,
key 不存在返回 -2
key 存在但是没有关联超时时间返回 -1

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未设置过期时间

Redis rename 命令用于修改 key 的名字为 newkey 。若key 不存在返回错误。
返回值
成功:OK
失败:(error) ERR no such key

127.0.0.1:6379> rename name name1
OK
127.0.0.1:6379> rename name name1
(error) ERR no such key

type key
以字符串的形式返回存储在 key 中的值的类型。
可返回的类型是: string, list, set, zset,hash 和 stream。
返回值
成功:返回 key 的类型
失败:不存在时返回 none

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

3.String

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

127.0.0.1:6379> set msg hello
OK
127.0.0.1:6379> append msg " world"
(integer) 11
127.0.0.1:6379> get msg
“hello world”

decr key
为键 key 储存的数字值减去一
如果键 key 不存在, 那么键 key 的值会先被初始化为 0 , 然后再执行 DECR 操作。
如果键 key 储存的值不能被解释为数字, 那么 DECR 命令将返回一个错误。

127.0.0.1:6379> set age 20
OK
127.0.0.1:6379> decr age
(integer) 19

incr key
命令将 key 中储存的数字值增一
INCR是原子操作:
就是说即使多个客户端对同一个key发出INCR命令,也决不会导致竞争的情况。

127.0.0.1:6379> incr age
(integer) 20

incrby key increment
Redis INCRBY 命令将 key 中储存的数字加上指定的增量值
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误
ERR ERR hash value is not an integer。

127.0.0.1:6379> incrby age 5
(integer) 25

decrby key decrement
将键 key 储存的整数值减去减量 decrement 。

127.0.0.1:6379> decrby age 10
(integer) 15

incrbyfloat key increment
为键 key 中储存的值加上浮点数增量 increment ,key 中的浮点数是以字符串形式存储的。
如果键 key 不存在, 那么 INCRBYFLOAT 会先将键 key 的值设为 0 , 然后再执行加法操作。
如果命令执行成功, 那么键 key 的值会被更新为执行加法计算之后的新值, 并且新值会以字符串的形式返回给调用者。

127.0.0.1:6379> incrbyfloat age 5.2
“20.2”

Redis strlen 命令用于获取指定 key 所储存的字符串值的长度。
当 key 储存的不是字符串类型时,返回错误。

127.0.0.1:6379> strlen msg
(integer) 11

GETRANGE key start end
getrange 命令返回存储在 key 中的字符串的子串,由 start 和 end 偏移决定(都包括在内)。负数偏移提供相对字符串结尾的偏移。所以, -1 表示最后一个字符, -2 表示倒数第二个字符,以此类推。

127.0.0.1:6379> getrange msg 3 9
“lo worl”

setrange key offset value
SETRANGE 命令从偏移量 offset 开始, 用 value 参数覆盖键 key 储存的字符串值。
不存在的键 key 当作空白字符串处理。

127.0.0.1:6379> setrange msg 2 hello
(integer) 7
127.0.0.1:6379> get msg
“tehello”

getset key value
将键 key 的值设为 value , 并返回键 key 在被设置之前的旧值。
返回给定键 key 的旧值。
如果键 key 没有旧值, 也即是说, 键 key 在被设置之前并不存在, 那么命令返回 nil 。
当键 key 存在但不是字符串类型时, 命令返回一个错误。

127.0.0.1:6379> getset msg test
“hello world”

setnx key value
Redis Setnx( SET if Not eXists )命令在指定的 key 不存在时,为 key 设置指定的值,这种情况下等同 SET 命令。当 key存在时,什么也不做。

整数:如果key被设置了返回,如果key没有被设置返回0
127.0.0.1:6379> setnx msg test
(integer) 0
127.0.0.1:6379> setnx name sakura
(integer) 1

setex key seconds value
SETEX 命令将键 key 的值设置为 value , 并将键 key 的生存时间设置为 seconds 秒钟。
如果键 key 已经存在, 那么 SETEX 命令将覆盖已有的值。

127.0.0.1:6379> setex name 10 root
OK

mset key value [key value …]
Redis MSET 命令设置多个 key 的值为各自对应的 value。
MSET 像 SET 一样,会用新值替换旧值。如果你不想覆盖旧值,可以使用 MSETNX。
MSET 是原子操作,所有 key 的值同时设置。客户端不会看到有些 key 值被修改,而另一些 key 值没变。
msetnx key value [key value …]
当且仅当所有给定键都不存在时, 为所有给定键设置值。
即使只有一个给定键已经存在, MSETNX 命令也会拒绝执行对所有键的设置操作。
MSETNX 是一个原子性(atomic)操作, 所有给定键要么就全部都被设置, 要么就全部都不设置。
返回值
当所有给定键都设置成功时返回1
某个给定键已经存在而导致设置未能成功返回0
mget key [key …]
Redis MGET 命令返回所有(一个或多个)给定 key 的值,值的类型是字符串。 如果给定的 key 里面,有某个 key 不存在或者值不是字符串,那么这个 key 返回特殊值 nil 。

redis 127.0.0.1:6379> MGET KEY1 KEY2 … KEYN

应用场景

  • 用redis当缓存层来加速读写性能降低后端的压力
  • 计数器
  • 时间内限制请求次数

4.List

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
列表可以经过规则定义将其变为队列、栈、双端队列等。Redis中List是可以进行双端操作的,所以命令也就分为了LXXX和RLLL两类 。
lpush key element [element …]
redis LPUSH 用于将一个或多个值插入到列表key 的头部。
如果 key 不存在,那么在进行 push 操作前会创建一个空列表。当 key 保存的不是列表,那么会返回一个错误。

127.0.0.1:6379> lpush mylist k1
(integer) 1
127.0.0.1:6379> lpush mylist k2
(integer) 2

rpush key element [element …]
RPUSH 向存储在 key 中的列表的尾部插入所有指定的值。
如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。 当 key 保存的不是列表,那么会返回一个错误。
lrange key start end
Redis LRANGE 用于返回列表中指定区间内的元素,区间以偏移量 START 和 END 指定。
其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

127.0.0.1:6379> lrange mylist 0 4

  1. "k2"2) "k1"3) “k3”
    127.0.0.1:6379> lrange mylist 0 2
  2. "k2"2) "k1"3) “k3”
    127.0.0.1:6379> lrange mylist 0 1
  3. "k2"2) “k1”
    127.0.0.1:6379> lrange mylist 0 -1 # 获取全部元素
  4. "k2"2) "k1"3) “k3”

lpushx key value
Redis LPUSHX 在当 key 存在并且存储着一个 list 类型值的时候,向值 list 的头部插入 value。 与 LPUSH 相反,当 key 不存在的时候不会进行任何操作。
rpushx key value
linsert key BEFORE|AFTER pivot value
把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面。
当 key 不存在时,这个list会被看作是空list,任何操作都不会发生。
当 key 存在,但保存的不是一个list的时候,会返回error。

127.0.0.1:6379> linsert mylist after k2 insert_key
(integer) 4

llen key
返回存储在 key 里的list的长度。
如果 key 不存在,那么就被看作是空list,并且返回长度为 0。 当存储在 key 里的值不是一个list的话,会返回error。

127.0.0.1:6379> llen mylist
(integer) 4

lindex key index
返回列表里的元素的索引 index 存储在 key 里面。
下标是从0开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。 负数索引用于指定从列表尾部开始索引的元素。在这种方法下,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推。
当 key 位置的值不是一个列表的时候,会返回一个error。

127.0.0.1:6379> lindex mylist 3 # 获取下标为3的元素
“k3”
127.0.0.1:6379> lindex mylist 0
“k2”

lset key index value
设置 index 位置的list元素的值为 value。
当index超出范围时会返回一个error。

127.0.0.1:6379> lset mylist 3 k6 # 将下标3的元素 set值为k6
OK

lpop key
移除并且返回 key 对应的 list 的第一个元素。
返回值
返回第一个元素的值,或者当 key 不存在时返回 nil。
rpop key
移除并返回存于 key 的 list 的最后一个元素。
返回值
最后一个元素的值,或者当 key 不存在的时候返回 nil。

127.0.0.1:6379> lpop mylist # 左侧(头部)移除
“k2”
127.0.0.1:6379> rpop mylist # 右侧(尾部)移除
“k6”

rpoplpush source destination
原子性地返回并移除存储在 source 的列表的最后一个元素(列表尾部元素), 并把该元素放入存储在 destination 的列表的第一个元素位置(列表头部)。

127.0.0.1:6379> rpoplpush source destination
“a”

ltrim key start stop
修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素。
start 和 stop 都是由0开始计数的, 这里的 0 是列表里的第一个元素(表头),1 是第二个元素,以此类推。

127.0.0.1:6379> ltrim mylist 0 1
OK

lrem key count value
从存于 key 的列表里移除前 count 次出现的值为 value 的元素。
这个 count 参数通过下面几种方式影响这个操作:
count > 0: 从头往尾移除值为 value 的元素。
count < 0: 从尾往头移除值为 value 的元素。
count = 0: 移除所有值为 value 的元素。
如果list里没有存在key就会被当作空list处理,所以当 key 不存在的时候,这个命令会返回 0

127.0.0.1:6379> lrem mylist 3 k1 # 从头部开始搜索 至多删除3个 k1
(integer) 1
127.0.0.1:6379> lrem mylist -2 k2 #从尾部开始搜索 至多删除2个 k2
(integer) 0

应用场景

  • 消息队列
      list类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的list类型实现简单的点对点的消息队列。但是不推荐在实战中这么使用,因为现在已经有Kafka、NSQ、RabbitMQ等成熟的消息队列了,它们的功能已经很完善了,除非是为了更深入地理解消息队列,不然我觉得没必要去重复造轮子。
  • 排行榜
      list类型的lrange命令可以分页查看队列中的数据。可将每隔一段时间计算一次的排行榜存储在list类型中,如京东每日的手机销量排行、学校每次月考学生的成绩排名等。
      但是,并不是所有的排行榜都能用list类型实现,只有定时计算的排行榜才适合使用list类型存储,与定时计算的排行榜相对应的是实时计算的排行榜,list类型不能支持实时计算的排行榜,之后在介绍有序集合sorted set的应用场景时会详细介绍实时计算的排行榜的实现。
  • 文章列表或者数据分页展示的应用。
      常用的博客网站的文章列表,当用户量越来越多时,而且每一个用户都有自己的文章列表,而且当文章多时,都需要分页展示,这时可以考虑使用redis的列表,列表不但有序同时还支持按照范围内获取元素,可以完美解决分页查询功能。大大提高查询效率。

5.Set

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
sadd key member [member …]
添加一个或多个指定的member元素到集合的 key中.
指定的一个或者多个元素member 如果已经在集合key中存在则忽略.如果集合key 不存在,则新建集合key,并添加member元素到集合key中.
如果key 的类型不是集合则返回错误.

127.0.0.1:6379> sadd myset m1 m2 m3 m4
(integer) 4

scard key
返回集合存储的key的基数 (集合元素的数量).

127.0.0.1:6379> scard myset
(integer) 4

smembers key
返回key集合所有的元素.

127.0.0.1:6379> smembers myset

  1. “m4”
  2. “m3”
  3. “m2”
  4. “m1”

sismember key member
返回成员 member 是否是存储的集合 key的成员.
返回值
如果member元素是集合key的成员,则返回1
如果member元素不是key的成员,或者集合key不存在,则返回0

127.0.0.1:6379> sismember myset m5 # 查询m5是否是myset的成员
(integer) 0 # 不是,返回0
127.0.0.1:6379> sismember myset m2
(integer) 1 # 是,返回1

spop key [count]
从存储在key的集合中移除并返回一个或多个随机元素。

127.0.0.1:6379> spop myset 2 # 随机移除并返回2个成员

  1. “m2”
  2. “m1”

smove source destination member
将member从source集合移动到destination集合中.

127.0.0.1:6379> smove myset newset m1
(integer) 1

srem key member [member …]
在key集合中移除指定的元素.
如果指定的元素不是key集合中的元素则忽略 如果key集合不存在则被视为一个空的集合,该命令返回0.
如果key的类型不是一个集合,则返回错误.

127.0.0.1:6379> srem newset m1 # 从newset中移除m1元素
(integer) 1

sdiff key [key …]
返回一个集合与给定集合的差集的元素.

127.0.0.1:6379> sdiff setx sety setz

  1. “m1”
    127.0.0.1:6379> sdiff setx sety
  2. “m1”
  3. “m4”
    127.0.0.1:6379> sdiff sety setx
  4. “m5”

inster key [key …]
返回指定所有的集合的成员的交集.

127.0.0.1:6379> sinter setx sety setz
(empty array)
127.0.0.1:6379> sinter setx sety

  1. “m2”
  2. “m3”

sunion key [key …]
返回给定的多个集合的并集中的所有成员.

127.0.0.1:6379> sunion setx sety setz

  1. "m4"2) "m2"3) "m5"4) "m3"5) “m1”
    127.0.0.1:6379> sunion setx sety
  2. "m3"2) "m1"3) "m2"4) "m4"5) “m5”

6.Hash

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。
哈希类型是指Redis键值对中的值本身又是一个键值对结构,形如value=[{field1,value1},…{fieldN,valueN}]
hset key field value
设置 key 指定的哈希集中指定字段的值。
如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。
如果字段在哈希集中存在,它将被重写。

127.0.0.1:6379> hset studentx name zhangsan
(integer) 1
127.0.0.1:6379> hset studentx name lisi
(integer) 0
127.0.0.1:6379> hset studentx age 20
(integer) 1

hmset key field value [field value …]
设置 key 指定的哈希集中指定字段的值。
设置 key 指定的哈希集中指定字段的值。该命令将重写所有在哈希集中存在的字段。如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联

127.0.0.1:6379> hmset studentx sex 1 tel 15623667886
OK

hsetnx key field value
只在 key 指定的哈希集中不存在指定的字段时,设置字段的值。
如果 key 指定的哈希集不存在,会创建一个新的哈希集并与 key 关联。如果字段已存在,该操作无效果。

127.0.0.1:6379> hsetnx studentx name gyc
(integer) 0 # 失败
127.0.0.1:6379> hsetnx studentx email 12345@qq.com
(integer) 1 # 成功

hexists key field
返回hash里面field是否存在
返回值
hash里面包含该field,返回1
hash里面不包含该field或者key不存在,返回0

127.0.0.1:6379> hexists studentx name
(integer) 1

hget key field
返回 key 指定的哈希集中该字段所关联的值
返回值
该字段所关联的值。
当字段不存在或者 key 不存在时返回nil。

127.0.0.1:6379> hget studentx name
“lisi”

hmget key field [field …]
返回 key 指定的哈希集中指定字段的值。
对于哈希集中不存在的每个字段,返回 nil 值。因为不存在的keys被认为是一个空的哈希集,对一个不存在的 key 执行 HMGET 将返回一个只含有 nil 值的列表
含有给定字段及其值的列表,并保持与请求相同的顺序。

127.0.0.1:6379> hmget studentx name age email

  1. “lisi”
  2. “20”
  3. “12345@qq.com”

hgetall key
返回 key 指定的哈希集中所有的字段和值。
返回值中,每个字段名的下一个是它的值,所以返回值的长度是哈希集大小的两倍

127.0.0.1:6379> hgetall studentx

  1. “name”
  2. “lisi”
  3. “age”
  4. “20”
  5. “sex”
  6. “1”
  7. “tel”
  8. “15623667886”
  9. “email”
  10. “12345@qq.com”

hkeys key
返回 key 指定的哈希集中所有字段的名字。

127.0.0.1:6379> hkeys studentx
.1) “name”
.2) “age”
.3) “sex”
.4) “tel”
.5) “email”

hlen key
返回 key 指定的哈希集包含的字段的数量。
hvals key
返回 key 指定的哈希集中所有字段的值。
hdel key field [field …]
从 key 指定的哈希集中移除指定的字段。在哈希集中不存在的字段将被忽略。

127.0.0.1:6379> hdel studentx sex tel
(integer) 2

hincrby key field increment
增加 key 指定的哈希集中指定字段的数值。
如果 key 不存在,会创建一个新的哈希集并与 key 关联。如果字段不存在,则字段的值在该操作执行前被设置为 0
HINCRBY 支持的值的范围限定在 64位 有符号整数

127.0.0.1:6379> hincrby studentx age 1
(integer) 21

hincrbyfloat key field increment
为指定key的hash的field字段值执行float类型的increment加。
如果field不存在,则在执行该操作前设置为0.
如果出现下列情况之一,则返回错误:
field的值包含的类型错误(不是字符串)。
当前field或者increment不能解析为一个float类型。

127.0.0.1:6379> hincrbyfloat studentx weight 0.6
“0.6”
127.0.0.1:6379> hincrbyfloat studentx age 0.6
“21.6”

Hash变更的数据user name age,尤其是用户信息之类的,经常变动的信息!Hash更适合于对象的存储,Sring更加适合字符串存储!
hash类型的(key, field, value)的结构与对象的(对象id, 属性, 值)的结构相似,也可以用来存储对象。
  当对象的某个属性需要频繁修改时,不适合用string+json,因为它不够灵活,每次修改都需要重新将整个对象序列化并赋值,如果使用hash类型,则可以针对某个属性单独修改,没有序列化,也不需要修改整个对象。比如,商品的价格、销量、关注数、评价数等可能经常发生变化的属性,就适合存储在hash类型里。

7.Zset

Zset(有序集合)
不同的是每个元素都会关联一个double类型的分数(score)。
redis正是通过分数来为集合中的成员进行从小到大的排序。
score相同:按字典顺序排序
注:有序集合的成员是唯一的,但分数(score)却可以重复。
zadd key [NX|XX] [CH] [INCR] score member [score member …]
将所有指定成员添加到键为key有序集合(sorted set)里面,添加时可以指定多个分数/成员(score/member)对。
如果指定添加的成员已经是有序集合里面的成员,则会更新改成员的分数(scrore)并更新到正确的排序位置。
如果key不存在,将会创建一个新的有序集合(sorted set)并将分数/成员(score/member)对添加到有序集合,就像原来存在一个空的有序集合一样。
如果key存在,但是类型不是有序集合,将会返回一个错误应答。
ZADD 命令在key后面分数/成员(score/member)对前面支持一些参数:
XX: 仅仅更新存在的成员,不添加新成员。
NX: 不更新存在的成员。只添加新成员。
CH: 修改返回值为发生变化的成员总数,原始是返回新添加成员的总数 (CH 是 changed 的意思)。更改的元素是新添加的成员,已经存在的成员更新分数。 所以在命令中指定的成员有相同的分数将不被计算在内。
INCR: 当ZADD指定这个选项时,成员的操作就等同ZINCRBY命令,对成员的分数进行递增操作。

127.0.0.1:6379> zadd myzset 1 a 10 b 20 c 30 d
(integer) 4

zcard key
返回key的有序集元素个数。

127.0.0.1:6379> zcard myzset
(integer) 4

zcount key min max
返回有序集key中,score值在min和max之间
返回值
指定分数范围的元素个数。

127.0.0.1:6379> zcount myzset 0 20
(integer) 3
127.0.0.1:6379> zcount myzset 0 30
(integer) 4

zscore key member
返回有序集key中,成员member的score值。
如果member元素不是有序集key的成员,或key不存在,返回nil。
返回值
member成员的score值(double型浮点数),以字符串形式表示。

127.0.0.1:6379> zscore myzset c # 获取成员m1的score
“20”

zrank key member
返回有序集key中成员member的排名。
其中有序集成员按score值递增(从小到大)顺序排列。排名以0为底,也就是说,score值最小的成员排名为0。
返回值
如果member是有序集key的成员,返回member的排名。
如果member不是有序集key的成员,返回nil。

127.0.0.1:6379> zrank myzset a
(integer) 0
127.0.0.1:6379> zrank myzset d
(integer) 3

zrange key start stop [WITHSCORES]
返回存储在有序集合key中的指定范围的元素。
返回的元素可以认为是按得分从最低到最高排列。 如果得分相同,将按字典排序。

127.0.0.1:6379> zrange myzset 0 1

  1. “a”
  2. “b”

zrevrange key start stop [WITHSCORES]
返回有序集key中,指定区间内的成员。
其中成员的位置按score值递减(从大到小)来排列。
返回值
指定范围的元素列表(可选是否含有分数)

127.0.0.1:6379> zrevrange myzset 0 2

  1. “d”
  2. “c”
  3. “b”

zrem key member [member …]
删除有序集合中的元素,当key存在,但是其不是有序集合类型,就返回一个错误。
返回值
返回的是从有序集合中删除的成员个数,不包括不存在的成员。
127.0.0.1:6379> zrem zset a
(integer) 1
127.0.0.1:6379> zrem zset aaa
(integer) 0

8.Geospatial(地理位置)

geoadd key longitude latitude member [longitude latitude member …]
将指定的地理空间位置(纬度、经度、名称)添加到指定的key中。

127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing
(integer) 1
127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai
(integer) 1
127.0.0.1:6379> geoadd china:city 106.50 29.53 chongqi 114.05 22.52 shengzhen
(integer) 2

geopos key member [member …]
从key里返回所有给定位置元素的位置(经度和纬度)。
返回值
数组中的每个项都由两个元素组成:
第一个元素为给定位置元素的经度;
第二个元素则为给定位置元素的纬度;
当给定的位置元素不存在时, 对应的数组项为空值。

127.0.0.1:6379> geopos china:city beijing

    1. “116.39999896287918091”
  1. “39.90000009167092543”

geodist key member1 member2 [unit]
返回两个给定位置之间的距离。
如果两个位置之间的其中一个不存在, 那么命令返回空值。
指定单位的参数 unit 必须是以下单位的其中一个:
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺

127.0.0.1:6379> geodist china:city shanghai beijing km
“1067.3788”

georadius key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
以给定的经纬度为中心, 返回键包含的位置元素当中, 与中心的距离不超过给定最大距离的所有位置元素。
WITHDIST: 在返回位置元素的同时,将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
WITHCOORD: 将位置元素的经度和维度也一并返回。
WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。

127.0.0.1:6379> georadius china:city 110 30 1000 km withdist# 显示到中间距离的位置

    1. “chongqi”
  1. “341.9374”
    1. “xian”
  2. “483.8340”
    1. “shengzhen”
  3. “924.6408”
    1. “hangzhou”
  4. “977.5143”

georadiusbymember key member radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]
找出位于指定元素周围的其他元素。

127.0.0.1:6379> georadiusbymember china:city beijing 1000 km

  1. “beijing”
  2. “xian”
    127.0.0.1:6379> georadiusbymember china:city shanghai 500 km
  3. “hangzhou”
  4. “shanghai”

GEO 底层的实现原理其实就是 Zset

9.Hyperloglog(基数统计)

HyperLogLog 是一种基数估算算法。所谓基数估算,就是估算在一批数据中,不重复元素的个数有多少,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数。
因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
什么是基数?
数据集中不重复的元素的个数。
A {1,3,5,7,8,7}
基数(不重复的元素) = 5,它是一种概率算法,不直接存储数据集合本身,通过一定的概率统计方法预估整体基数值,可以大大节省内存,同时保证误差控制在一定范围内,官方给出的误差率为 0.81%,所必须可以接受误差!
pfadd key element [element …]
添加指定元素到 HyperLogLog 中。
返回值
如果 HyperLogLog 的内部被修改了,那么返回 1,否则返回 0 .

127.0.0.1:6379> pfadd mykey a b c d e f g h i j k
(integer) 1

pfcount key [key …]
返回给定 HyperLogLog 的基数估算值。
返回值
当参数为一个key时,返回存储在HyperLogLog结构体的该变量的近似基数,如果该变量不存在,则返回0.
当参数为多个key时,返回这些HyperLogLog并集的近似基数,这个值是将所给定的所有key的HyperLoglog结构合并到一个临时的HyperLogLog结构中计算而得到的.

127.0.0.1:6379> pfcount mykey
(integer) 11
127.0.0.1:6379> pfadd mykey2 q w e r t y u i
(integer) 1
127.0.0.1:6379> pfcount mykey mykey2
(integer) 16

pfmerge destkey sourcekey [sourcekey …]
将多个 HyperLogLog 合并(merge)为一个 HyperLogLog 。

127.0.0.1:6379> pfmerge mykey3 mykey mykey2
OK

10.BitMaps(位图)

使用位存储,信息状态只有 0 和 1
Bitmaps本身不是一种数据结构,实际上它就是字符串,但是它可以对字符串的位进行操作。
应用场景
签到统计、状态统计
活跃,不活跃! 登录 、 未登录! 打卡,未打卡! 两个状态的,都可以使用Bitmaps!
setbit key offset value
设置或者清空key的value(字符串)在offset处的bit值。

127.0.0.1:6379> setbit sign 0 1 # 设置sign的第0位为 1
127.0.0.1:6379> setbit sign 1 0
127.0.0.1:6379> setbit sign 2 0
127.0.0.1:6379> setbit sign 3 0
127.0.0.1:6379> setbit sign 4 0
127.0.0.1:6379> setbit sign 5 1
127.0.0.1:6379> setbit sign 6 0

getbit key offset
返回key对应的string在offset处的bit值。

127.0.0.1:6379> getbit sign 0
(integer) 1
127.0.0.1:6379> getbit sign 2
(integer) 0

bitcount key [start end]
统计字符串被设置为1的bit数.

127.0.0.1:6379> bitcount sign
(integer) 2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis支持多种数据类型,包括string、hash、list、set和sorted set等。其,string是最基本、最简单的数据类型,用于存储字符串。 Hash是用于存储键值对的数据结构,其的value只能存储字符串,不允许存储其他数据类型,也不存在嵌套现象。每个hash可以存储232 - 1个键值对,并可以灵活添加或删除对象属性。但需要注意的是,hash类型并不适合存储大量对象,也不应该将hash作为对象列表使用,因为遍历整体数据的效率可能会较低。 除了string和hash类型,Redis还支持list、set和sorted set等数据类型。List是一个有序的字符串列表,可以进行插入、删除和查找等操作。Set是一个无序的字符串集合,可以进行元素的添加、删除和查找操作,并且不允许重复元素的存在。Sorted Set是一个有序的字符串集合,每个元素都有一个对应的score,可以根据score进行排序和范围查找。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Redis 数据类型](https://blog.csdn.net/weixin_52851967/article/details/122670564)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值