Redis教程(二)Redis数据类型介绍与使用

一、Redis的数据类型

Redis 3.x版本中常用的数据类型有字符串类型、哈希类型、集合类型、有序集合类型与列表类型,合理使用正确的数据类型,可以有效的降低开发工作,对于在MySQL中一些需要复杂SQL才能完成的工作,在Redis中通过一条简单命令即可实现。

二、字符串类型

字符串类型是redis最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的,所以字符串类型能为其他四种数据结构的学习尊定基础。字符串类型实际上可以是字符串(简单的字符串、复杂的字符串(xml、json)、数字(整数、浮点数)、二进制(图片、音频、视频)),但最大不能超过512M。

  • 使用场景:

    • 缓存功能:字符串最经典的使用场景,redis最为缓存层,Mysql作为储存层,绝大部分请求数据都是redis中获取,由于redis具有支撑高并发特性,所以缓存通常能起到加速读写和降低 后端压力的作用。(redis为何具备支撑高并发的特性,下次文章讲解)。
    • 计数器:许多运用都会使用redis作为计数的基础工具,他可以实现快速计数、查询缓存的功能,同时数据可以一步落地到其他的数据源。如:视频播放数系统就是使用redis作为视频播放数计数的基础组件。
    • 共享session:出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不同服务器上,用户刷新一次访问可能会需要重新登录,为避免这个问题可以用redis将用户session集中管理,在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息都直接从redis中集中获取。
    • 限速:处于安全考虑,每次进行登录时让用户输入手机验证码,为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率。

三、Hash类型

常当作数据库缓存使用,如商品购物车、用户或者产品的详情信息。哈希类型的数据适合存储对象,其数据结构有点像MySQL表中的一行数据,包含了多个字段。MySQL是一张表里存放了多个字段和值,而Redis的Hash类型就是一个key里存放了多个字段和值。由于一个Hash对应一个集合的数据,但是也只使用一个dictEntry来存储元数据,所以会比字符串类型的数据更节省内存空间

1、设置Redis Hash Key

# hset key field value
# hsetnx key field value
# hmset key field1 value1 field2 value2
hset tanglu age 30  #设置一个hash key,名为tanglu,然后age字段的值为30
hset tanglu sex male  #为tanglu新增一个sex字段,值位male
hmset tanglu height 175 weight 70  #一次新增多个字段

2、获取Redis Hash Key元素个数 

# hlen key
hlen tanglu  #显示结果为4,因为上面示例设置了age sex height weight一共4个字段

# hget key filed
# hmget key field1 field2  #获取多个值
hget tanglu name  #获取指定字段的值,get的时候必须写清楚表名和字段名
hmget tanglu height weight

3、获取Hash Key所有字段的值,同keys命令一样需谨慎使用 

hgetall key  #显示出该Hash类型的key下的所有字段和值,谨慎使用
hkeys key  #仅显示该Hash类型的key下的所有字段
hvals key  #和上一步相反,显示的是具体的值

4、删除Hash Key中指定的字段和值 

hdel key field1 field2...

5、判断Hash Key字段是否存在,返回1代表存在,0代表不存在 

hexists key field  #一次只能跟一个字段

四、Redis list类型

list列表类型的数据一般用于消息队列(比如使用redis作为ES的消息队列,当发现ES没有日志进来的时候,可以先看redis消息队列中是否有数据),可以让一个key拥有多个value,且值可重复

  • 使用场景:

    • 消息队列: redis的lpush+brpop命令组合即可实现阻塞队列,生产者客户端是用lupsh从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞时的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性消息队列模型↑
    • 文章列表:每个用户都有属于自己的文章列表,现在需要分页展示文章列表,此时可以考虑使用列表,列表不但有序,同时支持按照索引范围获取元素。
    • 使用列表技巧:

      • lpush+lpop=Stack(栈)
      • lpush+rpop=Queue(队列)
      • lpush+ltrim=Capped Collection(有限集合)
      • lpush+brpop=Message Queue(消息队列)
lpush names tanglu  #从左边开始插入数据
lpush names tom
lpush names tanglu  #故意定义了重复的value
lrange names 0 -1  #获取列表里的全部值,0和-1是起始和结束范围,后进入的key的值反而是在前面的
lrange names 0 1  #获取第一个和第二个值
lrem names 1 tanglu  #移除一个值为tanglu的列,这里将会按照序号移除。如果要移除所有的话,序号写0
lpop names  #按照后进先出的方式读取列表里的数据,可当做消息队列
rpop names  #先进先出
del names  #删除列表

五、Redis集合

分为了有序集合(zset)和无序集合(set),集合内的元素不可重复。无序集合通过交集、差集或并集获得需要的数据,常用于社交软件共同好友、微博圈子,有序集合常用于排行榜。

  • 使用场景:

    • 标签(tag):集合类型比较典型的使用场景,如一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴 趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。(用户和标签的关系维护应该放在一个事物内执行,防止部分命令失败造成数据不一致)
    • 其他

      • sadd=tagging(标签)
      • spop/srandmember=random item(生成随机数,比如抽奖)
      • sadd+sinter=social Graph(社交需求)
sadd ages 25
sadd ages 30
sadd ages 32
sadd ages 25  #重复定义,会添加失败
smembers ages  #显示集合中的元素,由于是无序的,不用再指定序号
srem ages 25  #移除一个元素
sismember ages 30  #检查集合中有没有30这个元素

五、有序集合

有序集合和集合有着必然的联系,他保留了集合不能有重复成员的特性,但不同得是,有序集合中的元素是可以排序的,但是它和列表的使用索引下标作为排序依据不同的是,它给每个元素设置一个分数,作为排序的依据。(有序集合中的元素不可以重复,但是csore可以重复,就和一个班里的同学学号不能重复,但考试成绩可以相同)。

  • 列表、集合、有序集合三者的异同点

​​​​​​​

  • 使用场景:

    • 排行榜:有序集合经典使用场景。例如视频网站需要对用户上传的视频做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值