Redis:Remote DIctionary Server(远程字典服务器)。
是完全开源免费的,用 C 语言编写的,遵守 BSD 协议,是一个高性能的(Key/Value)分布式内存数据库,基于内存运行,并支持持久化的 NoSQL 数据库,是当前最热门的 NoSQL 数据库之一,也被人们称为数据结构服务器。
Redis 与其他 key-value 缓存产品相比有以下三个特点:
a、Redis 支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
b、Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list、set、zset、hash 等数据结构的存储。
c、Redis 支持数据的备份,即 master-slave 模式的数据备份。
内存存储和持久化:redis 支持异步将内存中的数据写到硬盘上,同时不影响继续服务取最新 N 个数据的操作,如:可以将最新的 10 条评论的 ID 放在 Redis 的 List 集合里面
发布、订阅消息系统
地图信息分析
定时器、计数器
微软的 github 的地址在这,选择最新版本即可,如下图所示:
首先启动 redis-cli ,然后再启动 redis-server ,双击启动就可以。
虽然上面启动了 redis 服务,但是只要关闭了 cmd 窗口,redis 服务就会消失。所以这个时候就需要把 redis 设置成 windows 下的服务。
左下角开始菜单--服务--进入服务的菜单,此时未发现 redis 的服务。
打开 cmd 命令窗口,切换到 redis 的安装目录下,输入以下命令:
redis-server --service-install redis.windows-service.conf --loglevel verbose
未报任何错误信息,说明服务设置成功。
刷新服务,可以看到新增加的 redis 服务
当把 redis 服务放到 windows 的服务下后,这个 redis 服务就会随着你的电脑开机自动启动,此时无需再启动 server 端,直接启动客户端就可以进行操作。
在安装目录下找到 redis.windows-service.conf
修改配置文件,添加密码设置
重启服务即可
测试是否成功
由于企业里面做 Redis 开发,99% 都是 Linux 版的运用和安装,几乎不会涉及到 Windows 版,上面只是为了知识的完整性,Windows 版不作为重点,大家可以自己玩,企业实战就认一个版:Linux 版。
下载地址在这里,下载最新版本的即可
将下载获得的 redis-7.2.0.tar.gz 文件复制到我们 Linux 环境的 /opt 目录下
进入到 /opt 目录下,执行解压命令,命令如下所示:
cd /opt
tar -zxvf redis-7.2.0.tar.gz
解压完成后会出现 redis-7.0.2 文件夹,进入该文件夹,执行 make 命令
cd redis-7.0.2
make
继续执行 make install 命令
进入到 /usr/local/bin 目录下,查看是否生成了 redis 的相关文件,/usr 这是一个非常重要的目录,类似于 windows 下的 Program Files,存放用户的程序。
将 redis.conf 文件复制到我们的指定目录下,以后我们的启动就用这个配置文件
cd /usr/local/bin
mkdir myredis
cp /opt/redis /myredis
redis.conf 配置文件中 daemonize 守护线程,默认是 NO。
vim redis.conf
daemonize 是用来指定 redis 是否要用守护线程的方式启动。 配置成 yes 之后我们就不用再启动 redis 的服务端了。
redis 采用的是单进程多线程的模式。当 redis.conf 中选项 daemonize 设置成 yes 时,代表开启守护进程模式。在该模式下,redis 会在后台运行,并将进程 pid 号写入至 redis.conf 选项 pidfile 设置的文件中,此时 redis 将一直运行,除非手动 kill 该进程。
当 daemonize 选项设置成 no 时,当前界面将进入 redis 的命令行界面,exit 强制退出或者关闭连接工具 (putty,xshell 等)都会导致 redis 进程退出。
[root@localhost bin]# pwd
/usr/local/bin
# 启动 redis 服务
[root@localhost bin]# redis-server myredis/redis.conf
3464:C 20 Aug 2023 23:38:12.608 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
# redis 客户端连接
[root@localhost bin]# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
127.0.0.1:6379> exit
# 显示系统当前的进程信息
[root@localhost bin]# ps -ef| grep redis
root 3465 1 0 23:38 ? 00:00:00 redis-server 127.0.0.1:6379
root 3625 2983 0 23:48 pts/0 00:00:00 grep --color=auto redis
# 再次连接客户端
[root@localhost bin]# redis-cli -p 6379
# 关闭连接
127.0.0.1:6379> shutdown
not connected> exit
# 再次查看系统当前的进程信息
[root@localhost bin]# ps -ef| grep redis
root 3660 2983 0 23:48 pts/0 00:00:00 grep --color=auto redis
[root@localhost bin]#
Redis-benchmark 是官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能。
redis 性能测试工具可选参数如下所示:
首先启动 redis 的服务端和客户端
# 100 个并发连接,100000 个请求,检测 host 为 localhost,端口为 6379 的 redis 服务器性能
[root@localhost ~]# redis-benchmark -h localhost -p 6379 -c 100 -n 100000
# 测试出来的所有命令只举例一个!
====== PING_INLINE ======
100000 requests completed in 0.92 seconds # 对集合写入测试
100 parallel clients # 每次请求有100个并发客户端
3 bytes payload # 每次写入3个字节的数据,有效载荷
keep alive: 1 # 保持一个连接,一台服务器来处理这些请求
host configuration "save": 3600 1 300 100 60 10000
host configuration "appendonly": no
multi-thread: no
Latency by percentile distribution:
0.000% <= 0.119 milliseconds (cumulative count 1)
50.000% <= 0.455 milliseconds (cumulative count 50297)
75.000% <= 0.503 milliseconds (cumulative count 76551)
87.500% <= 0.567 milliseconds (cumulative count 88416)
93.750% <= 0.655 milliseconds (cumulative count 93981)
96.875% <= 0.751 milliseconds (cumulative count 97010)
98.438% <= 0.855 milliseconds (cumulative count 98506)
99.219% <= 0.943 milliseconds (cumulative count 99234)
99.609% <= 1.031 milliseconds (cumulative count 99625)
99.805% <= 1.191 milliseconds (cumulative count 99807)
99.902% <= 1.391 milliseconds (cumulative count 99904)
99.951% <= 1.447 milliseconds (cumulative count 99954)
99.976% <= 1.527 milliseconds (cumulative count 99979)
99.988% <= 1.543 milliseconds (cumulative count 99988)
99.994% <= 1.559 milliseconds (cumulative count 99994)
99.997% <= 1.583 milliseconds (cumulative count 99997)
99.998% <= 1.607 milliseconds (cumulative count 99999)
99.999% <= 1.615 milliseconds (cumulative count 100000)
100.000% <= 1.615 milliseconds (cumulative count 100000) # 所有请求在 1.615 毫秒内完成
redis 默认拥有 16 个数据库,类似数组下标从零开始,初始默认使用零号库,查看 redis.conf 配置文件即可发现
使用 select 命令进行数据库的切换,不同的库可以存储不同的数据
使用 dbsize 命令可以查看当前数据库的 key 的数量,keys * 命令可以查看当前数据库所有的 key
使用 flushdb 命令可以清空当前库,使用 flushall 命令清空全部的库。
我们首先要明白,Redis 很快!官方表示,因为 Redis 是基于内存的操作,CPU 不是 Redis 的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且 CPU 不会成为瓶颈,那就顺理成章地采用单线程的方案了!( 在 redis6.0 版本之前,redis 都是单线程的)
Redis 采用的是基于内存的单进程单线程模型的 KV 数据库,由 C 语言编写,官方提供的数据是可以达到 100000+ 的 QPS(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差!
以前一直有个误区:高性能服务器 一定是多线程来实现的,原因很简单因为另外一个误区导致的:多线程 一定比单线程效率高。其实不然,在说这个事前希望大家都能对 CPU 、 内存 、 硬盘的速度都有了解了!
redis 核心是如果数据全都在内存里,单线程去操作效率就是最高的,为什么呢?因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个 CPU 绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个 CPU 上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案。
一次 CPU 上下文的切换大概在 1500ns 左右。redis 从内存中读取 1MB 的连续数据,耗时大约为 250us。假设 1MB 的数据由多个线程读取了 1000 次,那么就有 1000 次时间上下文的切换,那么就有 1500ns *1000 = 1500us ,我单线程的读完 1MB 数据才 250us ,你光时间上下文的切换就用了 1500us 了,还不算你每次读一点数据的时间。