Redis数据类型(自看笔记)

206 阅读4分钟

写在前面

  1. 参考Redis中文教程;
  2. 自己做个笔记方便后面复习;
  3. 刚刚开始学Redis,所以很多东西说不清,先写一个文章做记录,随着进度推进会慢慢完善文章。

Redis支持的数据类型

  • 字符串(string)
  • 哈希(hash)
  • 列表(list)
  • 集合(set)
  • 有序集合(sorted set)
  • 位图(Bitmaps)
  • 基数统计(HyperLogLogs)

字符串

  Redis中字符串是一组字节,是二进制安全的,所以字符串具有已知长度,并且不受任何特殊终止符影响。可以在一个字符串存储最多512兆字节的内容。

  • 二进制安全
  • 具有已知长度
  • 不受任何特殊终止符影响
  • 最多存储512兆字节的内容。
SET name "redis.com.cn"  
OK  
GET name   
"redis.com.cn"

哈希

  在Redis中,哈希是字符串字段到字符串值之间的映射。所以哈希比较适合表示对象。每个哈希可以存储多达(2^32) - 1个字段-值对(没找到次方表示方法,先将就用)。

  • 比较适合对象
  • 可以存储多达(2^32) - 1
HMSET user:1 username ajeet password javatpoint alexa 2000  
OK  
HGETALL  user:1  
"username"  
"ajeet"  
"password"  
"javatpoint"  
"alexa"  
"2000" 

列表

  Redis 列表定义为字符串列表,按插入顺序排序。可以将元素添加到 Redis 列表的头部或尾部。列表最大长度为(2^32) - 1个元素。

  • 按插入顺序排序
  • 可将元素添加到Redis列表头部或尾部
  • 最大长度为(2^32) - 1个元素
lpush javatpoint java  
(integer) 1  
lpush javatpoint java  
(integer) 1  
lpush javatpoint java  
(integer) 1  
lpush javatpoint java  
(integer) 1  
lrange javatpoint 0 10  
"cassandra"  
"mongodb"  
"sql"  
"java"  

集合

  集合(set)是 Redis 数据库中的无序字符串集合。在 Redis 中,添加,删除和查找的时间复杂度是 O(1)。集合元素具有唯一性,所以集合中没有重复元素。集合最大成员数为(2^32) - 1个元素。

  • 无序
  • 没有重复元素
  • 最大成员数为(2^32) - 1
sadd tutoriallist redis  
(integer) 1  
redis 127.0.0.1:6379> sadd tutoriallist sql  
(integer) 1  
redis 127.0.0.1:6379> sadd tutoriallist postgresql  
(integer) 1  
redis 127.0.0.1:6379> sadd tutoriallist postgresql  
(integer) 0  
redis 127.0.0.1:6379> sadd tutoriallist postgresql  
(integer) 0  
redis 127.0.0.1:6379> smembers tutoriallist  
1) "redis"  
2) "postgresql"  
3) "sql" 

有序集合

  Redis 有序集合类似于 Redis 集合,也是一组非重复的字符串集合。但是,排序集的每个成员都与一个分数相关联,该分数用于获取从最小到最高分数的有序排序集。虽然成员是独特的,但可以重复分数。

  • 非重复
  • 分数可以重复,但是成员不可以重复
  • 有序,按照分数从小到大排序
redis 127.0.0.1:6379> zadd tutoriallist 0 redis  
(integer) 1  
redis 127.0.0.1:6379> zadd tutoriallist 0 sql  
(integer) 1  
redis 127.0.0.1:6379> zadd tutoriallist 0 postgresql  
(integer) 1  
redis 127.0.0.1:6379> zadd tutoriallist 0 postgresql  
(integer) 0  
redis 127.0.0.1:6379> zadd tutoriallist 0 postgresql  
(integer) 0  
redis 127.0.0.1:6379> ZRANGEBYSCORE tutoriallist 0 10  
1) "postgresql"  
2) "redis"  
3) "sql"   

位图 Redis Bitmap

  Bitmap类似于map结构,存放0或1(bit位)作为值。Bitmap可以用来统计状态,如“日活”是否浏览过某个东西。   Redis setbit命令:用于设置或者清除一个bit位。

SETBIT key offset value

127.0.0.1:6379> setbit aaa:001 10001 1 # 返回操作之前的数值
(integer) 0
127.0.0.1:6379> setbit aaa:001 10002 2 # 如果值不是0或1就报错
(error) ERR bit is not an integer or out of range
127.0.0.1:6379> setbit aaa:001 10002 0
(integer) 0
127.0.0.1:6379> setbit aaa:001 10003 1
(integer) 0

基数统计 HyperLogLogs

  HyperLogLogs可以支持多个元素作为输入,并给出输入元素的基数估计值。

  • 基数:集合中不同元素的数量,比如 {'apple', 'banana', 'cherry', 'banana', 'apple'} 的基数就是 3;
  • 估算值:算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合理的范围之内。
  • HyperLogLogs优点:即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的。在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 264 个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
  • 支持多个元素作为输入
  • 即使输入元素的数量或者体积很大,计算基数所需的空间总是固定的、并且是很小的。
  • 只会更具输入元素来计算基数,而不会存储输入元素本身,所以不能返回输入的各个元素。   Redis PFADD 命令:将元素添加至 HyperLogLog

PFADD key element [element ...]

127.0.0.1:6379> PFADD unique::ip::counter '192.168.0.1'
(integer) 1
127.0.0.1:6379> PFADD unique::ip::counter '127.0.0.1'
(integer) 1
127.0.0.1:6379> PFADD unique::ip::counter '255.255.255.255'
(integer) 1
127.0.0.1:6379> PFCOUNT unique::ip::counter
(integer) 3