redis 10大数据类型

Redis 10大数据类型

这里说的数据类型是value的数据类型,key的类型都是字符串。

Redis key

Redis key是String类型,也是二进制安全的,我们可以使用任何二进制序列作为键,从像“foo”这样的字符串到 JPEG 文件的内容。

关于Redis的key有以下规则和建议:

  1. 太长的key不是个好的选择,不仅因为消耗内存,而且在数据中查找key也需要进行多次复杂的key比较。
  2. 太短的键值通常也不是好的选择,如果你要用”u:1000:pwd”来代替”user:1000:password”,这本身没有什么问题,但后者更易阅读,并且由此增加的空间消耗相对于key object和value object本身来说很小。当然,没人阻止您一定要用更短的键值节省一丁点儿空间。
  3. 最好是坚持一种命名模式。例如:”object-type🆔field”就是个不错的注意,像这样:“user:1000:password”。对多单词的字段名中可以加上一个点,就像这:“comment🔢reply.to”��:
  4. 允许的最大key的大小为 512 MB

数据类型概览

img

String

介绍

string是redis最基本的类型,一个key对应一个value。

string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。

string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M。

常用指令

基础指令

img

批量设置

img

计数器(字符串内容为整数时可以用)

img

过期

img

不存在插入

img

应用场景

缓存对象

使用 String 来缓存对象有两种方式:

直接缓存整个对象的 JSON,命令例子: SET user:1 '{"name":"haoer", "age":12}'。

采用将 key 进行分离为 user:ID:属性,采用 MSET 存储,用 MGET 获取各属性值,命令例子: MSET user:1:name haoer user:1:age 12 user:2:name zhangsan user:2:age 20。

常规计数

因为 Redis 处理命令是单线程,所以执行命令的过程是原子的。因此 String 数据类型适合计数场景,比如计算访问次数、点赞、转发、库存数量等等

分布式锁

共享session

img

List(列表)

Redis列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)他的底层实际是个双端链表,最多可以包含2^32-1个元素(4294967295, 每个列表超过40亿个元素)

常用指令

img

Hash

Redis hash是一个String类型的field(字段)和value(值)的映射表,hash特别适合用于存储对象。Redis中每个hash可以存储2^32-1个键值对(40多亿)

常用指令

Set(集合)

Redis的Set是String类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象编码可以使intset或者hashtable.
Redis 中的Set集合是通过哈希表实现的,所以添加、删除、查找的时间复杂度都是O(1)。集合中最大的成员数为2^32-1(40多亿)

常用指令

添加

SADD key member [member ...]

遍历集合

SMEMBERS key

校验是否在集合中

SISMEMBER key member

删除元素

SREM key member [member ...]

元素个数

SCARD key

随机展示指定数量的元素

SRANDMEMBER key [count]

随机弹出指定数量元素

SPOP key [count]

从一个集合移动到另一个集合

SMOVE source destination member

集合运算

差集
SDIFF key [key ...]
并集
SUNION key [key ...]
交集
SINTER key [key ...]
交集的基数 SINTERCARD numkeys key [key ...] [LIMIT limit]

limit 用来提前返回结果,如 A B 两个集合数量很大时如果我们只想知道是否有相同元素则可指定 limit 1当找到第一个元素时会直接返回,不会对整个集合进行运算再返回,可以提高运算效率。默认值为0表示无限制。

使用场景

抽奖

SRANDMEMBER key [count] SPOP key [count]

朋友圈点赞

sadd、srem

Zset(sorted set :有序集合)

Redis zset 和set一样也是String类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,redis正式利用这个分数来为集合中的成员从小到大排序。
Zset的元素是唯一的,但是分数(scope) 却可以重复。Zset也是通过hash表实现的,所以增删改查时间复杂度都是O(1),最大成员个数2^32 -1

常用指令

添加

zadd key score member[score member...]

按顺序返回

zrange key start stop[withscores]

按倒序返回

zrevrange

返回分数范围内的数据

zrangescore key min max [withscores][limit offser count]

