# 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/
1
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#
1
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>
1
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
1
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
1
2
3
4

# 1.4.配置文件redis.conf

# 2.性能测试-redis-benchmark

redis-benchmark是一个压力测试工具

官方自带的性能测试工具

指定测试机器,指定并发数目(默认是50),指定请求数(默认是1W)

我们来简单测试一下

# 2.1.redis-benchmark怎么带密码。

加上下面的选项

-a 密码
1

# 2.2.如何查看benchmark这些分析呢?

image-20230406174335701

第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  
1
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]
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
1
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
1
2
3
4
5

# 4.1.常用命令

select命令切换数据库

select 0 #切换到标号为0的数据库

select 1 #切换到标号为1的数据库

dbsize #Dbsize查看「当前」数据库的key的数量
1
2
3
4
5
flushdb  #清空当前标号的数据库「比如当前标号为1的数据库」
flushall #清空全部的库「比如16个」
1
2
keys *  #查看,当前标号的数据库里面有多少key,帮我列出来!

set mykey myvalue  #插入key value对
get mykey #通过key查询我的value
1
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) 与范围查询, bitmapshyperloglogs地理空间(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是什么类型
1
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
1
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 的运行状态,但是它们的应用场景和目的是不同的。

# 参考资料