Redis之Redis的数据类型

1,835 阅读14分钟

​1.Redis的数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(无序集合)及ZSet(有序集合)

2.String(字符串)

2.1Sting介绍

1.string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value, 但最大不能超过512M。

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

2.2String特点

1.字符串类型是redis最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习尊定基础

2.字符串类型实际上可以是字符串(简单的字符串、复杂的字符串(xml、json)、数字(整数、浮点数)、二进制(图片、音频、视频).

2.3String应用场景

1. 缓存功能字符串最经典的使用场景,redis最为缓存层,Mysql作为储存层,绝大部分请求数据都是redis中获取,由于redis具有支撑高并发特性,所以缓存通常能起到加速读写和降低 后端压力的作用。

2.计数器许多运用都会使用redis作为计数的基础工具,他可以实现快速计数、查询缓存的功能,同时数据可以一步落地到其他的数据源。如:视频播放数,微博的评论数、点赞数、分享数,抖音作品的收藏数,京东商品的销售量、评价数系统就是使用redis作为视频播放数计数的基础组件。

3.共享session集群模式下,在应用不多的情况下一般使用容器自带的session复制功能就能满足,当应用增多相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的session服务,session不再由容器管理,而是由session服务及内存数据库管理。 在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息都直接从redis中集中获取。

4.限速:处于安全考虑,每次进行登录时让用户输入手机验证码,为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率。

2.4String常用命令

01 set :用于给指定的key设置value,支持设置已存在的key
02 get:用于取指定key的value
03 setnx:用于给指定的key设置value,如果key已经存在则返回0。nx代表:not exist
04 setex:用于给指定的key设置value,并且需要指定该key的有效时间。10秒后则返回为空
05 setrange:给指定的key的值重新覆盖内容,从4指定位置,替换内容为ming,最终结果为xiaoming
06 mset:批量设置key对应的value值,以下设置username、age、sex 分别对应 wangwu、10、1
07 msetnx:批量设置key对应的value值,如果key已存在则返回0。由于以上设置过,则结果返回0
08 getset:给指定key设置新值,并且返回之前原始数据。
09 getrange:返回一个字符串的子字符串,相当于字符串截取,下标0是起始位置,下标3是结尾位置
10 mget:批量获取key对应的value,按顺序展示
11 incr:将指定key中存储的数字值增一,必须是数字类型,否则会返回错误信息
11 incrby:将指定key中存储的数字指定增加多少
12 decr:将指定key中存储的数字值减一,必须是数字类型,否则会返回错误信息
13 decrby:将指定key中存储的数字指定减少多少
14 append:给指定的key中的值追加字符串
15 strlen:返回指定key中value的长度

3. Hash(哈希)

3.1Hash介绍

Redis hash 是一个键值(key/value)对集合,类似Java里面的Map<String,Object>,

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

3.2 Hash的应用场景

哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。

所以存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据以及可以购物车。

3.3Hash的命令

1.hset key field value设置一个散列,但是在散列中一次只能设置一个属性,如果要批量设置多个属性,则需要使用 hmset命令
​
2.hget key field获取指定key对应的散列中的指定属性对应的值,也是只能每次获取一个属性对应的值,如果要获取批量属性值,则需要使用命令 hmget
​
3.hmset key field value[(field value)...]设置一个散列,例如:hmset key1 name lonely age 18,该追令会生成一个key为key1的散列,散列中的属性有两个 分别是 name以及age,对应的值分别是 lonely和18
​
4.hmget key field...返回指定key对应的散列中指定key-name对应的值,例如上例子的基础上,调用 hmget key1 name指令的结果就是 从key1对应的散列中,获取属性 name对应的值 lonely就是结果了
​
5.hdel key field...删除指定key对应的散列中指定field...的信息。 例如有key1:{name:lonely,age:25},那么使用命令hdel key1 age;的结果是删除了 age属性信息,即 只剩下 key1:{name:lonely}
​
6.hlen key返回指定key对应的散列中键值对的数量
​
7.hexists key field 判断指定key对应的散列中是否存在field属性的键值对8.hkeys key  返回指定key对应的散列的key集合,例如存在 key1:{name:lonely,age:25},那么使用hkeys key1命令的结果就是 {name,age}
​
9.hvals key 同hkeys命令类似,不过hvals命令返回的指定key对应散列的value集合
​
9.hgetall key 返回指定key对应的所有键值对信息
​
10.hincrby key field increment 将指定key对应的散列中指定属性对应的value递增increment个单位,注意只有值是数值类型才可以生效,返回递增后的结果

4.List(列表)

4.1List介绍

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

4.2List的特点

1. 列表类型是用来储存多个有序的字符串,列表中的每个字符串成为元素(element)

2.在redis中,可以列表两端插入(pubsh)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下表的元素等。

3.列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

4.列表的元素是有序的,这就意味着可以通过索引下标获取某个或某个范围内的元素列表。列表内的元素是可以重复的。

4.3List的应用场景

1.消息队列: redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端是用lupsh从列表左侧插入元素, 多个消费者客户端使用brpop命令阻塞时的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性

2.文章列表:每个用户都有属于自己的文章列表,现在需要分页展示文章列表,此时可以考虑使用列表,列表不但有序同时支持按照索引范围获取元素。

3. 最新列表list类型的lpush命令和lrange命令能实现最新列表的功能,每次通过lpush命令往列表里插入新的元素,然后通过lrange命令读取最新的元素列表,如朋友圈的点赞列表、评论列表。

4.4Lsit的常用命令

复制代码
01 lpush :将一个元素或者多个元素新增到列表的头部,返回当前list中元素数量,采用的是 栈。
02 lrange:返回list集合中指定区间中的元素,0下标代表第一个元素,-1代表最后一个元素。
03 rpush:将一个元素或者多个元素新增到列表的尾部,返回当前list中元素数量,采用的是 队列。
04 linsert:在指定列表的元素前或者后插入元素
05 lset:设置list列表中指定元素下标的值, 下标0代表第一个元素,替换成了bear。
06 lrem:从对应list列表中删除n和value相同的元素,"lrem list  1 noe"代表在list列表中删除1和noe相同的元素。
​
07 ltrim:保留指定key值范围内的数据,已知list列表有三个元素,现在只想保留前两个,最后显示tow已经去掉了
​
08 lpop:从列表头部删除一个元素,返回删除的元素值。 
09 rpop:从列表尾部删除一个元素,返回删除的元素值。
10 rpoplpush:从第一个列表尾部移除一个元素并且添加到第二个列表中头部从第一个列表中尾部移除一个元素 ,mylist2尾部的元素elephant,rpop命令干的事往第二个列表的头部添加一个元素,list中的头部添加元素elephant,lpush命令干的事
​
11 lindex: 返回列表中指定下标的元素值,元素下标0开始
12 llen:返回列表中元素的个数
复制代码

5.Set(集合)

5.1Set介绍

Redis 的 Set 是 string 类型的无序集合。它是通过哈希表(HashTable)实现的.

5.2Set特点

1.set也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素。

2.set中的元素是 无序的,不能通过索引下标获取元素

3. redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、 差集,并合理的使用好集合类型,能在实际开发中解决很多实际问题

5.3set应用场景

1. 好友/关注/粉丝/感兴趣的人集合:set类型唯一的特点使得其适合用于存储好友/关注/粉丝/感兴趣的人集合,集合中的元素数量可能很多,每次全部取出来成本不小,set类型提供了一些很实用的命令用于直接操作这些集合,如 a. sinter命令可以获得A和B两个用户的共同好友 b. sismember命令可以判断A是否是B的好友c. scard命令可以获取好友数量 d. 关注时,smove命令可以将B从A的粉丝集合转移到A的好友集合

2.随机展示:app首页的展示区域有限,但是又不能总是展示固定的内容,一种做法是先确定一批需要展示的内容,再从中随机获取,如:酷狗音乐K歌擂台赛当日的打擂歌曲共29首,首页随机展示5首;昨日打擂金曲共200首,首页随机展示30首。

3.标签(tag):set集合 类型比较典型的使用场景,如一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,我们博客网站常常使用到的兴趣标签,把一个个有着相同爱好,关注类似内容的用户利用一个标签把他们进行归并。

4.共同好友功能: 共同喜好,或者可以引申到二度好友之类的扩展应用。

5.统计网站的独立IP: 利用set集合当中元素不唯一性,可以快速实时统计访问网站的独立IP。

  6.黑名单/白名单:经常有业务出于安全性方面的考虑,需要设置用户黑名单、ip黑名单、设备黑名单等,set类型适合存储这些黑名单数据,sismember命令可用于判断用户、ip、设备是否处于黑名单之中.

7.其他应用 生成随机数,比如抽奖

4.4Set的常用命令

复制代码
1 SADD key member1 [member2] 向集合添加一个或多个成员
2  SCARD key 获取集合的成员数
3  SDIFF key1 [key2] 返回给定所有集合的差集
4  SDIFFSTORE destination key1 [key2] 返回给定所有集合的差集并存储在 destination 中
5  SINTER key1 [key2] 返回给定所有集合的交集
6  SINTERSTORE destination key1 [key2] 返回给定所有集合的交集并存储在 destination 中
7  SISMEMBER key member 判断 member 元素是否是集合 key 的成员
8  SMEMBERS key 返回集合中的所有成员
9  SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
10  SPOP key 移除并返回集合中的一个随机元素
11  SRANDMEMBER key [count] 返回集合中一个或多个随机数
12  SREM key member1 [member2] 移除集合中一个或多个成员
13  SUNION key1 [key2] 返回所有给定集合的并集
14  SUNIONSTORE destination key1 [key2] 所有给定集合的并集存储在 destination 集合中
15  SSCAN key cursor [MATCH pattern] [COUNT count] 迭代集合中的元素
复制代码

6.ZSet(sorted set:有序集合)

6.1ZSet介绍

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员不同的是每个元素都会关联一个double类型的分数。

redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

6.2ZSet特点

ZSet保留了集合不能有重复成员的特性,但不同得是,有序集合中的元素是可以 排序的,但是它和列表的使用索引下标作为排序依据不同的是,它给每个元素设置一个分数,作为排序的依据;

6.3ZSet应用场景

1. 排行榜有序集合经典使用场景,例如京东每日的手机销量排行、京东的月度销量榜单、商品按时间的上新排行榜,视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面: 按照时间、按照播放量、按照获得的赞数等。

6.4ZSet常用命令

复制代码
1.ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的分数
2  ZCARD key 获取有序集合的成员数
3  ZCOUNT key min max 计算在有序集合中指定区间分数的成员数
4  ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment
5  ZINTERSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
6  ZLEXCOUNT key min max 在有序集合中计算指定字典区间内成员数量
7  ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合指定区间内的成员
8  ZRANGEBYLEX key min max [LIMIT offset count] 通过字典区间返回有序集合的成员
9  ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 通过分数返回有序集合指定区间内的成员
10  ZRANK key member 返回有序集合中指定成员的索引
11  ZREM key member [member ...] 移除有序集合中的一个或多个成员
12  ZREMRANGEBYLEX key min max 移除有序集合中给定的字典区间的所有成员
13  ZREMRANGEBYRANK key start stop 移除有序集合中给定的排名区间的所有成员
14  ZREMRANGEBYSCORE key min max 移除有序集合中给定的分数区间的所有成员
15  ZREVRANGE key start stop [WITHSCORES] 返回有序集中指定区间内的成员,通过索引,分数从高到低
16  ZREVRANGEBYSCORE key max min [WITHSCORES] 返回有序集中指定分数区间内的成员,分数从高到低排序
17  ZREVRANK key member 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
18  ZSCORE key member 返回有序集中,成员的分数值
19  ZUNIONSTORE destination numkeys key [key ...] 计算给定的一个或多个有序集的并集,并存储在新的 key 中
20  ZSCAN key cursor [MATCH pattern] [COUNT count] 迭代有序集合中的元素(包括元素成员和元素分值)