Redis数据类型汇总

        Redis不是一个普通的键值存储,它实际上是一个数据结构服务器,支持不同类型的值。在传统的键-值存储中,将字符串类型的键关联到字符串类型的值,而在Redis中,值不仅限于简单的字符串,还可以保存更复杂的数据结构。下面是Redis支持的所有数据结构的列表,本教程将分别介绍这些数据结构:

  • Binary-safe strings
  • Lists
  • Sorted sets
  • Hashes
  • Bit arrays (or simply bitmaps): 
  • HyperLogLogs:
  • Streams

        既然Redis数据库作为key-value形式来存储数据,当然首先需要说说Redis中keys的特点和设计要求:

Redis keys

        Redis中的keys是二进制安全的,意思是说,可以使用任何二进制序列作为一个key,从一个字符串到一个JPEG图片的内容都可以作为key,空字符串也是一个有效的key,需要使用双引号""表示。关于keys的几个规则:

(1)很长的keys并不是一个好的主意。不仅占用内存,而且在数据集中查找key可能需要几个代价高昂的键比较。即使是匹配的一个大的key,散列(例如使用SHA1)key是一个好的主意,尤其从带宽和内存角度来看;

(2)非常短的keysb也不是一个好的主意。如果你可以使用“user:1000:follower”作为key,那么把“u1000flw”作为一个简写的key是没有意义的。前者更具有可读性,而且只是增加了很小的内存。在内存占用和键值长短之间需要做个平衡;

(3)坚持使用模式。例如在"user:1000"中“object:id”的模式是一个好的主意。点和短划线经常在多个单词的字段中使用,例如"comment:1234:reply.to" 或者"comment:1234:reply-to";

(4)允许的最大key的大小是512 MB。

keys的自动创建和销毁

(1)当向聚合数据类型中添加元素时,如果目标key不存在,在添加前会自动创建空数据类型。

(2)当从聚合数据类型中删除元素时,如果值是空,则键自动销毁。Stream数据类型除外。

(3)对空的key调用只读命令比如llen,或者写命令会与该key是空聚合数据类型时产生一样的效果。

总之一切都是那么的自动。


Redis values

        狭义的理解,Redis的数据类型其实针对的是values,也就是说values可以是上面列出的几个数据结构。下面详细来汇总这些数据结构的特点和基本操作命令。


Strings

数据类型 Strings
中文名 字符串
简介

(1)redis 最基本的数据类型

(2)二进制安全

(3)常用于key和value

(4)redis中的value不能大于512MB

命令:set

例:set mykey somevalue

返回值:OK

注释:设置mykey的值为somevalue

命令:del

例:

del mykey

键存在返回1,否则返回0

命令:set

例:

set mykey somevalue

命令:get

例:

get mykey

其他操作

(1)如果mykey已经存在,

set mykey somevalue nx不会插入成功,结果返回nil

(2)如果mykey不存在,set mykey somevalue xx不会插入成功,结果返回nil

(3)一次设置多个key

命令:mset

例:mset a 10 b 20 c 30

(4)一次获取多个key

命令:mget

例:

mget a b c

(5)设置新值,并返回旧值

命令:getset

(6)整数自增1

命令:incr

例:

set counter 100

incr counter

(7)按指定的整数增加

命令:incrby

例:

incrby counter 50

(8)查询键是否存在,存在返回1,否则返回false

命令:exists

例:

exists mykey

(9)查看key的数据类型

命令:type

例:

type mykey

(10)key的过期时间,

单位有秒(s)和毫秒(ms),ms的精度是1ms,关于过期时间的信息持久化在硬盘上。 

-设置key的过期时间(s)

命令:expire

例:

set key somevalue

expire key 5

或者

set key somevalue ex 5

-查询key的过期时间(s):

命令:ttl key

返回结果单位是s,没有过期时间返回-1

-取消key的过期时间:

命令:persist

例:

persist key

-设置key的过期时间(ms)

