基础
Redis 是键值对(Key-Value)存储数据库,数据存储在内存中,读写速度非常快,每秒可以处理超过10万次读写操作,广泛应用于缓存,也经常用来做分布式锁
redis中文官方网站:http://www.redis.cn/download.html
Redis 是一个客户端服务端的程序
- 服务端提供数据存储等等服务
- 客户端连接服务端并通过向服务端发送命令,读取或写入数据,简单来说,客户端就是某种工具,我们通过它与 Redis 服务端进行通讯并完成数据操作。
配置文件
因为需要redis的配置文件,这里最好还是去redis的官方去下载一个redis使用里面的配置文件即可
注意:不能在配置项的后面加注释
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1
#允许远程访问
#bind 127.0.0.1
bind 0.0.0.0
#关闭保护模式
protected-mode no
port 6379
tcp-backlog 511
requirepass #redis密码,设置为空,取消密码
timeout 0
tcp-keepalive 300 #防止出现远程主机强迫关闭了一个现有的连接的错误 默认是300
daemonize no #用守护线程的方式启动
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 30
always-show-logo yes
save 900 1
save 300 10
save 60 10000
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-disable-tcp-nodelay no
replica-priority 100
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
appendonly yes #redis持久化 默认是no
appendfilename "appendonly.aof"
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
lua-time-limit 5000
slowlog-max-len 128
notify-keyspace-events ""
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
list-max-ziplist-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
运用场景
- 缓存:Redis 最常见的应用场景是作为缓存,用于提高应用程序的性能和响应速度。它可以将频繁读写的数据存储在内存中,以减少数据库访问的次数和延迟。
- 会话存储:Redis 可以用于存储会话数据,例如用户登录状态、购物车数据等。它可以将这些数据存储在内存中,以提高应用程序的性能和可伸缩性。
- 消息队列:Redis 还可以用作消息队列,用于处理异步任务、事件通知等。它支持发布/订阅模式和队列模式,可以快速传递大量消息,并保证消息的可靠性和顺序性。
- 计数器和排行榜:Redis 支持多种数据结构,例如字符串、列表、哈希表和有序集合等。其中,有序集合非常适合实现计数器和排行榜等功能。
- 地理位置应用:Redis 支持地理位置数据类型,可以用于存储地理位置信息,并支持快速查询和计算地理位置之间的距离和方向。
- 分布式锁:Redis 还可以用于实现分布式锁,用于控制并发访问。它提供了原子性操作和多种数据结构,可以很容易地实现分布式锁。
总之,Redis 是一种高性能、灵活和多功能的键-值存储系统,适用于多种应用场景,特别是需要处理高并发、低延迟和大量数据的应用程序。
安装 Redis服务端
docker中
docker安装 Redis
Docker学习
# 要确保docker环境已经安装成功
docker --version
docker search redis
#拉取最新版本
docker pull redis
#查看端口
netstat -anp |grep 6379
redis-server #这个是关键配置,让redis按照这个redis.conf的配置启动
docker run --name myredis -p 6379:6379 \
-v /app/redis.conf:/usr/local/etc/redis/redis.conf \
-v /app/redis/data:/data \
--restart=always \
-d redis:latest redis-server /usr/local/etc/redis/redis.conf
docker start 容器名或容器id
# 查看运行中的容器
docker ps
# 进入redis容器并启动一个redis交互式会话
docker exec -it redis容器名 /bin/bash
# 在redis交互式会话中连接 redis 服务
redis-cli
#或者直接进入
docker exec -it redis容器名 redis-cli
# 清理容器(停止 docker-redis 容器并删除):
docker stop redis容器名
docker rm redis容器名
docker-compose
version: '3' #设置docker compose 版本
services:
#设置services
redis:
image: redis #镜像名称
container_name: redis #容器名称
restart: always #重启docker引擎后该容器也重启
privileged: true # 获取宿主机root权限
ports:
- 6379:6379 #本地端口号与容器内部端口号
volumes:
#指定挂载目录
- ./data:/data
- ./redis.conf:/etc/redis/redis.conf
command: [ "redis-server", "/etc/redis/redis.conf" ] # 指定配置文件启动redis-server进程
创建redis.conf
# Redis默认端口
port 6379
bind 0.0.0.0
# 关闭保护模式,允许远程连接
protected-mode no
# 密码
requirepass 123456
docker-compose up -d
window下使用
安装
下载地址:https://github.com/tporadowski/redis/releases
#启动redis服务
redis-server.exe
这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。
#启动redis客户端,连接本机6379端口(127.0.0.1)raw参数避免中文乱码
redis-cli --raw
127.0.0.1:6379>
shutdown
exit
#在远程服务上执行命令
redis-cli -h host -p port -a password
配置文件启动
redis-server.exe redis.windows.conf
- 这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。
切换到 redis 目录下运行:
redis-cli.exe -h 127.0.0.1 -p 6379
发生了错误。MaxRetriesPerRequestError: Reached the max retries per request limit (which is 20). Refer to “maxRetriesPerRequest” option for details.
redis命令
redis-cli #在redis交互式会话中连接 redis 服务
config get requirepass #查看现有的redis密码
config set requirepass pass_123456 #设置redis密码
可视化客户端
AnotherRedisDesktopManager 一款比较稳定简洁的 redis UI 工具。
Redis Client 是Redis客户端的GUI工具,使用Java swt和jedis编写,可以方便开发者浏览Redis数据库。该软件支持简体中文,非常适合国内用户使用,不需要汉化就可以直接使用
Redis Desktop Manager:
- Redis Desktop Manager是一个功能强大的Redis图形化客户端,提供可视化界面来管理和操作Redis数据库。
- 它支持Windows、Mac和Linux操作系统,并提供多种功能,如查看键值对、执行命令、监控性能指标等。
RedisInsight(官方)
- RedisInsight是Redis Labs官方提供的免费的Redis可视化和管理工具。
- 它提供一个直观的界面,可以查看和编辑键值对、执行命令、监控性能指标、查看慢查询等。
https://redislabs.com/redis-enterprise/redis-insight/
FastoRedis
- FastoRedis是一个跨平台的Redis数据可视化工具,支持Windows、Mac和Linux等操作系统。
- 它提供了直观的界面,可以浏览和编辑键值对、执行Lua脚本、导入和导出数据等功能。
Redis Commander(web)
- Redis Commander是一个开源的Web界面,用于管理Redis数据库。
- 它具有易于使用的界面,并提供基本的管理功能,如查看键值对、执行命令和监控性能指标。
QuickRedis
QuickRedis 是一款 永久免费 的 Redis 可视化管理工具。
先创建目录,再创建连接
tiny-rdm
https://github.com/tiny-craft/tiny-rdm
⭐️ 支持 macOS、Windows 和 Linux
⭐️ 基于 Webview,无内嵌浏览器
⭐️ 更精美的界面和直观的结构布局
⭐️ 便捷的数据查看和编辑修改
⭐️ 多国语言支持
redis数据结构
-
String
:字符串类型 -
List
:列表类型 -
Set
:无序集合类型 -
ZSet
:有序集合类型 -
Hash
:哈希表类型
String:
- 是二进制安全,可以存储图片或者序列化的对象,值最大存储为512m
- 使用:set key value ,get key
- 应用场景:共享session,分布式锁,计数器,限流
- 内部编码有3种,
int(8字节长整型)/embstr(小于等于39字节字符串)/raw(大于39个字节字符串)
List
- 用来存储多个有序的字符串,一个列表最多可以存储2^32 - 1个元素
- 内部编码:ziplist(压缩列表)、linkedlist(链表)
- 应用场景:消息队列,文章列表
Set
- 用来存储多个字符串,不允许重复元素
- 内部编码:intset(整数集合),hashtable(哈希表)
zset(有序集合)
- 已排序的字符串集合,元素不能重复
- 应用场景:排行榜,社交需求(用户点赞)
Hash
- 简介:在Redis中,哈希类型是指v(值)本身又是一个键值对(k-v)结构
- 简单使用举例:
hset key field value
、hget key field
- 内部编码:
ziplist(压缩列表)
、hashtable(哈希表)
- 应用场景:缓存用户信息等。
- 注意点:如果开发使用hgetall,哈希元素比较多的话,可能导致Redis阻塞,可以使用hscan。而如果只是获取部分field,建议使用hmget。
缓存问题
redis持久化机制
阿里二面:熟悉Redis?讲讲你理解的Redis的持久化机制(RDB、AOF) - 知乎
因为Redis是内存数据库,它将自己的数据存储在内存里面,一旦Redis服务器进程退出或者运行Redis服务器的计算机停机,Redis服务器中的数据就会丢失。
为了避免数据丢失,所以Redis提供了持久化机制,将存储在内存中的数据保存到磁盘中,用于在Redis服务器进程退出或者运行Redis服务器的计算机停机导致数据丢失时,快速的恢复之前Redis存储在内存中的数据。
Redis提供了2种持久化方式,分别为:
- RDB持久化
- AOF持久化
RDB持久化
RDB持久化是将某个时间点上Redis中的数据保存到一个RDB文件中,该文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时Redis中的数据
RDB持久化也叫做快照持久化。
- SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完毕为止,在服务器进程阻塞期间,服务器不能处理任何命令请求
- BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求
配置save选项
我们可以手动执行该命令,但还是推荐设置下Redis服务器配置文件的save选项,让服务器每隔一段时间自动执行一次BGSAVE命令。
save 900 1
save 300 10
save 60 10000
默认的配置条件表示,只要满足以下3个条件中的任意1个,BGSAVE命令就会被执行:
- 服务器在900s(即15分钟)之内,对数据库进行了至少1次修改
- 服务器在300s(即5分钟)之内,对数据库进行了至少10次修改
- 服务器在60s(即1分钟)之内,对数据库进行了至少10000次修改
dbfilename dump.rdb #RDB文件名称
dir ./ #RDB文件保存路径
载入RDB文件
载入RDB文件的目的是为了在Redis服务器进程重新启动之后还原之前存储在Redis中的数据。
Redis载入RDB文件并没有专门的命令,而是在Redis服务器启动时自动执行的。
而且,Redis服务器启动时是否会载入RDB文件还取决于服务器是否启用了AOF持久化功能,具体判断逻辑为:
- 只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据。
- 如果服务器开启了AOF持久化功能,那么服务器会优先使用AOF文件来还原数据。
- 默认情况下,Redis服务器的AOF持久化功能是关闭的,所以Redis服务器在启动时会载入RDB文件,
服务器状态
创建和载入RDB文件,可能存在的服务器状态有以下3种:
- 当执行SAVE命令时,Redis服务器会被阻塞,此时客户端发送的所有命令请求都会被阻塞,只有在服务器执行完SAVE命令,重新开始接受命令请求之后,客户端发送的命令请求才会被处理。
- 当执行BGSAVE命令时,Redis服务器不会被阻塞,Redis服务器仍然可以继续处理客户端发送的命令请求。
- 服务器在载入RDB文件期间,会一直处于阻塞状态,直到RDB文件载入成功。
AOF持久化
AOF持久化是通过保存Redis服务器所执行的写命令来记录数据库数据的
客户端 发送写命令到 redis服务端
redis服务端 保存被执行的写命令到 aof文件