Redis 基础之常用数据类型及命令

常用数据类型及命令

Redis 比 Memcached 更优秀的地方之一就是支持更丰富的数据类型

Redis 支持七种数据类型

1、 string(字符串);

2、 hash(哈希);

3、 list(列表);

4、 set(集合);

5、 zset(sortedset:有序集合);

6、 Bitmaps(位图);

7、 HyperLogLogs(基数统计);

redis 常用键命令如下:

String(字符串)

string 是 Redis 最基本的数据类型,一个 key 对应一个 value

string 类型是二进制安全的

Redis 的 string 可以包含任何数据,比如 jpg 图片或者序列化的对象

string 类型的一个键最大能存储 512 MB 数据

java 复制代码
127、0.0.1:6379> SET site "test"
OK
127、0.0.1:6379> GET site
"test"

上面的范例中我们使用了 Redis 的 SET 和 GET 命令

下表列出了 Redis 字符串命令

Hash(哈希)

Redis Hash 是一个键名对集合

Redis Hash 是一个 string 类型的 field 和 value 的映射表

Redis Hash 特别适合用于存储对象

Redis 每个 hash 可以存储 232-1 键值对(40多亿)

java 复制代码
127、0.0.1:6379> HMSET user:1 username penglei password 123456 points 200
OK
127、0.0.1:6379> HGETALL user:1
1) "username"
2) "penglei"
3) "password"
4) "123456"
5) "points"
6) "200"
127、0.0.1:6379> 

上面的范例中 hash 数据类型存储了包含用户脚本信息的用户对象

范例中我们使用了 Redis HMSET, HGETALL 命令, user:1 为键

下表列出了 redis hash 命令

List(列表)

Redis List ( 列表 ) 是简单的字符串列表,按照插入顺序排序

我们可以添加一个元素到列表的头部 ( 左边 ) 或者尾部 ( 右边 )

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

java 复制代码
127、0.0.1:6379> lpush database redis
(integer) 1
127、0.0.1:6379> lpush database mongodb
(integer) 2
127、0.0.1:6379> lpush database rabitmq
(integer) 3
127、0.0.1:6379> lrange database 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
127、0.0.1:6379>

下表列出了列表相关命令

Set(集合)

Redis Set 是 string 类型的无序集合

Redis Set 是通过哈希表实现的,所以添加,删除,查找的时间复杂度都是 O(1)

Redis Set 最大的成员数为 232- 1(4294967295, 每个集合可存储40多亿个成员)

Redis Set 内元素具有唯一性,不管插入多少次都只会有一份

sadd 命令

Redis sadd 添加一个 string 元素到 key 对应的 set 集合

Redis sadd 语法

java 复制代码
sadd key member

范例

java 复制代码
127、0.0.1:6379> sadd database redis
(integer) 1
127、0.0.1:6379> sadd database mongodb
(integer) 1
127、0.0.1:6379> sadd database rabitmq
(integer) 1
127、0.0.1:6379> sadd database rabitmq
(integer) 0
127、0.0.1:6379> smembers database

1) "rabitmq"
2) "mongodb"
3) "redis"

上面的范例,rabitmq 添加了两次,但最后只存储了一份

下表列出了 Redis 集合相关命令

zset ( sorted set:有序集合 )

Redis zset 和 set 一样也是 string 类型元素的集合

Redis zset 不同的是每个元素都会关联一个 double 类型的分数

Redis zset 通过分数来为集合中的成员进行从小到大的排序

Redis zset 的成员是唯一的,但分数( score ) 却可以重复

Redis zadd 命令

Redis zset 添加元素到集合,如果元素在集合中存在则更新对应 score

Redis zadd 命令语法格式

java 复制代码
zadd key score member

Redis zset 范例

java 复制代码
127、0.0.1:6379> zadd lang_rank 0 redis
(integer) 1
127、0.0.1:6379> zadd lang_rank 0 mongodb
(integer) 1
127、0.0.1:6379> zadd lang_rank 0 rabitmq
(integer) 1
127、0.0.1:6379> zadd lang_rank 0 rabitmq
(integer) 0
127、0.0.1:6379> ZRANGEBYSCORE lang_rank 0 1000

1) "redis"
2) "mongodb"
3) "rabitmq"

Redis sorted set 和 set 一样也是 string 类型元素的集合,且不允许重复的成员

Redis sorted set 的每个元素都会关联一个 double 类型的分数(score)

Redis sorted set 通过分数(score) 来为集合中的成员进行从小到大的排序

Redis sorted set(有序集合) 的成员是唯一的,但分数 (score) 却可以重复

Redis sorted set 是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)

Redis sorted set 中最大的成员数为 232 -- 1

下表列出了 Redis 有序集合的基本命令

Redis setbit 命令

Redis setbit 命令用于设置或者清除一个 bit 位

Redis setbit 命令语法格式

java 复制代码
SETBIT key offset value

范例

java 复制代码
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 ( 基数统计 )

Redis HyperLogLog 可以接受多个元素作为输入,并给出输入元素的基数估算值

基数

集合中不同元素的数量,比如 {'apple', 'banana', 'cherry', 'banana', 'apple'} 的基数就是 3

估算值

算法给出的基数并不是精确的,可能会比实际稍微多一些或者稍微少一些,但会控制在合 理的范围之内

HyperLogLog 的优点是

java 复制代码
即使输入元素的数量或者体积非常非常大,计算基数所需的空间总是固定的、并且是很小的

在Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基数

这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比

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

Redis PFADD 命令

Redis PFADD 命令将元素添加至 HyperLogLog

Redis PFADD 命令语法格式

java 复制代码
PFADD key element [element ...]

范例

java 复制代码
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

Redis 在 2.8.9 版本添加了 HyperLogLog 结构

Redis HyperLogLog 是用来做基数统计的算法

什么是基数?

假如我们有一个数据集 {1, 3, 5, 7, 5, 7, 8}

那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数 (不重复元素个数) 为5

基数估计 就是在误差可接受的范围内,快速计算基数

范例

下面的范例演示了 HyperLogLog 的工作过程

java 复制代码
127、0.0.1:6379> PFADD language "PHP"
1) (integer) 1
127、0.0.1:6379> PFADD language "Python"
1) (integer) 1
127、0.0.1:6379> PFADD language "Perl"
1) (integer) 1
127、0.0.1:6379> PFCOUNT language
(integer) 3

下表列出了 Redis HyperLogLog 命令

相关推荐
小蜗牛慢慢爬行13 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger17 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud38 分钟前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡41 分钟前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷42 分钟前
Redis
数据库·redis·缓存
别这么骄傲1 小时前
lookup join 使用缓存参数和不使用缓存参数的执行前后对比
缓存
仰望大佬0071 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名1 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪1 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb