Redis基础知识

1/10/2023 Redis

# Redis

# 1. 简介

Redis一个开源的基于键值对(Key-Value)NoSQL数据库。使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀,并提供多种语言的API。

我们要首先理解一点,我们把Redis称为KV数据库,键值对数据库,那就可以把Redis内部的存储视为存在着一个巨大的Map,对Map的操作无非就是get和put,然后通过key操作这个key所对应的value,而这个value的类型可以多种多样,也就是Redis为我们提供的那些数据结构,比如字符串(String)、哈希(Hash)等等。

Redis就这么简单吗?这些年李老师的经历,我发现,很多技术人都有一个误区,那就是,只关注零散的技术点,没有建立起一套完整的知识框架,缺乏系统观,但是系统观其实是至关重要的。从某种程度上说,在解决问题时,拥有了系统观,就意味着你能有依据、有章法地定位和解决问题。

那么,如何高效地形成系统观呢?本质上就是,Redis 的知识都包括什么呢?简单来说,就是“两大维度,三大主线”

# 1.1 两大维度

两大维度:应用维度、底层原理维度

我们知道,缓存和集群是Redis 的两大广泛的应用场景。同时Redis 丰富的数据模型,就导致它有很多零碎的应用场景,很多很杂。而且,还有一些问题隐藏得比较深,只有特定的业务场景下(比如亿级访问压力场景)才会出现,所以同时还必须精通Redis的数据结构。

应用场景

缓存

缓存机制几乎在所有的大型网站都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。可以这么说,一个合理的缓存设计能够为一个网站的稳定保驾护航。

一般MySQL数据库写的并发是600/s,读的2000/s,对于大型互联网项目的百万并发,根本扛不住,Redis的官方显示Redis能够单台达到10W+/s的并发。

排行榜系统

排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照发布时间的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合数据结构,合理地使用这些数据结构可以很方便地构建各种排行榜系统。

计数器应用

计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持计数功能而且计数的性能也非常好,可以说是计数器系统的重要选择。

社交网络

赞/踩、粉丝、共同好友/喜好、推送、下拉刷新等是社交网站的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据不太适合保存这种类型的数据,Redis提供的数据结构可以相对比较容易地实现这些功能。

消息队列系统

消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦、非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列比还不够足够强大,但是对于一般的消息队列功能基本可以满足。这个是Redis的作者参考了Kafka做的拓展。

# 1.2 三大主线

三大主线:高性能、高可靠和高可扩展

高性能:包括线程模型、数据结构、持久化、网络框架; 高可靠:包括主从复制、哨兵机制; 高可扩:包括数据分片、负载均衡。

因为Redis的应用场景非常多,不同的公司有不同的玩法,但如何不掌握三高这条主线的话,你会遇到以下问题:

1、数据结构的复杂度、跨 CPU 核的访问会导致CPU飙升的问题

2、主从同步和 AOF 的内存竞争,这些会导致内存问题

3、在 SSD 上做快照的性能抖动,这些会导致存储持久化的问题

4、多实例时的异常网络丢包的问题

# 2. Redis安装

  1. 环境需要的工具包安装

    yum -y install gcc automake autoconf libtool make wget
    
    1
  2. Redis各版本下载地址 http://download.redis.io/releases/

  3. 服务器上下载Redis压缩包

    wget http://download.redis.io/releases/redis-6.2.8.tar.gz
    
    1
  4. 解压文件

  5. 进入文件及编译

    cd redis-6.2.8/
    make
    
    1
    2
  6. 安装后源码和执行目录会混在一起,为了方便,我做了一次install

    make install PREFIX=/usr/local/redis # 指定安装目录
    
    1
  7. 进入/usr/local/redis/bin目录

    -rwxr-xr-x 1 root root  6549984 Feb 10 14:48 redis-benchmark
    lrwxrwxrwx 1 root root       12 Feb 10 14:48 redis-check-aof -> redis-server
    lrwxrwxrwx 1 root root       12 Feb 10 14:48 redis-check-rdb -> redis-server
    -rwxr-xr-x 1 root root  6766368 Feb 10 14:48 redis-cli
    lrwxrwxrwx 1 root root       12 Feb 10 14:48 redis-sentinel -> redis-server
    -rwxr-xr-x 1 root root 12178576 Feb 10 14:48 redis-server
    
    1
    2
    3
    4
    5
    6

安装常见问题

如果执行make命令报错:cc 未找到命令,原因是虚拟机系统中缺少gcc,执行下面命令安装gcc:

