redis共有5种基本数据类型:
String(可以是字符串,整数或者浮点数)、
Hash(哈希,Redis hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。Redis 中每个 hash 可以存储 232 - 1 键值对(40多亿))、
Redis Hash 类型底层有两种编码格式:ziplist、hashtable,当哈希对象同时满足以下两种条件时,对象使用 ziplist
编码;不能满足则使用 hashtable
编码。
- 哈希对象保存的所有键值对的键和值的字符串长度都小于 64 字节;
- 哈希对象保存的键值对数量小于 512 个。
这里是可以由使用者自定义进行控制的,redis提供了这么几个参数:
hash-max-ziplist-value 64 // ziplist中最大能存放的值长度
hash-max-ziplist-entries 512 // ziplist中最多能存放的
List(列表)、
Set(集合)、
Zset(有序集合)
随着 Redis 版本的更新,后面又支持了四种数据类型: BitMap(2.2 版新增)、HyperLogLog(2.8 版新增)、GEO(3.2 版新增)、Stream(5.0 版新增)。
参考:16个 Redis 常见使用场景
1.string(字符串)
1.session
在多个应用之间共享数据
2.cache
热点数据缓存
3.分布式锁
只有redis的key不存在的时候,才能获得这个锁
2.string(数值类型)
1.counter
int类型,incr方法,例如:文章的阅读量、微博点赞数、允许一定的延迟,先写入Redis再定时同步到数据库
2.限流器
int类型,incr方法,以访问者的ip和其他信息作为key,访问一次增加一次计数,超过次数则返回false
3.全局ID生成器
场景:用于保证分库分表之后主键的全局唯一性,参考:10丨发号器:如何保证分库分表后 ID 的全局唯一性?
3.hash
1.购物车
选择 hash 的话,每个用户的购物车对应一个 hash 对象,field 存的是skuID
,value 存的是购物车单种sku总量
。hash 的底层编码是 ziplist
和 hashtable
。
除了hash,其它的数据类型,都需要 get 出来计算后 set 回去,有的还需保存加入购物车时间
来排序。用来做购物车还是可以的,就是有点小麻烦,也没有充分利用 Redis
的数据类型(充分利用的话性能有很大的优势);而 hash 就不一样了,我们满足它以 ziplist
编码的条件,它就是**有序
的了 ,不需要额外计算,可以直接使用 Redis
命令来完成对购物车的维护,性能上无疑达到了最优**。
参考:SpringBoot2 | 第二十九篇:Redis 实现购物车
4.bitmap
1.在线用户统计,留存用户统计
因为bit非常节省空间(1 MB=8388608 bit),可以用来做大数据量的统计。
Redis
的位图就是一个由二进制位组成的数组, 通过将数组中的每个二进制位与用户 ID 进行一一对应, 我们可以使用位图去记录每个用户是否在线。
参考:使用redis中的位图(bitmap)统计在线人数
5.list
1.消息队列
使用LPUSH指令来进行入列操作,使用RPOP指令来进行出列操作
参考:Redis系列14:使用List实现消息队列
6.zset
1.排行榜
参考:redis zset实现排行榜
2.最近浏览功能
使用redis的list和zset都可以实现
list实现参考:使用 Redis 缓存来实现用户最近浏览的商品列表
zset实现参考:如何实现类似知乎的功能查看最近1000条记录呢?
参考:Redis经典案例场景