redis是单线程,(不适合存储比较大的数据)

        Redis存储方式以key和value的形式进行存储,也就是他不依赖于SQL存储的数据结构;

        因为redis的存储结构,所以一般他的key是以String的格式;

        redis 有5种基础的数据结构,分别为:String(字符串)、list(列表)、hash(字典)、set(集合)和zset(有序集合),redis的所有的数据结构都是以唯一的key字符串作为名称的,然后通过这个唯一的key值来获取相应的value数据,不同的数据结构的差异就在于value的数据结构的差异:

各个数据类型所适用场景:

一、String(字符串)

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

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

string类型是Redis最基本的数据类型,一个键最大能存储512MB。

使用场景:

  • 缓存功能:String字符串是最常用的数据类型,不仅仅是Redis,各个语言都是最基本类型,因此,利用Redis作为缓存,配合其它数据库作为存储层,利用Redis支持高并发的特点,可以大大加快系统的读写速度、以及降低后端数据库的压力。

  • 计数器:许多系统都会使用Redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其它存储介质当中进行永久保存。

  • 共享用户Session:用户重新刷新一次界面,可能需要访问一下数据进行重新登录,或者访问页面缓存Cookie,但是可以利用Redis将用户的Session集中管理,在这种模式只需要保证Redis的高可用,每次用户Session的更新和获取都可以快速完成。大大提高效率。

  • 分布式锁

  • 分布式系统全局序列号

二、Hash(哈希)

Redis hash 是一个string类型的field和value的映射表,hash特别适合用于存储对象。

Redis 中每个 hash 可以存储 2^32- 1 键值对(40多亿)。

使用场景:

  • 适用于存储对象,比如把用户的信息存到hash里,以用户id为key,用户的详细信息为value。
  • 电商购物车,以用户ID为key,商品ID为field,商品数量为value。

三、List(列表)

Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)

一个列表最多可以包含 2^32- 1 个元素 (4294967295, 每个列表超过40亿个元素)。

使用场景:

  • Stack栈:LPUSH+LPOP
  • Queue队列:LPUSH+RPOP
  • Blocking MQ阻塞队列:LPUSH+BRPOP
  • 最新列表,List 类型的 lpush 命令和 lrange 命令能实现最新列表的功能,每次通过 lpush 命令往列表里插入新的元素,然后通过 lrange 命令读取最新的元素列表,如朋友圈的点赞列表、评论列表:

       1、A关注了B,C等大V

       2、B发微博了,消息ID为1001:LPUSH msg:{A的ID}  1001

       3、C发微博了,消息ID为1002:LPUSH msg:{A的ID}  1002

       4、A查看最新的5条微博消息:LRANGE msg:{A的ID}  0 5

按照时间排序的这些朋友圈信息等

四、Set(集合)

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 中 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

集合中最大的成员数为 2^32- 1 (4294967295, 每个集合可存储40多亿个成员)。

使用场景:

  • 给用户添加标签,跟我们上面的例子一样。一个人对应多个不同的标签。
  • 好友/关注/粉丝/感兴趣的人集合,可以使用上面的取交集、并集相关的命令。
  • 随机展示,通过 srandmember 随机返回对应的内容,像一些首页获取动态内容可以这么玩。
  • 黑名单/白名单,有业务出于安全性方面的考虑,需要设置用户黑名单、ip 黑名单、设备黑名单等,set 类型适合存储这些黑名单数据,sismember 命令可用于判断用户、ip、设备是否处于黑名单之中。
  • 微信抽奖小程序

       1、点击参与抽奖加入集合:SADD item:1001   {userID}

       2、查看参与抽奖的所有用户:SMEMBERS item:1001

       3、抽取3名中奖者:SRANDMEMBER/SPOP item:1001 3   (SRANDMEMBER后,中奖的用户不会从集合中移除,SPOP 后,中奖的用户会从集合中移除)

五、zset(sorted set:有序集合)

Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

有序集合的成员是唯一的,但分数(score)却可以重复。

集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。 集合中最大的成员数为 2^32- 1 (4294967295, 每个集合可存储40多亿个成员)。

使用场景:

  • 标签:比如我们博客网站常常使用到的兴趣标签,把一个个有着相同爱好,关注类似内容的用户利用一个标签把他们进行归并。
  • 共同好友功能,共同喜好,或者可以引申到二度好友之类的扩展应用。
  • 统计网站的独立 IP。利用 set 集合当中元素不唯一性,可以快速实时统计访问网站的独立 IP。
  • 统计用户的点赞/取消点赞
  • 排行榜功能,比如展示获取赞数最多的十个用户
  • Zset本质就是Set结构上加了个排序的功能,除了添加数据value之外,还提供另一属性score,这一属性在添加修改元素时候可以指定,每次指定后,Zset会自动重新按新的值调整顺序。可以理解为有两列字段的数据表,一列存value,一列存顺序编号。操作中key理解为zset的名字,那么对延时队列又有何用呢?试想如果score代表的是想要执行时间的时间戳,在某个时间将它插入Zset集合中,它变会按照时间戳大小进行排序,也就是对执行时间前后进行排序,这样的话,起一个死循环线程不断地进行取第一个key值,如果当前时间戳大于等于该key值的socre就将它取出来进行消费删除,就可以达到延时执行的目的, 注意不需要遍历整个Zset集合,以免造成性能浪费。
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