yum -y install gcc automake autoconf libtool make
1

如果执行make命令报错:致命错误:jemalloc/jemalloc.h: 没有那个文件或目录,则需要在make指定分配器为libc。执行下面命令即可正常编译:

make MALLOC=libc
1

# 3. Redis启动

一般来说redis-server和redis-cli这些平时用得最多。

Redis有三种方法启动Redis:默认配置、带参数启动、配置文件启动。

# 2.1 默认配置

使用Redis的默认配置来启动,在bin目录下直接输入 ./redis-server

可以看到直接使用redis-server启动Redis后,会打印出一些日志,通过日志可以看到一些信息:

当前的Redis版本的是64位的6.2.7,默认端口是6379。Redis建议要使用配置文件来启动。

因为直接启动无法自定义配置,所以这种方式是不会在生产环境中使用的。

# 2.2 带参数启动

redis-server加上要修改配置名和值(可以是多对),没有设置的配置将使用默认配置,例如:如果要用6380作为端口启动Redis,那么可以执行:

./redis-server --port 6380
1

这种方式一般我们也用得比较少

# 2.3 配置文件启动

配置文件是我们启动的最多的模式,配置文件安装目录中有

将该配置文件拷贝到安装目录中

注意:这里对配置文件使用了相对路径,绝对路径也是可以的。

同时配置文件的方式可以方便我们改端口,改配置,增加密码等。

打开注释,设置为自己的密码,重启即可

# 4. 停止

Redis提供了shutdown命令来停止Redis服务,例如我们目前已经启动的Redis服务,可以执行:

./redis-cli -p 6379 shutdown
1

除了可以通过shutdown命令关闭Redis服务以外,还可以通过kill进程号的方式关闭掉Redis,但是强烈不建议使用kill -9强制杀死Redis服务,不但不会做持久化操作,还会造成缓冲区等资源不能被优雅关闭,极端情况会造成AOF和复制丢失数据的情况。如果是集群,还容易丢失数据。

同样还可以在命令行中执行shutdown指令

# 5. Redis全局命令

keys

查看所有键(支持通配符)
1

dbsize

dbsize命令会返回当前数据库中键的总数。
1

exists

检查键是否存在,存在返回1,不存在返回0。
1

del

删除键,无论值是什么数据结构类型,del命令都可以将其删除。返回删除键个数,删除不存在键返回0。同时del命令可以支持删除多个键。
1

expire

Redis支持对键添加过期时间,当超过过期时间后,会自动删除键,时间单位秒。

ttl命令会返回键的剩余过期时间,它有3种返回值:

大于等于0的整数:键剩余的过期时间。

-1:键没设置过期时间。

-2:键不存在

除了expire、ttl命令以外,Redis还提供了expireat、pexpire,pexpireat、pttl、persist等一系列命令。
1
2
3
4
5
6
7
8
9
10
11

expireat key

timestamp: 键在秒级时间截timestamp后过期。

ttl命令和pttl都可以查询键的剩余过期时间,但是pttl精度更高可以达到毫秒级别,有3种返回值:

大于等于0的整数:键剩余的过期时间(ttl是秒,pttl是毫秒)。

-1:键没有设置过期时间。

-2:键不存在。
1
2
3
4
5
6
7
8
9

pexpire key

milliseconds:键在milliseconds毫秒后过期。
1

pexpireat key

milliseconds-timestamp键在毫秒级时间戳timestamp后过期。
1

在使用Redis相关过期命令时,需要注意以下几点。

1)如果expire key 的键不存在,返回结果为0:

2)如果过期时间为负值,键会立即被删除,犹如使用del命令一样:

3 ) persist命令可以将键的过期时间清除:

4)对于字符串类型键,执行set命令会去掉过期时间,这个问题很容易在开发中被忽视。

5 ) Redis不支持二级数据结构(例如哈希、列表)内部元素的过期功能,不能对二级数据结构做过期时间设置。

type

返回键的数据结构类型,例如键lijin是字符串类型,返回结果为string。键mylist是列表类型,返回结果为list,键不存在返回none
1

randomkey

随机返回一个键,这个很简单,请自行实验。
1

rename

键重命名

但是要注意,如果在rename之前,新键已经存在,那么它的值也将被覆盖。
为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey不存在时候才被覆盖。
从上面我们可以看出,由于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性。
1
2
3
4
5
Last Updated: 2/11/2023, 9:57:39 AM