初始Redis
迪丽热BUG 人气:0
### Redis是什么
Redis 是一种基于键值对(Key-Value)的 NoSQL 数据库, 键值数据库会使用哈希表存储键值和数据,其中 key 作为唯一的标识,而且 key 和 value 可以是任何的内容,不论是简单的对象还是复杂的对象都可以存储。键值数据库的查询性能高,易于扩展。
Redis 提供了键过期、发布订阅、事务、Lua 脚本、哨兵、Cluster 等功能。Redis 执行命令的速度非常快,根据官方给的性能可以达到每秒最多处理的请求可以达到 10 万次( 10w+qps)。
### Redis数据类型
相比 Memcached,Redis 有一个非常大的优势,就是支持多种数据类型。Redis 支持的数据类型包括`字符串、哈希、列表、集合、有序集合`等。
**字符串类型是 Redis 提供的最基本的数据类型,对应的结构是 key-value。**
> `设置某个键的值:set key value;取某个键的值:get key。`
**哈希(hash)提供了字段和字段值的映射,对应的结构是 key-field-value。**
> `设置某个键的哈希值:hset key field value`,如果想要给 user1 设置 username 为 zhangfei,age 为 28,可以写成下面这样:
>
> ```shell
> hset user1 username zhangfeih
>
> set user1 age 28
> ```
>
> `将多个 field-value 设置给某个键 key 的时候,可以使用hmset key field value [field value...]`,比如上面这个可以写成:
>
> ```shell
> Hmset user1 username zhangfei age 28
> ```
>
> `获取取某个键的某个 field 字段值,可以使用hget key field`,比如想要取 user1 的 username,那么写成hget user1 username即可。
>
> 如果想要一次获取某个键的多个 field 字段值,可以使用hmget key field[field...],比如想要取 user1 的 username 和 age,可以写成hmget user1 username age。
**字符串列表(list)的底层是一个双向链表结构,所以我们可以向列表的两端添加元素,时间复杂度都为 O(1),同时我们也可以获取列表中的某个片段。**
> `列表左侧增加元素可以使用:LPUSH key value [...]`,比如我们给 heroList 列表向左侧添加 zhangfei、guanyu 和 liubei 这三个元素,可以写成:
>
> LPUSH heroList zhangfei guanyu liubei
>
> 同样,我们也可以`使用RPUSH key value [...]向列表右侧添加元素`,比如我们给 heroList 列表向右侧添加 dianwei、lvbu 这两个元素,可以写成下面这样:
>
> ```shell
> RPUSH heroList dianwei lvbu
> ```
>
> `获取列表中某一片段的内容,使用LRANGE key start stop`即可,比如我们想要获取 heroList 从 0 到 4 位置的数据,写成LRANGE heroList 0 4即可。
**字符串集合(set)是字符串类型的无序集合,与列表(list)的区别在于集合中的元素是无序的,同时元素不能重复。**
> `集合中添加元素,可以使用SADD key member [...]`,比如我们给 heroSet 集合添加 zhangfei、guanyu、liubei、dianwei 和 lvbu 这五个元素,可以写成:
>
> ```shell
> SADD heroSet zhangfei guanyu liubei dianwei lvbu
> ```
>
> `在集合中删除某元素,可以使用SREM key member [...]`,比如我们从 heroSet 集合中删除 liubei 和 lvbu 这两个元素,可以写成:
>
> ```shell
> SREM heroSet liubei lvbu
> ```
>
> `获取集合中所有的元素,可以使用SMEMBERS key`,`获取 heroSet 集合中的所有元素,写成SMEMBERS heroSet`即可。`判断集合中是否存在某个元素,可以使用SISMEMBER key member`,比如我们想要判断 heroSet 集合中是否存在 zhangfei 和 liubei,就可以写成下面这样:
>
> ```shell
> SISMEMBER heroSet zhangfeiSISMEMBER heroSet liubei
> ```
### Redis为什么那么快
1. 开发语言
Redis 就是用 C 语言开发的,所以执行会比较快。
2. 纯内存访问
Redis 将所有数据放在内存中,非数据同步正常工作时,是不需要从磁盘读取数据的,0 次 IO。内存响应时间大约为 100 纳秒,这是 Redis 速度快的重要基础。
3. 单线程
第一,单线程简化算法的实现,并发的数据结构实现不但困难而且测试也麻烦。第二,单线程避免了线程切换以及加锁释放锁带来的消耗,对于服务端开发来说,锁和线程切换通常是性能杀手。
当然,单线程也会有它的缺点,也是 Redis 的噩梦:阻塞。如果执行一个命令过长,那么会造成其他命令的阻塞,对于 Redis 是十分致命的,所以 Redis 是面向快速执行场景的数据库。
4. 非阻塞多路 I/O 复用机制
I/O 多路复用实际上是指多个连接的管理可以在同一进程。多路是指网络连接,复用只是同一个线程。在网络服务中,I/O 多路复用起的作用是一次性把多个连接的事件通知业务代码处理,处理的方式由业务代码来决定,该方法就会返回可读 / 写的 FD 个数。
Redis 使用 epoll 作为 I/O 多路复用技术的实现,再加上 Redis 自身的事件处理模型将 epoll 的 read、write、close 等都转换成事件,不在网络 I/O 上浪费过多的时间,从而实现对多个 FD 读写的监控,提高性能。
### 总结
![在这里插入图片描述](https://img2020.cnblogs.com/blog/1745726/202003/1745726-20200305151428722-2035754786.png)
------
**** 码字不易如果对你有帮助请给个关注****
**** 爱技术爱生活 QQ群: 894109590****
加载全部内容