当前位置: 首页 > news >正文

Redis有哪五种不同类型的值?应用场景有哪些?

Redis有哪五种不同类型的值?应用场景有哪些?

            • [1] String(字符串)
            • [2] Hash(哈希)
            • [3] List(列表)
            • [4] Set(集合)
            • [5] zset (sorted set:有序集合)

  1. string:redis 中字符串 value 最大可为512M.可以用来做一些计数器(也是实际工作中最常见的).
  2. hash:键值对集合,是一个字符串类型的 Key和 Value 的映射表,也就是说其存储的Value是一个键值对(Key- Value).可以用来存放一些具有特定结构的信息.用于用户信息管理.
  3. list:简单的字符串列表,按照插入顺序排序,可以添加一个元素到列表的头部(左边)或者尾部(右边),其底层实现是一个链表.可以实现一个简单消息队列功能,做基于redis的分页功能等.
  4. set:是一个字符串类型的无序集合.可以用来进行全局去重等.做用户标签.
  5. sorted set:是一个字符串类型的有序集合,给每一个元素一个固定的分数score来保持顺序.可以用来做排行榜应用或者进行范围查找等.
  • 补充:用sorted set实现一个排行榜需要注意什么问题?答:并列问题.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ubAQxIeo-1596676923045)(X:\Users\xu\AppData\Roaming\Typora\typora-user-images\image-20200629214430327.png)]

详细介绍:

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合).每种数据类型有其适合的使用场景,下面具体介绍.

[1] String(字符串)

string 是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value.string 类型是二进制安全的.意思是 redis 的 string 可以包含任何数据.比如jpg图片或者序列化的对象.string 类型是 Redis 最基本的数据类型,string 类型的值最大能存储 512MB.

使用方法

SET key value   设置指定 key 的值  
GET key     获取指定 key 的值.
SETEX key seconds value 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位).

使用场景

  1. 会话缓存
    用户登录系统后,使用Redis保存用户的Session信息,每次用户查询登录信息都直接从Redis中获取.

  2. 计数器

  • 比如登录系统会限制密码错误次数,当一个用户在一定时间内连续输入密码错误,就不能登录,需要一段时间后才能登录,我们可以使用redis,把username作为key,错误的次数作为value,同时设置过期时间即可.
  • 手机验证码限收到短信的次数
  • 统计其他计数
  1. 定时器
    redis的key可以设置过期时间,我们基于此特性设置一个定时器.

  2. 对象
    我们把对象序列化后,可以使用redis保存该对象,然后在获取对象信息的时候,反序列化value

  3. 分布式锁
    redis提供了setnx()方法,即SET IF NOT EXIST,只有在key不存在的时候才能set成功,这就意味着同一时间多个请求只有一个请求能保存成功,这块的可以自行搜索redis的分布式锁

[2] Hash(哈希)

Redis hash 是一个键值(key=>value)对集合,即编程语言中的Map类型.
Redis hash 是一个 string 类型的 field 和 value 的映射表.

使用方法

HSET key field value 
将哈希表 key 中的字段 field 的值设为 value .
HGET key field
获取存储在哈希表中指定字段的值.
HKEYS key
获取所有哈希表中的字段
HMSET key field1 value1 [field2 value2 ]
同时将多个 field-value (域-值)对设置到哈希表 key 中.

使用场景

hash 特别适合用于存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)

[3] List(列表)

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

使用方法

LPUSHX key value 
将一个值插入到已存在的列表头部  
LPUSH key value1 [value2]
将一个或多个值插入到列表头部
LPOP key
移出并获取列表的第一个元素
BLPOP key1 [key2 ] timeout
移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止.

使用场景

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

  2. 类目/文章/活动等列表
    最常见的就是各个系统的首页数据,包括电商系统的商品类目,拼团活动列表,博客园的首页文章列表等

  3. 其他
    根据push和pop的方式不同,有以下组合方式

    lpush + lpop = Stack(栈) lpush + rpop = Queue(队列) lpush + ltrim = Capped Collection(有限集合) lpush + brpop = Message Queue(消息队列) 

