
常用五大数据类型
9大类型:String(字符类型)、Hash(散列类型)、List(列表类型)、Set(集合类型)、SortedSet(有序集合类型,简称zset)、Bitmap(位图)、HyperLogLog(统计)、GEO(地理)、Stream
Stream(了解即可)
- Redis Stream是 Redis 5.0 版本新增加的数据结构
- Redis Stream主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis宕机等,消息就会被丢弃。简单来说发布订阅(pub/sub)可以分发消息,但无法记录历史消息
- 而Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失。它算是redis自己消息功能的补充
- 但是,一般主流MQ都固定了(Kafka/RabbitMQ/RocketMQ/Pulsar),我们只用redis做缓存,不做mq消息的发送
- 命令不区分大小写,而key是区分大小写的
String
- String是Redis最基本的类型,一个key对应一个value。
- String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象
- String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
String的数据结构为简单动态字符串(Simple Dynamic String,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList - 存储( set key value) 获取(get key) 删除(del key)

分布式锁 
String应用场景
应用场景一: 比如抖音无限点赞某个视频或者商品,点一下加一次
应用场景二: 是否喜欢的文章(阅读数:只要点击了rest地址,直接可以使用incr key 命令增加一个数字1,完成记录数字) 
列表 list
①. 列表list是一个单键多值的 Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差  
List的数据结构为快速链表quickList
- 首先在列表元素较少的情况下会使用一块连续的内存存储,这个结构是ziplist,也即是压缩列表。
- 它将所有的元素紧挨着一起存储,分配的是一块连续的内存,当数据量比较多的时候才会改成quicklist

list的场景–微信公众号订阅的消息
1 大V作者李永乐老师和CSDN发布了文章分别是 11 和 22 2 关注了他们两个,只要他们发布了新文章,就会安装进我的List lpush likearticle:小智id 11 22 3 查看自己的号订阅的全部文章,类似分页,下面0~10就是一次显示10条 lrange likearticle:小智id 0 9 
集合 Set
- set是可以自动排重的,不允许元素重复
- Set数据结构是dict字典,字典是用哈希表实现的

应用场景一:微信抽奖小程序

应用场景二:微信朋友圈点赞

应用场景三:微博好友关注社交关系
共同关注的人  推可能认识的人 
哈希 hash
Hash类型对应的数据结构是两种: ziplist(压缩列表),hashtable(哈希表)。当field-value长度较短且个数较少时,使用ziplist,否则使用hashtable (Map<String,Map<Object,Object>>) 
应用场景:购物车模块
新增商品 → hset shopcar:uid1024 334488 1
新增商品 → hset shopcar:uid1024 334477 1
增加商品数量 → hincrby shopcar:uid1024 334477 1
商品总数 → hlen shopcar:uid1024
全部选择 → hgetall shopcar:uid1024

有序集合 Zset
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 
应用场景:实现一个文章访问量的排行榜
127.0.0.1:9736> zrange tops 0 -1 withscores
1) "java"
2) "100"
3) "mysql"
4) "200"
127.0.0.1:9736> zrevrangebyscore tops 300 100
1) "mysql"
2) "java"
127.0.0.1:9736> zrevrange tops 0 -1
1) "mysql"
2) "java"
应用场景:商品进行排序显示
应用场景:抖音热搜


这里的值用了timestamp,实现了按照时间排序 
持久化
- redis是一个内存数据库,当redis服务器重启,获取电脑重启,数据会丢失,我们可以将redis内存中的数据持久化保存到硬盘的文件中
Redis持久化策略有哪些?(RDB、AOF) Rdb:定时将数据保存在硬盘中(dump.rdb) Aof:保存所有操作的命令 - RDB(持久化机制默认)
默认方式,不需要进行配置,默认就使用这种机制 在一定的间隔时间中,检测key的变化情况,然后持久化数据 
日志记录的方式,可以记录每一条命令的操作。可以每一次命令操作后,持久化数据 
|