官方文档
https://redis.io/docs/data-types/
五种基础数据类型
String
简介
Redis 字符串存储字节序列,包括文本、序列化对象和二进制数组。因此,字符串是最基本的 Redis 数据类型。它们通常用于缓存,但它们支持额外的功能,使您也可以实现计数器和执行按位运算。
结构存储的值
可以是字符串、整数或浮点数
结构的读写能力
对整个字符串或字符串的一部分进行操作;对整数或浮点数进行自增或自减操作;
参考命令
https://redis.io/commands/?group=string
实战场景
1.缓存
经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力
2.计数器
redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
3.分布式锁
setNX命令实现
Lists
简介
Redis中的List其实就是链表(Redis用双端链表实现List)。
使用List结构。我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。
参考命令
https://redis.io/commands/?group=list
实战场景
1.微博TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息。
2.消息队列
sets
简介
Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。
参考命令
https://redis.io/commands/?group=set
应用场景
1.跟踪唯一项目(例如,跟踪访问给定博客文章的所有唯一 IP 地址)。
2.表示关系(例如,具有给定角色的所有用户的集合)。
3.执行常见的集合运算,例如交集、并集和差集。
4.标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
5.点赞,或点踩,收藏等,可以放到set中实现
hashes
简介
Redis 哈希是结构化为字段值对集合的记录类型。您可以使用散列来表示基本对象并存储计数器分组等。
参考命令
https://redis.io/commands/?group=hash
使用场景
缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等
sorted sets(ZSet)
简介
Redis 有序集合和集合一样也是。string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。
有序集合实现的方式
1.压缩链表
ziplist是为了提高存储效率而设计的一种特殊编码的双向链表。它可以存储字符串或者整数,存储整数时是采用整数的二进制而不是字符串形式存储。它能在O(1)的时间复杂度下完成list两端的push和pop操作。但是因为每次操作都需要重新分配ziplist的内存,所以实际复杂度和ziplist的内存使用量相关
2.跳跃表(zSkiplist)
跳跃表的性能可以保证在查找,删除,添加等操作的时候在对数期望时间内完成,这个性能是可以和平衡树来相比较的,而且在实现方面比平衡树要优雅,这是采用跳跃表的主要原因。跳跃表的复杂度是O(log(n))。
参考命令
https://redis.io/commands/?group=sorted-set
应用场景
1.排行榜。例如,您可以使用排序集轻松维护大型在线游戏中最高分的有序列表。
2.速率限制器。特别是,您可以使用排序集来构建滑动窗口速率限制器,以防止过多的 API 请求。
Streams
Redis Streams(Redis5.0之后新增)
参考命令
https://redis.io/commands/?group=streams
特殊类型
geospatial
简介
这个功能可以推算地理位置的信息: 两地之间的距离, 方圆几里的人
参考命令
https://redis.io/commands/?group=geo
应用场景
Redis 地理空间索引让您可以存储坐标并进行搜索。此数据结构可用于查找给定半径或边界框内的附近点。
bitmaps(位图)
简介
Redis 位图是字符串数据类型的扩展,可让您将字符串视为位向量。您还可以对一个或多个字符串执行按位运算
参考命令
https://redis.io/commands/?group=bitmap
应用场景
比如:统计用户信息,活跃,不活跃! 登录,未登录! 打卡,不打卡! 两个状态的,都可以使用 Bitmaps!
如果存储一年的打卡状态需要多少内存呢? 365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
bitfields(Redis 位域)
简介
有效地将多个计数器编码为字符串值。位域提供原子获取、设置和递增操作,并支持不同的溢出策略
参考命令
https://redis.io/commands/bitfield/
应用场景
附近的人 ==> 获得所有附近的人的地址, 定位, 通过半径来查询
HyperLogLog(基数统计)
简介
数据结构提供了对大集合的基数(即元素的数量)的概率估计。有关详细信息
参考命令
https://redis.io/commands/?group=hyperloglog
应用场景
这个结构可以非常省内存的去统计各种计数,比如注册 IP 数、每日访问 IP 数、页面实时UV、在线用户数,共同好友数等。