重新认识Redis之Redis是什么, 常用数据类型以及应用场景

1. Redis是什么

Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。
它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。
Redis作为一个内存数据库,具有如下有特点:

  • 性能优秀, 数据在内存中, 读写速度非常快, 并支持10W QPS(每秒查询效率).
  • 单进程单线程, 是线程安全的.
  • 非阻塞I/O多路复用机制, 因为是但线程的,通过跟踪每个I/O流的状态, 来管理多个I/O流.
  • 丰富的数据类型, 支持字符串(strings)、散列(hash)、列表(lists)、集合(sets)、有序集合(sorted sets)等.
  • 支持数据持久化, 可以将内存中数据保存在磁盘中, 重启时加载.
  • 主从复制,哨兵,高可用.
  • 可以用作分布式锁.
  • 可以作为消息中间件使用,支持发布订阅.

2. Redis常用的数据类型及每种类型应用场景

刚才有提到Redis常用的5种数据类型, 在具体介绍前,我们先来了解下Redis内部内存管理是如何描述这5种数据类型的.
重新认识Redis之Redis是什么, 常用数据类型以及应用场景
首先Redis内部使用一个redisObject对象来表示所有的key和value.
redisObject最主要的信息如上图所示: type表示一个value对象具体是何种数据类型, encoding是不同数据类型在Redis内部的存储方式.
比如:type=string 表示 value 存储的是一个普通字符串,那么 encoding 可以是 raw 或者 int.
这里说下,数据类型是针对Value的, Redis是key=value格式存储的,Key都是一样的是String类型的, Value有不同数据类型, 接下来,我们简单介绍下这常用的5中数据类型~

2.1 String类型

String是Redis最基本的类型, 可以解决成与内存存储一抹一样的类型, 一个Key对应一个Value. Value不仅String, 也可以是数字.

String 类型是二进制安全的,意思是 Redis 的 String 类型可以包含任何数据,比如 jpg 图片或者序列化的对象。String 类型的值最大能存储 512M。

2.2 Hash

Hash是一个键值(key-value)的集合。Redis 的 Hash 是一个 String 的 Key 和 Value 的映射表,Hash 特别适合存储对象。常用命令:hget,hset,hgetall 等。

应用场景: 存储, 读取, 修改用户属性.

2.3 List

List 列表是简单的字符串列表,按照插入顺序排序。可以添加一个元素到列表的头部(左边)或者尾部(右边) 常用命令:lpush、rpush、lpop、rpop、lrange(获取列表片段)等。

  • 应用场景: List应用场景非常多, 也是Redis最重要的数据结构之一, 比如粉丝列表等都可以用List结构来实现. 还可以作为消息队列存储消息.
  • 数据结构: List就是链表, 链表特点就是增删快,可以用来当消息队列使用. Redis 提供了 List 的 Push 和 Pop 操作,还提供了操作某一段的 API,可以直接查询或者删除某一段的元素。
  • 实现方式: List的实现是一个双向链表, 既可以支持反向查找和遍历, 更方便操作, 增删效率高.

2.4 Set

Set 是 String 类型的无序集合。集合是通过 hashtable 实现的。Set 中的元素是没有顺序的,而且是没有重复的。常用命令:sdd、spop、smembers、sunion 等。

应用场景:Redis Set 对外提供的功能和 List 一样是一个列表,特殊之处在于 Set 是自动去重的,而且 Set 提供了判断某个成员是否在一个 Set 集合中。比如: 例如不和重复性, 统计访问网站的所有Ip.

2.5 Zset

Zset 和 Set 一样是 String 类型元素的集合,且不允许重复的元素。常用命令:zadd、zrange、zrem、zcard 等。但是可以排序.

  • 应用场景: 当你需要一个有序并且不重复的集合列表, 那么可以选择Zset结构.比如网站中的排行榜, 微博头条排行等等.
我们用一张图来解释如上应用场景

重新认识Redis之Redis是什么, 常用数据类型以及应用场景

3. 为什么要用Redis做缓存

3.1 高性能:

重新认识Redis之Redis是什么, 常用数据类型以及应用场景
假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

3.2 高并发

重新认识Redis之Redis是什么, 常用数据类型以及应用场景
直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。