# Redis学习笔记
# 目录
[TOC]
# 1.搭建Redis学习环境-环境配置⭐️
# 1.1.安装路径
- 记得联网!
gcc g++
apt-get install pkg-config
nohup make > whoway.sh 2>&1 &
make install
#root
cd /usr/local/bin/
#others 默认安装路径
cd /usr/bin/
2
3
4
5
6
7
8
9
10
11
root@hecs-358761:/usr/local/bin# ll
total 23532
drwxr-xr-x 2 root root 4096 Apr 6 12:02 ./
drwxr-xr-x 11 root root 4096 Feb 24 2022 ../
-rwxr-xr-x 1 root root 966 Feb 24 2022 cloud-id*
-rwxr-xr-x 1 root root 970 Feb 24 2022 cloud-init*
-rwxr-xr-x 1 root root 2108 Feb 24 2022 cloud-init-per*
-rwxr-xr-x 1 root root 1003 Feb 24 2022 jsondiff*
-rwxr-xr-x 1 root root 3858 Feb 24 2022 jsonpatch*
-rwxr-xr-x 1 root root 1837 Feb 24 2022 jsonpointer*
-rwxr-xr-x 1 root root 973 Feb 24 2022 jsonschema*
-rwxr-xr-x 1 root root 5886560 Apr 6 12:02 redis-benchmark*
lrwxrwxrwx 1 root root 12 Apr 6 12:02 redis-check-aof -> redis-server*
lrwxrwxrwx 1 root root 12 Apr 6 12:02 redis-check-rdb -> redis-server*
-rwxr-xr-x 1 root root 5789224 Apr 6 12:02 redis-cli*
lrwxrwxrwx 1 root root 12 Apr 6 12:02 redis-sentinel -> redis-server*
-rwxr-xr-x 1 root root 12375472 Apr 6 12:02 redis-server*
root@hecs-358761:/usr/local/bin#
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 1.2.配置
redis默认不是后台启动的,,需要修改配置文件
默认是在本机运行,需要修改ip
默认端口是6379
通过指定的配置文件启动
- 启动服务的时候,可以通过指定的配置文件
- 我们未来要启动集群的话,我们就要启动好多个这样的服务
- 比如redis-conf1 redis-conf2
- 我们也可以单机,多redis
root@hecs-358761:/usr/local/bin# redis-server whoway-config/redis.conf
#使用redis客户端进行连接
root@hecs-358761:/usr/local/bin# redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> set name whoway
OK
127.0.0.1:6379> get name
"whoway"
127.0.0.1:6379> get nme
(nil)
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 1.3.查看redis的进程是否开始
查看redis的进程是否开启
ps -ef | grep redis
root@hecs-358761:~# ps -ef | grep redis
root 8991 1 0 12:16 ? 00:00:00 redis-server 127.0.0.1:6379
root 8996 2665 0 12:16 pts/0 00:00:00 redis-cli -p 6379
root 9088 9071 0 12:19 pts/1 00:00:00 grep --color=auto redis
2
3
4
5
6
如何关闭redis服务呢?
回顾,linux关机命令shutdown
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> shutdown #关闭redis的server
not connected> exit #所以才not connect, exit是退出redis-cli
2
3
4
# 1.4.配置文件redis.conf
# 2.性能测试-redis-benchmark
redis-benchmark是一个压力测试工具
官方自带的性能测试工具
指定测试机器,指定并发数目(默认是50),指定请求数(默认是1W)
我们来简单测试一下
# 2.1.redis-benchmark怎么带密码。
加上下面的选项
-a 密码
# 2.2.如何查看benchmark这些分析呢?
第1ms的时候,处理了29%的请求,第3ms的时候
最后总结,每秒处理了59XXX次请求!
# 2.3.注意-进行完redis-benchmark后,我们发现数据库里面被加入了一些key和value
# 3.Another Redis Desktop Manager
# 3.1.远程使用-another连接服务器的redis
将 bind 127.0.0.1 # 注释掉
将protected-mode yes 改成 protected-mode no
将# requirepass foobared 去掉注释 改成 requirepass 密码
然后使用ssl和上面的密码或者readonly和密码都可以连接
并且这2种连接,都是可以使用get name这样的redis命令的
也能
auth 你的密码
shutdown
2
在本地进行关闭
127.0.0.1:6379> shutdown
(error) NOAUTH Authentication required怎么办
这个错误表明Redis需要进行身份验证,但是你尝试执行的操作没有通过身份验证,因此无法执行。要解决这个问题,你需要在执行 shutdown 命令之前进行身份验证。
如果你在启动Redis时设置了密码,可以使用以下命令进行身份验证:
AUTH password
其中,password 是你在启动Redis时设置的密码。
如果你没有设置密码,则可以在Redis配置文件中开启身份验证。编辑Redis配置文件(一般位于 /etc/redis/redis.conf 或者 /usr/local/etc/redis.conf),找到以下行:
# requirepass foobared
将注释符号 # 删除,并将 foobared 替换为你想要的密码。保存并关闭文件后,重启Redis服务即可生效。现在你可以使用上述命令进行身份验证。
来源链接:[1]
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@hecs-358761:/usr/local/bin/whoway-config# git diff
diff --git a/redis.conf b/redis.conf
--- a/redis.conf
+++ b/redis.conf
@@ -84,7 +84,7 @@
# You will also need to set a password unless you explicitly disable protected
# mode.
# ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-bind 127.0.0.1 -::1
+#bind 127.0.0.1 -::1
# By default, outgoing connections (from replica to master, from Sentinel to
# instances, cluster bus, etc.) are not bound to a specific local address. In
@@ -108,7 +108,7 @@ bind 127.0.0.1 -::1
# By default protected mode is enabled. You should disable it only if
# you are sure you want clients from other hosts to connect to Redis
# even if no authentication is configured.
-protected-mode yes
+protected-mode no
# Redis uses default hardened security configuration directives to reduce the
# attack surface on innocent users. Therefore, several sensitive configuration
@@ -306,7 +306,7 @@ tcp-keepalive 300
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
# When Redis is supervised by upstart or systemd, this parameter has no impact.
-daemonize no
+daemonize yes
# If you run Redis from upstart or systemd, Redis can interact with your
# supervision tree. Options:
@@ -1033,7 +1033,7 @@ acllog-max-len 128
# The requirepass is not compatible with aclfile option and the ACL LOAD
# command, these will cause requirepass to be ignored.
#
-# requirepass foobared
+ requirepass XXXX【打码】
# New users are initialized with restrictive permissions by default, via the
# equivalent of this ACL rule 'off resetkeys -@all'. Starting with Redis 6.2, it
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# 3.2.介绍软件
是一款开源的跨平台 Redis 可视化管理工具,支持 SSH 和 SSL 等协议,也支持只读模式
SSH
:通过 SSH 协议连接 Redis 服务器,可以加密通信以提高安全性。如果你的 Redis 服务器启用了 SSH,则可以使用 SSH 选项来连接 Redis。SSL
:通过 SSL 加密协议连接 Redis 服务器,可以将数据在客户端和服务器之间进行加密传输,以提高安全性。如果你的 Redis 服务器启用了 SSL,则可以使用 SSL 选项来连接 Redis。readonly
:只读模式是指连接 Redis 服务器时,只能执行查询操作,不能进行修改或删除操作。只读模式可以增加 Redis 服务器的安全性,避免数据意外被修改或删除。在 Another Redis Desktop Manager 中,只需要在连接设置中选择“只读模式”,即可连接到 Redis 服务器的只读实例。
总的来说,SSH 和 SSL 都提供了一定程度的安全性保障,只读模式则可以进一步增强 Redis 服务器的安全性。在连接 Redis 服务器时,根据实际需要选择合适的选项即可。
# 4.redis基础知识+命令行⭐️
redis默认16个数据库,类似数组下标从0开始,初始默认使用0号库
查看 redis.conf
,里面有默认的配置
databases 16
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16
2
3
4
5
# 4.1.常用命令
select命令切换数据库
select 0 #切换到标号为0的数据库
select 1 #切换到标号为1的数据库
dbsize #Dbsize查看「当前」数据库的key的数量
2
3
4
5
flushdb #清空当前标号的数据库「比如当前标号为1的数据库」
flushall #清空全部的库「比如16个」
2
keys * #查看,当前标号的数据库里面有多少key,帮我列出来!
set mykey myvalue #插入key value对
get mykey #通过key查询我的value
2
3
4
# 4.2.面试-为什么redis是单线程?
Redis很快!官方表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就 顺理成章地采用单线程的方案了!
Redis为什么单线程还这么快?
redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的
为什么呢,因为 多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切 换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。
redis 用 单个CPU 绑定一块内存 的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处 理这个事。在内存的情况下,这个方案就是最佳方案。
因为一次CPU上下文的切换大概在 1500ns 左右。
从内存中读取 1MB 的连续数据,耗时大约为 250us, 假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换,那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us
,你光时间上下文的切换就用了1500us了,我还不算你每次读一点数据 的时间。
# 5.redis的5大基本-数据类型⭐️
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。
Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
# Redis-Key的介绍Redis键(key)
> set age 1
OK
> exists name
0
> exists age
1
> move age 3 # move key db ---> 当前库就没有了,被移除了
1
> exists age
0
# expire key 秒钟:为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。
# ttl key 查看还有多少秒过期,-1 表示永不过期,-2 表示已过期
# type key 查看你的key是什么类型
2
3
4
5
6
7
8
9
10
11
12
13
14
# 6.redis的4种特殊数据类型⭐️
# 6.1GEO地理位置geospatial
将指定的地理空间位置(纬度、经度、名称)添加到指定的key
中。
GEO 的数据结构总共有六个常用命令:
geoadd
geopos
geodist
georadius
georadiusbymember
gethash
2
3
4
5
6
7
# 6.2.HyperLogLog-超日志
# 6.3.BitMap
BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态, 其中的 key 就是对应元素本身,实际上 底层也是通过对字符串的操作来实现。Redis 从 2.2 版本之后新增了setbit, getbit, bitcount 等几个 bitmap 相关命令。
# 6.4.stream
如何看待Redis5.0的新特性stream? (opens new window)
已经在用kafka的自然也是没必要迁移为redis stream,但是某些场景下你已经在用redis了,又需要使用消息对列,直接使用redis stream能满足的话又何苦再搭个kafka呢
# 持久化
这两种技术都会用各用一个日志文件来记录信息,但是记录的内容是不同的
- RDB 文件的内容是二进制数据。
- AOF 文件的内容是操作命令
所以,RDB 快照就是记录某一个瞬间的内存数据,记录的是实际数据,而 AOF 文件记录的是命令操作的日志,而不是实际的数据。
因此在 Redis 恢复数据时, RDB 恢复数据的效率会比 AOF 高些,因为直接将 RDB 文件读入内存就可以,不需要像 AOF 那样还需要额外执行操作命令的步骤才能恢复数据。
# 1.RDB(redis DataBase)redis默认开启
RDB 快照
# 2.AOF(Append only File)默认是不开启的
AOF 日志
# 7.Redis鸡肋的功能
# 订阅和发布
- 有专门的消息队列
- rabbitMQ
- kafka
- rocketMQ
# 7.2.事务
实现得不好
# 9.使用Java的Jredis
jredis是redis官网,推荐的java连接开发工具,
使用java操作redis中间件,如果你要使用java操作redis,那么一定要对Jredis十分的熟悉。。。但是显然spring boot,redistemplate集成了很多
# Redis除了缓存外的用途
# redis的monitor和发布订阅的区别
MONITOR
和 发布订阅(PUB/SUB)
是 Redis 中两个不同的概念,具有不同的特点和用途:
MONITOR
:是一种用于监视 Redis 客户端执行的命令的工具。当你执行MONITOR
命令后,Redis 服务器会将所有收到的命令都输出到控制台或日志文件中,可以用于排查问题或调试应用程序。发布订阅(PUB/SUB)
:是 Redis 提供的一种消息推送机制,可以实现多个客户端之间的消息通信。客户端可以通过SUBSCRIBE
命令订阅一个或多个频道,当有其他客户端向这些频道发布消息时,订阅者会收到相应的消息。PUB/SUB
机制可以用于构建实时消息系统、广播系统等场景。
总的来说,MONITOR
主要用于监视 Redis 客户端执行的命令,而 PUB/SUB
则主要用于实现消息发布和订阅。虽然它们都可以用于监视 Redis 的运行状态,但是它们的应用场景和目的是不同的。
# 参考资料
- https://www.bilibili.com/video/BV1S54y1R7SB?p=9&vd_source=ea20f1fccee6fd3f1af7d59cd3ae7575
- 【狂神说Java】Redis最新超详细版教程通俗易懂 (opens new window)
- https://redis.io/
- http://www.redis.cn/