目录

简介

String(字符串)

应用场景:

Hash(哈希)

使用场景:

List(列表)

应用场景:

Set(集合)

使用场景:

zset(sorted set:有序集合)

使用场景:


简介

        Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储,它还支持数据的备份,即master-slave模式的数据备份,同样Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

        Redis支持的五大数据类型包括String(字符串 用法: 键 值),Hash(哈希 类似Java中的 map 用法: 键 键值对),List(列表 用法:键 集合 不可以重复),Set(集合 用法:键 集合 可以重复),Zset(sorted set 有序集合 用法: 键 值 值)

安装参考: Docker安装Redis

String(字符串)

string 类型的值最大能存储 512MB。

应用场景:

        String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String,也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次)。

Hash(哈希)

        Redis hash 是一个键值(key=>value)对集合。

hash 特别适合用于存储对象。

使用场景:

        存储、读取、修改用户属性

        我们简单举个实例来描述下Hash的应用场景,比如我们要存储一个用户信息对象数据,包含以下信息: 用户ID,为查找的key,

        存储的value用户对象包含姓名name,年龄age,生日birthday 等信息, 如果用普通的key/value结构来存储,主要有以下2种存储方式:

        第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,

        如:set u001 "李三,18,20010101"

        这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。

        第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,

        如:mset user:001:name "李三 "user:001:age18 user:001:birthday "20010101" 虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。

        那么Redis提供的Hash很好的解决了这个问题。

List(列表)

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

应用场景:

        Redis list的应用场景非常多,也是Redis最重要的数据结构之一。

        我们可以轻松地实现最新消息排行等功能。

        Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。

Set(集合)

        Redis的Set是string类型的无序集合。

使用场景:

        1.共同好友、二度好友

        2. 利用唯一性,可以统计访问网站的所有独立 IP

特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

        比如在微博应用中,每个人的好友存在一个集合(set)中,这样求两个人的共同好友的操作,可能就只需要用求交集命令即可。

        Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实

实现方式:

        set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。

zset(sorted set:有序集合)

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

使用场景:

1.带有权重的元素,比如一个游戏的用户得分排行榜

2.比较复杂的数据结构,一般用到的场景不算太多