命令:pexpire

-查询key的过期时间(ms):

命令:pttl

应用场景

(1)缓存HTML片段或页面

(2)二进制数据可以作为字符串,所以Strings数据类型可以用于存储图片


Lists

数据类型

Lists

中文名 列表
简介

(1)列表元素是字符串,

(2)按照插入顺序排列,

(3)列表是基于链表实现的,当在头部或者尾部插入元素时速度快

(1)将单个元素添加到列表的头部或者左边

命令:lpush

例:lpush mylist A

(2)将多个元素添加到列表的头部或者左边

例:lpush mylist A B C

(3)将元素添加到列表的右边或尾部

命令:rpush

例:rpush mylist B

(4)将多个元素添加到列表的右边或尾部

例:rpush mylist B C D

注:rpush和lpush都会返回列表的大小

(4)向某个元素前或者后插入元素

命令:linsert key before|after a b

向a元素前或者后插入元素b

(1)删除并返回列表尾部或者右边的元素

命令:rpop

rpop mylist

(2)删除并返回列表头部或者左边的元素

命令:lpop

lpop mylist

注:如果列表为空,返回nil

 

(1)命令:lrange

例:lrange mylist 0 -1

注:0和-1为元素开始和结束索引(包含结束),索引可以从左向右计算,第一个元素索引为0,也可以从后往前计算,最后一个元素索引为-1,倒数第二个元素为-2,以此类推。

(2)根据索引查询某个元素

命令:lindex

lindex key 3

查询第4个元素,索引从0开始

其他操作

(1)限制列表

命令:ltrim

例:ltrim mylist 0 2

执行操作后mylist变为由索引从0到2的元素构成,其他元素将被删除。返回OK

(2)阻塞列表

命令:blpop

blpop list1 list2 3

依次从list1和list2的左边取元素,阻塞时间3s,如果3s内有元素,立即返回元素所在的列表和元素本身,否则阻塞3s后,返回nil和实际阻塞时间;阻塞时间设置为0,表示永久阻塞

命令:brpop

brpop list1 list2 3

依次从list1和list2的右边取元素,其他与blpop相同

(4)获取列表长度

命令:llen

例:llen key

应用场景

(1)


Hashes

数据类型

Hashes

中文名 哈希
简介

(1)每个元素是由field和关联的value构成的键值对

(2)field和value是字符串

(1)增加单个key-value键值对

命令:hset

例:hset myhash myfield myvalue

向myhash中添加myfield-myvalue键值对

(2)添加多个key-value键值对

命令:hmset

例:hset myhash myfield1 myvalue1 myfield2 myvalue2

向myhash中添加myfield1-myvalue1和键myfield2-myvalue2值对

(1)删除field

命令:hdel

例:hdel key field [field ...]

删除一个key的多个field,只要在key后面跟多个field即可

 

(1)查询单个键值对

命令:hget

例:hget myhash myfield

(2)查询多个键值对

命令:hmget

例:hget myhash myfield1 myfield2

(3)查询hash表中所有键值对

命令:hgetall

例:hgetall myhash

返回结果如下:

1)myfield1

2)myvalue1

3)myfield2

4)myvalue2

其他操作

(1)对哈希的某个整数key增加指定的整数

命令:hincrby

例:hincrby myhash birthyear 10

将出生年增加10

(2)查询一个key的field个数

命令:hlen

例:hlen key

(3)判断field是否存在

命令:hexists

例:hexists key field

(3)查询所有的field

命令:hkeys

例:hkeys key

应用场景  

Sets

数据类型

Sets

中文名 集合
简介

(1)集合元素是字符串

(2)集合元素不重复,

(3)集合元素之间无序

(1)

命令:sadd

例:sadd myset 1 2 3

向集合myset添加元素1,2,3

(1)删除集合元素

命令:srem

srem key element1 [element2 ...]

 

(1)查询集合所有元素

命令:smembers

例:smembers myset

返回结果:

1. 3
2. 1
3. 2

每次调用顺序可能不同

其他操作

(1)判断元素是否在集合中

命令:sismember

例:sismember myset 3

在集合中返回1,否则返回0

(2)计算元素个数

命令:scard

例:scard key

(3)集合交

命令:sinter

sinter key1 key2

(4)集合并

命令:sunion 

sunion ey1 key2

(5)集合差

命令:sdiff 

sdiff ey1 key2

应用场景  

Sorted sets

数据类型 Sorted sets
中文名 有序集合
简介

(1)元素不重复,

(2)每个元素和一个称为score的浮点数关联

(3)元素按照score排序,score是可以相等的

(4)有序集合,可以看成是集合和哈希的混合,看成集合是元素不重复,看成哈希是因为每个元素有一个score与之对应,元素可以看成key,score可以看成value

(5)排序规则,如果A.score>B.score,则A>B,如果A.score=B.score,根据A和B本身字符串字典序排序。

(1)添加元素

命令:zadd

例:zadd hackers 1940 "Alan Kay"

向hackers集合中添加元素"Alan Kay",1940为score

(1)根据score删除有序集合元素

命令:zremrangebyscore

例:zremrangebyscore hackers 1940 1960

返回并删除score从1940到1960的元素

 

(1)查询有序集合元素

命令:zrange

例:zrange hackers 0 -1

输出结果:

1) "Alan Turing"

2) "Hedy Lamarr"

3) "Claude Shannon"

4) "Alan Kay"

注:并没有score,score只是用来排序

(2)反序查询有序集合元素

命令:zrevrange

例:zrevrange hackers 0 -1

(3)查询score

命令:withscores

例:zrange hackers 0 -1 withscores

查询结果:

1) "Alan Turing"

2) "1912"

3) "Hedy Lamarr"

4) "1914"

5) "Claude Shannon"

6) "1916"

(4)根据score查询有序集合元素

命令:zrangebyscore

例:zrangebyscore hackers -inf 1950

-inf 1950为score的范围(两个都包含)

其他操作

(1)查询元素的排序号码

命令:zrank

例:zrank hackers "Anita Borg"

查询"Anita Borg"的排序号码

(2)查看元素个数

命令:zcard

例:zcard key

(3)查看某个元素的分数

命令:zscore

zscore key member

查看集合key中member元素的分值

应用场景  

Bitmaps

数据类型 Bit arrays(or bitmaps)
中文名

位数组

简介

(1)bitmap不是一个单独的数据类型,而是

在字符串类型上定义的一组面向位的操作

(2)由于字符串是二进制安全的blob,其最大长度为512MB,因此它们适合设置为2^32个不同的位。

(3)bitmaps的操作分两类,第一类是对单个位操作,设置位为0和1,或者获取位的值;第二类是对一组位的操作,在给定范围的位中统计设置位的个数

(4)bitmap在存储信息时节省极大的空间

设置位的值

命令:setbit

例:setbit mykey 10 1

设置mykey的第10个bit为值为1,如果mykey的位数不够,自动扩展

 
 

查询位的值

命令:getbit

例:getbit mykey 10 1

查询mykey的第10个bit为值,如果10超过了mykey的位数,则返回0

其他操作

(1)统计位中1的个数

命令:bitcount

例:

> setbit key 0 1

(integer) 0

> setbit key 100 1

(integer) 0

> bitcount key

(integer) 2

应用场景  

HyperLogLogs

数据类型 HyperLogLogs
中文名 可能来源于算法
简介

(1)HyperLogLog 是用来统计集合基数,是一种概率数据结构。

(2)HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。

但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。

   
   
   
   
   
   
   

Streams

数据类型 Streams
中文名  
简介

(1)是一种新的数据类型,在Redis 5.0引入

(2)是日志数据结构的抽象建模

   
   
   
   
   
   
   
发布了89 篇原创文章 · 获赞 79 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/L_15156024189/article/details/86254731