目录

图片来源:42张图,带你真正搞懂redis数据类型的底层_渐进refresh_Maxiaonan2的博客-CSDN博客
Redis是一个非关系型数据库(NoSQL),它是一种Key-Value型的NoSQL。Redis所有的key(键)都是字符串。对应的value(值)的数据类型,主要包括常见的5种数据类型,分别是:String、List、Set、Zset(Sorted set)、Hash。

图片来源:百度图片搜索
String是Redis最基本的类型,一个Key对应一个Value。String类型是二进制安全的,这意味着Redis的String可以包含任何数据,例如jpg图片或者序列化的对象。Redis中一个String类型的Value最多可以是512M。
String的数据结构为简单动态字符串(SimpleDynamicString,缩写SDS)。是可以修改的字符串,内部结构实现上类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。

图片来源:https://baijiahao.baidu.com/s?id=1766926928060188759&wfr=spider&for=pc
- root@4be4fde36857:/data# redis-cli
- 127.0.0.1:6379> set fruit apple
- OK
- 127.0.0.1:6379> get fruit
- "apple"
-
- 127.0.0.1:6379> MGET fruit food
- 1) "banana"
- 2) "toufu"
- 127.0.0.1:6379> strlen food
- (integer) 5
- 127.0.0.1:6379> set number 6
- OK
- 127.0.0.1:6379> INCR number
- (integer) 7
- 127.0.0.1:6379> decr number
- (integer) 6
-
- 127.0.0.1:6379> setnx lock user1
- (integer) 1
-
应用场景
缓存:经典使用场景,把常用信息,字符串,图片或者视频等信息放到Redis中,Redis作为缓存层,MySQL做持久化层,降低MySQL的读写压力
计数器:Redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
Session:常见方案Spring Session + Redis实现Session共享。
Redis 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边)。它的底层实际是个双向链表,这意味着List的插入和删除操作效率会比较快,时间复杂度是O(1)。使用List结构,我们可以轻松地实现最新消息排队功能,List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。

图片来源:https://baijiahao.baidu.com/s?id=1766926928060188759&wfr=spider&for=pc
- 127.0.0.1:6379> LPUSH lnums 1
- (integer) 1
- 127.0.0.1:6379> LPUSH lnums 2
- (integer) 2
- 127.0.0.1:6379> LPUSH lnums 3
- (integer) 3
- 127.0.0.1:6379> get lnums
- (error) WRONGTYPE Operation against a key holding the wrong kind of value
- 127.0.0.1:6379> KEYS lnums
- 1) "lnums"
- 127.0.0.1:6379> LRANGE lnums 0 3
- 1) "3"
- 2) "2"
- 3) "1"
- 127.0.0.1:6379> del lnums
- (integer) 1
- 127.0.0.1:6379> KEYS *
- 1) "key:__rand_int__"
- 2) "book"
- 3) "fruit"
- 4) "food"
- 127.0.0.1:6379> lpush nums 1 2 3 4 5 6
- (integer) 6
- 127.0.0.1:6379> LRANGE nums 0 7
- 1) "6"
- 2) "5"
- 3) "4"
- 4) "3"
- 5) "2"
- 6) "1"
- 127.0.0.1:6379> lpop nums 6
- 1) "6"
- 2) "5"
- 3) "4"
- 4) "3"
- 5) "2"
- 6) "1"
- 127.0.0.1:6379> lpop nums
- (nil)
-
- 127.0.0.1:6379> LPUSH nums 1 2 3 3 4 4 4
- (integer) 7
- 127.0.0.1:6379> lpop nums 1
- 1) "4"
- 127.0.0.1:6379> LRANGE nums 0 7
- 1) "4"
- 2) "4"
- 3) "3"
- 4) "3"
- 5) "2"
- 6) "1"
- 127.0.0.1:6379> lrem nums 0 1
- (integer) 1
- 127.0.0.1:6379> LRANGE nums 0 7
- 1) "4"
- 2) "4"
- 3) "3"
- 4) "3"
- 5) "2"
-
应用场景
消息队列:List类型的lpop和rpush(或者反过来,lpush和rpop)能实现队列的功能,故而可以用Redis的List类型实现简单的点对点的消息队列。
排行榜:List类型的range命令可以分页查看队列中的数据,但是只有顶式计算的排行榜才适合使用List类型存储。
最新列表:List类型的lpush命令和range命令能实现最新列表的功能.每次通过lpush的命令往列表里插入新的元素,然后通过lrange命令读取最新元素列表,如朋友圈的点赞列表、评论列表。
Redis Set 类型是一个无序并唯一的键值集合,它的存储顺序不会按照插入的先后顺序进行存储。相对于列表,Redis的Set是String类型的无序集合。它底层其实是一个Value为Null的Hash表,所以添加,删除,查找的复杂度都是O(1)。