获取元素分数

zscore key member

获取元素数量

zcard key

删除元素

zrem key values

增减元素的分数

zincrby key increment member

获取分数范围内元素个数

zcount key min max

获取成员下标

zrank key values zrevrank key values

GEO(地理空间)

Redis GEO主要用于存储地理位置信息,并对存储的信息进行操作,包括添加地理位置的坐标、获取地理位置的坐标、计算两个位置的距离。根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。

常用命令

添加坐标 GEOADD

GEOADD city 116.403963 39.915119 "天安门" 116.403414 39.924091 "故宫" 116.024067 40.362639 "长城"

返回经纬度 GEOPOS

GEOPOS city 长城

返回坐标的GEOHASH

GEOHASH city 长城

两个位置的距离GEODIST

GEODIST city 长城 故宫 km

GEORADIUS 以半径为中心查找xxx

GEORADIUS city 116.418017 39.914402 10 km withdist

HyperLogLog

HyperLogLog 是用来做基数同级的算法,HyperLogLog的优点是,在输入元素的数量或者体积非常非常大的时候,计算基数所需的空间总是固定的而且是很小。
在Redis里面,每个HyperLogLog键只需要花费12KB内存,就可以就算接近2^64个不同元素的基数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明的对比。但是HyperLogLog只会根据输入的元素计算基数,而不会存储输入元素本身,所以HyperLogLog不能像集合那样,返回各个元素。

名称解释

基数:一种数据集,去重复后的真实个数
案例:I ={1 2 1 2 3 4} 去重复 基数 = {1 2 3 4 } = 4

命令

添加 pfadd

pfadd hll01 1 2 1 2 3 4

返回计算的基数

pfcount hll01

pfmerge 将多个合并成一个

pfmerge hll01 hll02

使用场景

网站访问量统计(去重)

bitmap位图

由0和1状态表现的二进制位的bit数组,用String类型作为底层数据结构实现的一种统计二值状态的数据类型。位图的本质就是数组.
Bitmap支持的最大位数是2^32为,他可以极大的节约存储空间,使用512M内存就可以存储多达42.9亿的字节信息

常用命令

添加 setbit key offset value

setbit haoer:1 0 1

获取 getbit key offset

getbit haoer:1 0

获取1的数量

bitcount haoer:k

bitop

BITOP 命令用于对一个或多个保存二进制位的字符串 KEY 进行位操作,并将结果保存到 DESTKEY 上。
当 BITOP 处理不同长度的 字符串 时,较短的那个字符串所缺少的部分会被看作 0 。空的 KEY 也被看作是包含 0 的字符串序列

127.0.0.1:6379> setbit haoer-1 1 1 0 127.0.0.1:6379> setbit haoer-2 0 1 0 127.0.0.1:6379> setbit haoer-2 1 1 0 127.0.0.1:6379> bitop and haoer-and haoer-1 haoer-2 1

位域

通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。

说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。

127.0.0.1:6379> bitfield fieldKey get i8 0 104 127.0.0.1:6379> bitfield fieldKey get i8 8 101 127.0.0.1:6379> bitfield fieldKey set i8 8 20 101 127.0.0.1:6379> get fieldKey hllo 127.0.0.1:6379> bitfield fieldKey incrby i8 8 100 80 127.0.0.1:6379> get fieldKey hPllo

OVERFLOW 溢出控制[wrap|sat|fail]

WRAP:使用回绕方法处理有符号和无符号整数的溢出情况(默认)
SAT:使用饱和计算方法处理溢出,下溢出的结果为最小的整数值,而上溢计算的结果为最大证书
FAIL:拒绝执行导致上溢和下溢情况出现的计算,并向用户返回空值表示计算未执行

Stream

Redis Stream 是 Redis 5.0 版本新增加的数据结构。
Redis Stream 主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃。
简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失


__EOF__

本文作者hoaer
本文链接https://www.cnblogs.com/hoaer/p/17239978.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   古拉加斯·浩二  阅读(64)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示