官方网站:https://redis.io/

一、认识

1.简介

Redis是一个开源(BSD许可)的内存数据结构存储,用作数据库、缓存和消息代理。它支持诸如字符串、散列、列表、集、带范围查询的排序集、位图、hyperloglogs、带半径查询和流的地理空间索引等数据结构。Redis具有内置的复制、Lua脚本、LRU清除、事务和不同级别的磁盘持久性,并通过Redis Sentinel和带有Redis集群的自动分区提供高可用性。

2、数据类型
String类型

String类型是redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据。你可以它存储用户的邮箱、json对象甚至图片。一个字符串键允许存储的最大内容是512M。

内部数据结构

在redis内部,String类型通过int、SDS(Simple、Dynamic、String)作为结构存储,int用来存储整型数据,SDS用来存放字节、字符串和浮点型数据。在C语言的标准字符串结构下进行了封装,用来提升基操作的性能,同时也利用已有的C语言标准库简化实现逻辑。

list类型

list类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素或则获取列表的某一个片段的数据。列表内部使用双向链表实现,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素就速度越快,这意味着即使是一个有几千万个元素的列表,获取头部或尾部的10条记录也很快。

内部数据机构

在redis3.2之前,list类型的value对象内部采用linkedList或则zipList来实现,当list的元素个数和单个元素的长度比较小时,redis会采用zipList(压缩列表)来减少内存占用,否则就会采用linkedList(双向链表)。
在redis3.2之后,采用了一种叫做quickList的数据结构来存储list,list的底层都由quickList实现。

这两种方式都有优缺点,双向链表的两端进行push和pop操作,在插入节点上复杂度比较低,但是内存开销比较大;zipList存储在一段连续的内存上,所以存储效率很高,但是插入和删除需要频繁的申请和释放内存。
quickLis仍然是一个双向链表,只是列表的每个节点都是一个zipList,其实就是linkedList和zipList的结合。quickList中每个节点zipList都能存储做个数据元素。

hash类型

hash类型相当于一个map对象,整体看做一个对象,对象里面每一个field-value都相当于对象的属性和属性值。

内部数据结构

hash类型提供两种结构用于存储,一种是hashTable、另一种是zipList,数据量小的时候用zipList,书籍量大的时候用hashTable。在redis中hashTable分为三层,分别是dictEntry、dictht、dict。

  1. dictEntry:管理一个key-value,同时保留同一个桶中相邻元素的指针,用来维护hashTable的内部链。
  2. dictht:实现一个hashTable会使用一个buckets存放dictEntry的地址,一般情况下通过hash(key)&len得到的值就是buckets的索引,这个值决定了我们将此dictEntry节点放入buckets的哪个索引里,这个buckets实际上就是我们所说的hashTable。
  3. dictht实际上就是hashTalbe的核心,但是只有一个dictht还是不够,比如rehash,遍历hash等操作。所以redis定义了一个叫dict的结构以支持字典的各种操作,当dictht需要扩容、缩容时,用来管理dicth的迁移。
set类型

set类型中每个元素都是不同的,也就是不能有重复数据,同时set类型中的数据是无序的。一个set类型键可以存储2的32次方减一个。set类型和list类型的最大区别是有序性和唯一性。set类型的常用操作是set中加入或删除元素、判断元素是否存在。由于set类型在redis中内部使用的值为空的hashTable(散列表),所以这些操作的时间复杂段都为O(1)。

内部数据结构

set在的底层数据结构以intSet或者hashTable存储。当set中只包含整型的元素时,采用intSet来存储,否则采用hashTable存储,但是对于set来说,该hashTable的值为NULL。通过key来存储元素。

zset类型

zset称作有序集合,即和set的区别就是多了有序性。在set类型的的基础上zset为set中一个元素都关联了一个分数,这使得我们不仅可以完后插入,删除和判断元素是否存在等操作,还能获的最高分数或最低的前N个元素,获得指定分数范围内的元素等与分数相关的操作,虽然zset中每个元素都是不同的,但是他们的分数可以相同。

内部数据结构

zset类型的数据结构就比较复杂一点,内部是以zipList或者skipList+hashTable来实现,这里面最核心的一个结构就是skipList,也就是跳跃表。

3、可执行文件

可执行文件

功能

reidis-server

redis服务器

reidis-cli

redis命令行客户端

reidis-benchmark

redis性能测试工具

reidis-check-aof

AOF文件修复工具

reidis-check-dump

Rdb文件修复工具

reidis-sentinel

Sentinel服务器

二、安装

1.下载安装包

下载地址:https://redis.io/download

2.上传至服务器并解压
[root@hmq opt]# tar -zxvf redis-5.0.7.tar.gz
3.编译
[root@hmq opt]# cd redis-5.0.7
[root@hmq opt]# make
4.启动服务
[root@hmq redis-5.0.7]# cd src
[root@hmq src]# ./redis-server ../redis.conf &
5.客户端连接
[root@hmq src]# ./redis-cli
6.关闭服务
[root@hmq src]# ./redis-cli SHUTDOWN