图片来源:https://baijiahao.baidu.com/s?id=1766926928060188759&wfr=spider&for=pc
- 127.0.0.1:6379> sadd numsset 1 2 3 3 4 4 4
- (integer) 4
- 127.0.0.1:6379> SMEMBERS numsset
- 1) "1"
- 2) "2"
- 3) "3"
- 4) "4"
使用场景
推荐算法:通过sinter命令计算交集,比如美团给你推荐附近外卖时就可以根据你的外卖记录与附近商家计算交集
推送安全提示:微信群成员保存在一个set中,用户好友也保存在Set中。当用户加入群聊时可以提醒非好友用户注意安全。
Redis有序集合Zset是一个没有重复元素的可排序的字符串集合。不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分是可以重复的 。因为元素是有序的,所以也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
Zset是Redis提供的一个非常特别的数据结构,一方面它等价于Java的数据结构Map
Zset底层使用了两个数据结构:
Hash:hash的作用就是关联元素value和权重score,保障元素value的唯一性,可以通过元素value找到相应的score值。
跳跃表,跳跃表的目的在于给元素value排序,根据score的范围获取元素列表。

图片来源:https://baijiahao.baidu.com/s?id=1766926928060188759&wfr=spider&for=pc
- 127.0.0.1:6379> zadd numssorted 1 lhr 2 gzq 3 lhx 4 lb
- (integer) 4
- 127.0.0.1:6379> ZCARD numssorted
- (integer) 4
- 127.0.0.1:6379> ZREMRANGEBYSCORE numssorted 1 4
- (integer) 4
- 127.0.0.1:6379> ZCARD numssorted
- (integer) 0
- 127.0.0.1:6379> zadd numssorted 1 lhr 2 gzq 3 lhx 4 lb
- (integer) 4
- 127.0.0.1:6379> ZCOUNT numssorted 1 5
- (integer) 4
- 127.0.0.1:6379> ZRANGEBYSCORE numssorted 1 5
- 1) "lhr"
- 2) "gzq"
- 3) "lhx"
- 4) "lb"
- 127.0.0.1:6379> ZREVRANGE numssorted 1 5
- 1) "lhx"
- 2) "gzq"
- 3) "lhr"
- 127.0.0.1:6379> ZCOUNT numssorted 1 5
- (integer) 4
- 127.0.0.1:6379> ZREVRANGE numssorted 1 7
- 1) "lhx"
- 2) "gzq"
- 3) "lhr"
应用场景
排行榜:例如外卖商家的销量排行榜,可以使用店家的订单做score,这个查询出来的结果就是有序的权重队列:score作为优先级,这样取出来的数据权重都是最大优先执行的延时任务score作为任务启动执行时间,取值时判断该值执行即可。
Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。它的内部采用数组+链表的结构,类似java里的HashMap

图片来源:https://baijiahao.baidu.com/s?id=1766926928060188759&wfr=spider&for=pc
- 127.0.0.1:6379> HSET hbook type history price 30
- (integer) 2
- 127.0.0.1:6379> HGET hbook *
- (nil)
- 127.0.0.1:6379> HGET hbook
- (error) ERR wrong number of arguments for 'hget' command
- 127.0.0.1:6379> HGET hbook type
- "history"
应用场景
商品对象、用户对象。这个场景需要验证性对待,如果商品对象、用户对象信息每次都需要全量的话不妨存string,但是仅仅部分使用就可以考虑使用hash结构SKU等信息,这个场景hash就比较合适了。一个hash结构中可以存储某个商品所有sku。
参考:
https://baijiahao.baidu.com/s?id=1766926928060188759&wfr=spider&for=pc
Redis数据结构:Set类型全面解析_栗筝i的博客-CSDN博客
Redis入门:五大数据类型有哪些? - 腾讯云开发者社区-腾讯云
感谢阅读,码字不易,多谢点赞!如有不当之处,欢迎反馈指出,感谢!
