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安装
环境需要的工具包安装
yum -y install gcc automake autoconf libtool make wget
1Redis各版本下载地址
http://download.redis.io/releases/
服务器上下载Redis压缩包
wget http://download.redis.io/releases/redis-6.2.8.tar.gz
1解压文件
进入文件及编译
cd redis-6.2.8/ make
1
2安装后源码和执行目录会混在一起,为了方便,我做了一次install
make install PREFIX=/usr/local/redis # 指定安装目录
1进入
/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
如果执行make命令报错:致命错误:jemalloc/jemalloc.h: 没有那个文件或目录,则需要在make指定分配器为libc。执行下面命令即可正常编译:
make MALLOC=libc
# 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
这种方式一般我们也用得比较少
# 2.3 配置文件启动
配置文件是我们启动的最多的模式,配置文件安装目录中有
将该配置文件拷贝到安装目录中
注意:这里对配置文件使用了相对路径,绝对路径也是可以的。
同时配置文件的方式可以方便我们改端口,改配置,增加密码等。
打开注释,设置为自己的密码,重启即可
# 4. 停止
Redis提供了shutdown命令来停止Redis服务,例如我们目前已经启动的Redis服务,可以执行:
./redis-cli -p 6379 shutdown
除了可以通过shutdown命令关闭Redis服务以外,还可以通过kill进程号的方式关闭掉Redis,但是强烈不建议使用kill -9强制杀死Redis服务,不但不会做持久化操作,还会造成缓冲区等资源不能被优雅关闭,极端情况会造成AOF和复制丢失数据的情况。如果是集群,还容易丢失数据。
同样还可以在命令行中执行shutdown指令
# 5. Redis全局命令
keys
查看所有键(支持通配符)
dbsize
dbsize命令会返回当前数据库中键的总数。
exists
检查键是否存在,存在返回1,不存在返回0。
del
删除键,无论值是什么数据结构类型,del命令都可以将其删除。返回删除键个数,删除不存在键返回0。同时del命令可以支持删除多个键。
expire
Redis支持对键添加过期时间,当超过过期时间后,会自动删除键,时间单位秒。
ttl命令会返回键的剩余过期时间,它有3种返回值:
大于等于0的整数:键剩余的过期时间。
-1:键没设置过期时间。
-2:键不存在
除了expire、ttl命令以外,Redis还提供了expireat、pexpire,pexpireat、pttl、persist等一系列命令。
2
3
4
5
6
7
8
9
10
11
expireat key
timestamp: 键在秒级时间截timestamp后过期。
ttl命令和pttl都可以查询键的剩余过期时间,但是pttl精度更高可以达到毫秒级别,有3种返回值:
大于等于0的整数:键剩余的过期时间(ttl是秒,pttl是毫秒)。
-1:键没有设置过期时间。
-2:键不存在。
2
3
4
5
6
7
8
9
pexpire key
milliseconds:键在milliseconds毫秒后过期。
pexpireat key
milliseconds-timestamp键在毫秒级时间戳timestamp后过期。
在使用Redis相关过期命令时,需要注意以下几点。
1)如果expire key 的键不存在,返回结果为0:
2)如果过期时间为负值,键会立即被删除,犹如使用del命令一样:
3 ) persist命令可以将键的过期时间清除:
4)对于字符串类型键,执行set命令会去掉过期时间,这个问题很容易在开发中被忽视。
5 ) Redis不支持二级数据结构(例如哈希、列表)内部元素的过期功能,不能对二级数据结构做过期时间设置。
type
返回键的数据结构类型,例如键lijin是字符串类型,返回结果为string。键mylist是列表类型,返回结果为list,键不存在返回none
randomkey
随机返回一个键,这个很简单,请自行实验。
rename
键重命名
但是要注意,如果在rename之前,新键已经存在,那么它的值也将被覆盖。
为了防止被强行rename,Redis提供了renamenx命令,确保只有newKey不存在时候才被覆盖。
从上面我们可以看出,由于重命名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞Redis的可能性。
2
3
4
5