``

[4] Set(集合)

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

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

使用方法

SADD key member1 [member2] 
向集合添加一个或多个成员  
SDIFF key1 [key2]
返回给定所有集合的差集
SINTER key1 [key2]
返回给定所有集合的交集
SMEMBERS key
返回集合中的所有成员

使用场景

  1. 标签(tag)
    比如在点餐评价系统中,用户给某商家评价,商家会有多个评价标签,但是不会重复的,如果100万人给某商家评价打了标签,如果使用MySQL数据库获取大数据量去重后的评价标签,会影响数据库的性能和系统的并发量.

  2. 相同点/异同点
    利用交集、并集、差集等操作,可以计算两个人的共同喜好,全部的喜好,自己独有的喜好等功能.

[5] zset (sorted set:有序集合)

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

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

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

使用方法

ZADD key score1 member1 [score2 member2] 
向有序集合添加一个或多个成员,或者更新已存在成员的分数  
ZCARD key
获取有序集合的成员数
ZREM key member [member ...]
移除有序集合中的一个或多个成员

使用场景

  • 排行榜:例如博客园需要对用户发表的文章做排行榜,榜单的维度可能是多个方面的:按照时间、按照点赞数、按照热度,浏览数等

相关文章:

  • jvm重要参数分析
  • 使用redis可能出现的问题
  • phpQuery对数据信息的采集进一步学习
  • Redis底层数据结构
  • 用户口令复杂度策略设置银河麒麟
  • Redis的过期策略
  • 第三周作业 产品同质化问题
  • Redis分布式锁
  • LLVM3.8停止了旧Windows版本,取消Autoconf,改进Clang
  • Redis的I/O多路复用
  • mysql之select(一)
  • 多线程的 Redis
  • python中给程序加锁之fcntl模块的使用
  • 【VMCloud云平台】拥抱Docker(二)配置第一个容器
  • Redis持久化方式
  • 4月23日世界读书日 网络营销论坛推荐《正在爆发的营销革命》
  • Angular4 模板式表单用法以及验证
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • CSS 专业技巧
  • EOS是什么
  • interface和setter,getter
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • PHP的Ev教程三(Periodic watcher)
  • Python_OOP
  • Python打包系统简单入门
  • spark本地环境的搭建到运行第一个spark程序
  • TypeScript迭代器
  • 创建一种深思熟虑的文化
  • 搭建gitbook 和 访问权限认证
  • 大快搜索数据爬虫技术实例安装教学篇
  • 浮动相关
  • 每天10道Java面试题,跟我走,offer有!
  • 浅析微信支付:申请退款、退款回调接口、查询退款
  • 人脸识别最新开发经验demo
  • 软件开发学习的5大技巧,你知道吗?
  • 使用parted解决大于2T的磁盘分区
  • 手写双向链表LinkedList的几个常用功能
  • 我与Jetbrains的这些年
  • 携程小程序初体验
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 原生js练习题---第五课
  • 走向全栈之MongoDB的使用
  • 400多位云计算专家和开发者,加入了同一个组织 ...
  • ​ ​Redis(五)主从复制:主从模式介绍、配置、拓扑(一主一从结构、一主多从结构、树形主从结构)、原理(复制过程、​​​​​​​数据同步psync)、总结
  • ​VRRP 虚拟路由冗余协议(华为)
  • # centos7下FFmpeg环境部署记录
  • #{} 和 ${}区别
  • #{}和${}的区别?
  • #pragma once与条件编译
  • (2)STL算法之元素计数
  • (2022 CVPR) Unbiased Teacher v2
  • (4)STL算法之比较
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (6)设计一个TimeMap
  • (done) ROC曲线 和 AUC值 分别是什么?