• 0

  • 7

Redis之六大数据类型总结

猿人不正经

不想写代码

2星期前

数据类型这个名词我想大家都不陌生,像JAVA的数据类型就分为基本数据类型和引用数据类型,基本数据类型又分为八大类型,在这里就不多说了,主角是redis的数据类型有哪些,是不是也和java的一样呢?下面就带大家看看redis的数据类型有什么不一样的地方。
上次也和大家说过redis的简介,Redis 是一种基于内存的数据库,并且提供一定的持久化功能,它是一种键值(key-value)数据库,使用 key 作为索引找到当前缓存的数据,并且返回给程序调用者。

使用 Redis 编程要熟悉这 6 种数据类型,并且了解它们常用的命令。Redis 定义的这 6 种数据类型是十分有用的,它除了提供简单的存储功能,还能对存储的数据进行一些计算。

比如字符串可以支持浮点数的自增、自减、字符求子串,集合求交集、并集,有序集合进行排序等,所以使用它们有利于对一些不太大的数据集合进行快速计算,简化编程,同时它也比数据库要快得多,所以它们对系统性能的提升十分有意义。

Redis六种数据类型:

  1. string(字符串)
  2. hash(哈希)
  3. list(列表)
  4. set(集合)
  5. zset(有序集合)
  6. 基数(HyperLogLog)

如下图的表格所示:
在这里插入图片描述

String(字符串)

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。
string 类型是二进制安全的。意思是 redis 的 string 可以包含任何数据。比如jpg图片或者序列化的对象。
string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB。

举例:

#创建键值对
set zp "sleep"
#获取值
get zp

注意:
一个键最大能存储 512MB。

Hash(哈希)

Redis hash 是一个键值(key=>value)对集合。
Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象。
默认15个下标命名的哈希库。按下标命名0-15,就是有16个库创建的多了超过的话会报错,

举例:

HMSET student name1 "zhangsan" name2 "lisi"

HGET student name1
>>"zhangsan"

HGET student name2
>>"lisi"

HMSET 设置了两个 name=>value 对, HGET 获取对应 name 对应的 value。
每个 hash 可以存储 232 -1 键值对(40多亿)。

List(列表)

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

举例:

#lpush从左开始插入数据
#rpush从右开始插入数据

LPUSH scores 30
LPUSH scores 40
LPUSH scores 50
LPUSH scores 60 

#查询,默认倒序查询
lrange score 0 4
>> 60 
>> 50 
>> 40 
>> 30

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

Set(集合)

Redis 的 Set 是 string 类型的无序集合。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
sadd 命令
添加一个 string 元素到 key 对应的 set 集合中,成功返回 1,如果元素已经在集合中返回 0。

sadd key member

举例:

 sadd runoob redis
 sadd runoob mongodb
 sadd runoob rabitmq
 sadd runoob rabitmq
 
 smembers runoob
>>"redis"
>>"rabitmq"
>>"mongodb"

注意:
以上实例中 rabitmq 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。
集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

zset(有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。
不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。

举例:

zadd runoob 0 redis
zadd runoob 0 mongodb
zadd runoob 0 rabitmq
zadd runoob 0 rabitmq

ZRANGEBYSCORE runoob 0 1000

>>"mongodb"
>>"rabitmq"
>>"redis"

基数(HyperLogLog)

基数是一种算法,它的作用是计算重复的值,以确定存储的数量.
基数并不是存储元素,存储元素消耗内存空间比较大,而是给某一个有重复元素的数据集合(一般是很大的数据集合)评估需要的空间单元数,所以它没有办法进行存储.
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定
的、并且是很小的。

什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
举例:

PFADD runoobkey "redis"

PFADD runoobkey "mongodb"

PFADD runoobkey "mysql"

PFCOUNT runoobkey
>>3

基数基本 命令

  • PFADD key element [element …]
    添加指定元素到 HyperLogLog 中。
  • PFCOUNT key [key …]
    返回给定 HyperLogLog 的基数估算值。
  • PFMERGE destkey sourcekey [sourcekey …]
    将多个 HyperLogLog 合并为一个 HyperLogLog

注意:
Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。

Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。

每个数据库对外都是一个从0开始的递增数字命名,Redis默认支持16个数据库(可以通过配置文件支持更多,无上限),可以通过配置databases来修改这一数字。客户端与Redis建立连接后会自动选择0号数据库,不过可以随时使用SELECT命令更换数据库,如要选择1号数据库:

SELECT 1

GET foo

>>(nil)

然而这些以数字命名的数据库又与我们理解的数据库有所区别。
首先Redis不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。
另外Redis也不支持为每个数据库设置不同的访问密码,所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。

最重要的一点是多个数据库之间并不是完全隔离的,比如FLUSHALL命令可以清空一个Redis实例中所有数据库中的数据。综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。

比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于Redis非常轻量级,一个空Redis实例占用的内在只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。

免责声明:文章版权归原作者所有,其内容与观点不代表Unitimes立场,亦不构成任何投资意见或建议。

7

相关文章推荐

未登录头像

暂无评论