Redis
Redis安装
1.yum/apt安装
root@ubuntu:~# apt info redis
Package: redis
Version: 5:6.0.16-1ubuntu1
Priority: optional
Section: universe/database
Origin: Ubuntu
[root@localhost ~]# yum info redis
Available Packages
Name : redis
Version : 5.0.3
Release : 5.module+el8.5.0+657+2674830e
Architecture : x86_64
Size : 926 k
Source : redis-5.0.3-5.module+el8.5.0+657+2674830e.src.rpm
Repository : appstream
2.编译安装
安装依赖
[root@localhost ~]# yum -y install gcc jemalloc-devel systemd-devel
[root@localhost ~]# tar -xvf redis-6.2.7.tar.gz -C /usr/local/src/
[root@localhost redis-6.2.7]# make USE_SYSTEMD=yes PREFIX=/apps/redis install
[root@localhost redis-6.2.7]# echo 'PATH=/apps/redis/bin:$PATH' > /etc/profile.d/redis.sh
[root@localhost redis-6.2.7]# . /etc/profile.d/redis.sh
WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128
backlog参数控制的是三次握手的时候server端收到client ack确认号之后的队列值,即全连接队列
[root@localhost ~]# vim /etc/sysctl.conf
net.core.somaxconn = 1024
[root@localhost ~]# sysctl -p
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. 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.
0、表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
1、表示内核允许分配所有的物理内存,而不管当前的内存状态如何
2、表示内核允许分配超过所有物理内存和交换空间总和的内存
[root@localhost ~]# vim /etc/sysctl.conf
vm.overcommit_memory = 1
[root@localhost ~]# sysctl -p
WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
警告:您在内核中启用了透明大页面(THP,不同于一般内存页的4k为2M)支持。 这将在Redis中造成延迟和内存使用问题。 要解决此问题,请以root 用户身份运行命令“echo never> /sys/kernel/mm/transparent_hugepage/enabled”,并将其添加到您的/etc/rc.local中,以便在重启后保留设置。禁用THP后,必须重新启动Redis。#rocky 8编译安装6.2.7版本未遇到
[root@localhost ~]# echo 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' >> /etc/rc.d/rc.local
[root@localhost ~]# cat /etc/rc.d/rc.local
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.
touch /var/lock/subsys/local
echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@localhost ~]# chmod +x /etc/rc.d/rc.local
测试:
[root@localhost redis-6.2.7]# redis-server /apps/redis/etc/redis.conf
10542:C 01 Oct 2022 22:46:02.580 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
10542:C 01 Oct 2022 22:46:02.580 # Redis version=6.2.7, bits=64, commit=00000000, modified=0, pid=10542, just started
10542:C 01 Oct 2022 22:46:02.580 # Configuration loaded
10542:M 01 Oct 2022 22:46:02.580 * Increased maximum number of open files to 10032 (it was originally set to 1024).
10542:M 01 Oct 2022 22:46:02.580 * monotonic clock: POSIX clock_gettime
10542:M 01 Oct 2022 22:46:02.581 # A key '__redis__compare_helper' was added to Lua globals which is not on the globals allow list nor listed on the deny list.
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.2.7 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 10542
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
10542:M 01 Oct 2022 22:46:02.581 # Server initialized
10542:M 01 Oct 2022 22:46:02.581 * Loading RDB produced by version 6.2.7
10542:M 01 Oct 2022 22:46:02.581 * RDB age 85 seconds
10542:M 01 Oct 2022 22:46:02.581 * RDB memory usage when created 0.77 Mb
10542:M 01 Oct 2022 22:46:02.581 # Done loading RDB, keys loaded: 0, keys expired: 0.
10542:M 01 Oct 2022 22:46:02.581 * DB loaded from disk: 0.000 seconds
10542:M 01 Oct 2022 22:46:02.581 * Ready to accept connections
创建service文件
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
#Type=notify 如果支持systemd可以启用此行
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[root@localhost redis-6.2.7]# systemctl daemon-reload
[root@localhost redis-6.2.7]# systemctl start redis.service
[root@localhost redis-6.2.7]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 127.0.0.1:6379 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::1]:6379 [::]:*
redis连接方式
1.命令行
redis-cli -h HOSTNAME/IP -p PORT -a PASSWORD
[root@localhost ~]# redis-cli
127.0.0.1:6379> info
# Server
redis_version:6.2.7
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:2f7f1980d4c62229
redis_mode:standalone
os:Linux 4.18.0-372.9.1.el8.x86_64 x86_64
arch_bits:64
monotonic_clock:POSIX clock_gettime
multiplexing_api:epoll
atomicvar_api:c11-builtin
gcc_version:8.5.0
process_id:1105
process_supervised:no
run_id:3fea04a36a7931e8696002f799826cfdf0fbdd09
tcp_port:6379
server_time_usec:1664701791130890
uptime_in_seconds:1003
uptime_in_days:0
hz:10
configured_hz:10
lru_clock:3757407
executable:/apps/redis/bin/redis-server
config_file:/apps/redis/etc/redis.conf
io_threads_active:0
2.开发库连接
3.图形化工具连接
实现redis多实例
1.准备配置文件
[root@localhost redis-6.2.7]# cp /apps/redis/etc/redis.conf /apps/redis/etc/redis_6380.conf
[root@localhost redis-6.2.7]# cp /apps/redis/etc/redis.conf /apps/redis/etc/redis_6381.conf
修改配置文件
[root@localhost ~]# cat /apps/redis/etc/redis_6380.conf |grep '^[^#]'
bind 0.0.0.0
protected-mode yes
port 6380
[root@localhost ~]# cat /apps/redis/etc/redis_6381.conf |grep '^[^#]'
bind 0.0.0.0
protected-mode yes
port 6381
准备service文件
[root@localhost ~]# cat /usr/lib/systemd/system/redis_6380.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis_6380.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[root@localhost ~]# cat /usr/lib/systemd/system/redis_6381.service
[Unit]
Description=Redis persistent key-value database
After=network.target
[Service]
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis_6381.conf --supervised systemd
ExecStop=/bin/kill -s QUIT $MAINPID
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[root@localhost ~]# systemctl start redis_6380.service redis_6381.service
[root@localhost ~]# ss -ntl
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 511 0.0.0.0:6379 0.0.0.0:*
LISTEN 0 511 0.0.0.0:6380 0.0.0.0:*
LISTEN 0 511 0.0.0.0:6381 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
配置和优化
基础配置
bind 0.0.0.0 #监听地址,可以用空格隔开后多个监听IP
port 6379 #监听端口,默认6379/tcp
timeout 0 #客户端和Redis服务端的连接超时时间,默认是0,表示永不超时
tcp-keepalive 300 #tcp 会话保持时间300s
daemonize no #默认no,即直接运行redis-server程序时,不作为守护进程运行,而是以前台方式运行,如果想在后台运行需改成yes,当redis作为守护进程运行的时候,它会写一个 pid 到/var/run/redis.pid 文件
pidfile /var/run/redis_6379.pid #pid文件路径,可以修改
loglevel notice #日志级别
logfile "/path/redis.log" #日志路径,示例:logfile "/apps/redis/log/redis_6379.log"
always-show-logo yes #在启动redis 时是否显示或在日志中记录记录redis的logo
requirepass foobared #设置redis连接密码,之后需要AUTH pass,如果有特殊符号,用" "引起来,生产建议设置
rename-command #重命名一些高危命令,示例:rename-command FLUSHALL "" 禁用命令
#示例: rename-command del magedu
maxclients 10000 #Redis最大连接客户端
maxmemory <bytes> #redis使用的最大内存
动态调整配置
注:不是所有配置都可以动态修改,且此方式无法持久保存
CONFIG SET parameter value 动态地调整 Redis 服务器的配置(configuration)而无须重启。
CONFIG GET parameter 获取某项配置 支持 CONFIG GET S*
[root@localhost ~]# redis-cli
127.0.0.1:6379> config get bind
1) "bind"
2) "0.0.0.0"
127.0.0.1:6379> config get b*
1) "bio_cpulist"
2) ""
3) "bgsave_cpulist"
4) ""
5) "bind"
6) "0.0.0.0"
设置密码
1.修改配置
requirepass foobared #设置redis连接密码,之后需要AUTH pass,如果有特殊符号,用" "引起来,生产建议设置
2.命令行
127.0.0.1:6379> CONFIG SET requirepass 123456
OK
调整最大内存
1.修改配置
maxmemory <bytes>
2.命令行
CONFIG SET maxmemory <bytes>
慢日志
配置项
slowlog-log-slower-than 1 #指定为超过1us即为慢的指令
slowlog-max-len 1024 #指定保存1024条慢记录
命令行查看
SLOWLOG LEN 查看慢日志条数
SLOWLOG GET n 查看n条慢日志
SLOWLOG RESET 清空
redis持久化
目前redis支持两种不同方式的数据持久化保存机制,分别是RDB和AOF
RDB模式
RDB(Redis DataBase):基于时间的快照,其默认只保留当前最新的一次快照,特点是执行速度比较快,缺点是可能会丢失从上次快照到当前时间点之间未做快照的数据
RDB实现过程
master主进程fork一个子进程,使用写时复制机制,子进程将数据保存为临时文件,当数据保存完成后临时文件替换上次保存的RDB文件,然后关闭子进程。
在替换RDB文件时可能会出现特殊情况导致RDB文件无法保存完整,建议手动备份RDB文件。
相关配置
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir ./ #编泽编译安装,默认RDB文件存放在启动redis的工作目录,建议明确指定存入目录
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
RDB实现方式
- save: 同步,会阻赛其它命令,不推荐使用
- bgsave: 异步后台执行,不影响其它命令的执行
- 自动: 制定规则,自动执行
RDB快照
[root@localhost ~]# redis-cli
127.0.0.1:6379> set class n62
OK
127.0.0.1:6379> get class
"n62"
[root@localhost ~]# ls /data/rdb/
[root@localhost ~]# ll /data/rdb/
total 4
-rw-r--r-- 1 redis redis 108 Oct 2 18:29 dump.rdb
[root@localhost ~]# redis-cli
127.0.0.1:6379> save
OK
[root@localhost ~]# ll /data/rdb/
total 4
-rw-r--r-- 1 redis redis 108 Oct 2 18:31 dump.rdb
127.0.0.1:6379> bgsave
Background saving started
[root@localhost ~]# ll /data/rdb/
total 4
-rw-r--r-- 1 redis redis 108 Oct 2 18:32 dump.rdb
RDB优缺点
优点:
- 可以通过命令bgsave(非阻塞)或save(阻塞)自定义时间备份,较完整保存数据。
- 主进程fork出子进程进行数据保存工作,最大化redis性能
- 大量数据保存优于AOF
缺点:
- 无法实时保存数据
- 数据量过大时,父进程fork子进程进行保存至RDB文件时需要一点时间,消耗CPU性能
AOF模式
AOF:AppendOnylFile,按照操作顺序依次将操作追加到指定的日志文件末尾
AOF 和 RDB 一样使用了写时复制机制,AOF默认为每秒钟 fsync一次,即将执行的命令保存到AOF文件当中,这样即使redis服务器发生故障的话最多只丢失1秒钟之内的数据,也可以设置不同的fsync策略always,即设置每次执行命令的时候执行fsync,fsync会在后台执行线程,所以主线程可以继续处理用户的正常请求而不受到写入AOF文件的I/O影响
同时启用RDB和AOF,进行恢复时,默认AOF文件优先级高于RDB文件,即会使用AOF文件进行恢复
注意: AOF 模式默认是关闭的,第一次开启AOF后,并重启服务生效后,会因为AOF的优先级高于RDB,而AOF默认没有文件存在,从而导致所有数据丢失
可以手动执行bgrewriteaof 触发AOF,或定义自动rewrite 策略
AOF实现
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "no"
127.0.0.1:6379> config set appendonly yes
OK
127.0.0.1:6379> config get appendonly
1) "appendonly"
2) "yes"
[root@localhost ~]# vim /apps/redis/etc/redis.conf
appendonly yes
[root@localhost ~]# ll /data/rdb/
total 8
-rw-r--r-- 1 redis redis 108 Oct 2 18:38 appendonly.aof
-rw-r--r-- 1 redis redis 108 Oct 2 18:32 dump.rdb
手动bgrewriteaof
127.0.0.1:6379> bgrewriteaof
Background append only file rewriting started
[root@localhost ~]# ll /data/rdb/
total 8
-rw-r--r-- 1 redis redis 108 Oct 2 18:42 appendonly.aof
-rw-r--r-- 1 redis redis 108 Oct 2 18:32 dump.rdb
AOF配置
appendonly yes
appendfilename "appendonly-${port}.aof"
appendfsync everysec
dir /path
no-appendfsync-on-rewrite yes
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
AOF优缺点
优点
数据安全性较高,fsync策略默认每秒一次,线程后台执行性能较好
append模式记录日志文件,redis出现问题时不会破坏日志文件已存在内容,redis下次重启时会通过 redis-check-aof 工具来解决数据一致性的问题
Redis可以在 AOF文件体积变得过大时,自动地在后台对AOF进行重写,重写后的新AOF文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为Redis在创建新 AOF文件的过程中,append模式不断的将修改数据追加到现有的 AOF文件里面,即使重写过程中发生停机,现有的 AOF文件也不会丢失。而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新AOF文件,并开始对新AOF文件进行追加操作。
AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可以通过该文件完成数据的重建
缺点
即使有些操作是重复的也会全部记录,AOF 的文件大小要大于 RDB 格式的文件
AOF 在恢复大数据集时的速度比 RDB 的恢复速度要慢
根据fsync策略不同,AOF速度可能会慢于RDB
bug 出现的可能性更多
redis常用命令
info:显示当前节点redis运行状态信息
127.0.0.1:6379> info
# Server
redis_version:6.2.7
redis_git_sha1:00000000
127.0.0.1:6379> info cpu
# CPU
used_cpu_sys:0.655871
used_cpu_user:0.575273
used_cpu_sys_children:0.005110
used_cpu_user_children:0.001780
used_cpu_sys_main_thread:0.656533
used_cpu_user_main_thread:0.573533
select:类似MySQL的use dbname
127.0.0.1:6379> select 2
OK
127.0.0.1:6379[2]>
#默认15个库
keys:查看key
127.0.0.1:6379> keys * #查看所有key,不建议使用
1) "class"
dbsize:查看当前库key的数量
127.0.0.1:6379> dbsize
(integer) 1
flushdb:清空当前库所有key flushall:清空所有key,删库命令,慎用
shutdown:SHUTDOWN 命令执行以下操作:
- 停止所有客户端
- 如果有至少一个保存点在等待,执行 SAVE 命令
- 如果 AOF 选项被打开,更新 AOF 文件
- 关闭 redis 服务器(server)
如果持久化被打开的话, SHUTDOWN 命令会保证服务器正常关闭而不丢失任何数据。
数据类型
字符串string
添加key
SET key value [EX seconds] [PX milliseconds] [NX|XX]
如果 key 已经持有其他值, SET 就覆写旧值, 无视类型。
当 SET 命令对一个带有生存时间(TTL)的键进行设置之后, 该键原有的 TTL 将被清除。
从 Redis 2.6.12 版本开始, SET 命令的行为可以通过一系列参数来修改:
EX seconds : 将键的过期时间设置为 seconds 秒。 执行 SET key value EX seconds 的效果等同于执行 SETEX key seconds value 。
PX milliseconds : 将键的过期时间设置为 milliseconds 毫秒。 执行 SET key value PX milliseconds 的效果等同于执行 PSETEX key milliseconds value 。
NX : 只在键不存在时, 才对键进行设置操作。 执行 SET key value NX 的效果等同于执行 SETNX key value 。
XX : 只在键已经存在时, 才对键进行设置操作。
127.0.0.1:6379> set CLASS m44
OK
127.0.0.1:6379> keys *
1) "CLASS"
2) "class"
#大小写敏感
获取key
get key
127.0.0.1:6379> get class
"n62"
删除key
del key [key1 key2]
批量设置,获取key
mset key1 value1 key2 value2
mget key1 key2
127.0.0.1:6379> mset key1 value1 key2 value2
OK
127.0.0.1:6379> mget key1 key2
1) "value1"
2) "value2"
追加数据
append key value
127.0.0.1:6379> append class 2022
(integer) 7
127.0.0.1:6379> get class
"n622022"
返回key长度
strlen key
127.0.0.1:6379> strlen class
(integer) 7
判断key是否存在
exists key 返回值为0表示不存在
key的过期时间
查看过期时间
ttl key
127.0.0.1:6379> ttl class
(integer) -1
-1 #返回值表示永不过期,默认创建的key是永不过期,重新对key赋值,也会从有剩余生命周期变成永不过期
-2 #返回值表示没有此key
num #key的剩余有效期
重设过期时间
expire key
删除过期时间,永不过期
persist key
数值增减变化
递增
incr key
递减
decr key
增加
INCRBY key num
减少
decrby key num
#数值的增加减少支持负数
列表list
生成列表并追加value
lpush从左增加value
lpush listname value1 value2 value3 value4
rpush从右增加value
rpush listname value1 value2 value3 value4
127.0.0.1:6379> lpush llistname key1 value1 key2 value
(integer) 4
127.0.0.1:6379> rpush rlistname key1 value1 key2 value
(integer) 4
获取列表长度
127.0.0.1:6379> llen llistname
(integer) 4
127.0.0.1:6379> llen rlistname
(integer) 4
从列表获取指定位置数据
从左向右索引:0-n
从右向左索引:-n~-1
lindex listname n
127.0.0.1:6379> lindex llistname 1
"key2"
获取指定范围数据
127.0.0.1:6379> lrange llistname 0 2 #指定范围
1) "value"
2) "key2"
3) "value1"
127.0.0.1:6379> lrange llistname 0 -1 #全部
1) "value"
2) "key2"
3) "value1"
4) "key1"
修改指定索引的value
lset listname index value
127.0.0.1:6379> lset llistname 0 value0
OK
127.0.0.1:6379> lrange llistname 0 -1
1) "value0"
2) "key2"
3) "value1"
4) "key1"
移除列表数据
lpop listname [n] 从左边第一个开始移除列表元素 可指定数量n
rpop listname [n] 从右边第一个开始移除列表元素 可指定数量n
127.0.0.1:6379> lpop llistname
"value0"
127.0.0.1:6379> lpop llistname 2
1) "key2"
2) "value1"
ltrim n m 保留指定区间元素
del listname 删除列表
集合set
集合特点
- 无序
- 无重复
- 集合间操作
生成集合
sadd setname value1 value2 value3 value4
127.0.0.1:6379> sadd setname value1 value2 value3 value4
(integer) 4
127.0.0.1:6379> type setname
set
追加数据
sadd setname value #只能追加不存在的数据
127.0.0.1:6379> sadd setname value5 value6
(integer) 2
查看集合数据
127.0.0.1:6379> smembers setname
1) "value2"
2) "value1"
3) "value3"
4) "value4"
5) "value5"
6) "value6"
删除集合元素
srem setname value
127.0.0.1:6379> srem setname value6
(integer) 1
集合操作
交集
sinter set1 set2
并集
sunion set1 set2
差集
sdiff set1 set2
有序集合sorted set
有序集合特点
-
有序
-
无重复元素
-
每个元素是由score和value组成
-
score 可以重复
-
value 不可以重复
生成有序合集 zadd zsetname score value 127.0.0.1:6379> ZADD zsetname 1 v1 2 v2 3 v3 4 v4 5 v5 (integer) 5 实现排行榜 127.0.0.1:6379> ZADD paihangbang 90 nezha 199 zhanlang 60 zhuluoji 30 gangtiexia (integer) 4 127.0.0.1:6379> zrange paihangbang 0 -1 1) "gangtiexia" 2) "zhuluoji" 3) "nezha" 4) "zhanlang" 127.0.0.1:6379> zrevrange paihangbang 0 -1 1) "zhanlang" 2) "nezha" 3) "zhuluoji" 4) "gangtiexia 127.0.0.1:6379> zrevrange paihangbang 0 -1 withscores 1) "zhanlang" 2) "199" 3) "nezha" 4) "90" 5) "zhuluoji" 6) "60" 7) "gangtiexia" 8) "30" 127.0.0.1:6379> zrange paihangbang 0 -1 withscores 1) "gangtiexia" 2) "30" 3) "zhuluoji" 4) "60" 5) "nezha" 6) "90" 7) "zhanlang" 8) "199" 获取有序集合元素个数 127.0.0.1:6379> zcard zsetname (integer) 5 127.0.0.1:6379> zcard paihangbang (integer) 4 基于索引返回数据 zrange zsetname n m 127.0.0.1:6379> zrange zsetname 0 -1 1) "v1" 2) "v2" 3) "v3" 4) "v4" 5) "v5" 127.0.0.1:6379> zrange zsetname 0 2 1) "v1" 2) "v2" 3) "v3" 基于数值返回索引 127.0.0.1:6379> zrank zsetname v3 (integer) 2 127.0.0.1:6379> zrank zsetname v2 (integer) 1 基于value获取score 127.0.0.1:6379> zscore zsetname v2 "2" 127.0.0.1:6379> zscore zsetname v4 "4"
哈希hash
hash 是一个string类型的字段(field)和值(value)的映射表,Redis 中每个 hash 可以存储 2^32 -1 键值对,类似于字典,存放了多个k/v 对,hash特别适合用于存储对象场景
生成hash key
HSET hash field value
如果给定的哈希表并不存在, 那么一个新的哈希表将被创建并执行 HSET 操作。
如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖
127.0.0.1:6379> hset hash name zhangsan age 20
(integer) 2
获取hash值
127.0.0.1:6379> hgetall hash
1) "name"
2) "zhangsan"
3) "age"
4) "20"
获取hash key对应字段的值
127.0.0.1:6379> hmget hash name
1) "zhangsan"
127.0.0.1:6379> hmget hash name age
1) "zhangsan"
2) "20"
删除hash key对应的值,只是删除了值
127.0.0.1:6379> hdel hash age
(integer) 1
127.0.0.1:6379> hmget hash name age
1) "zhangsan"
2) (nil)
127.0.0.1:6379> hgetall hash
1) "name"
2) "zhangsan"
批量设置hash key的多个field和value
127.0.0.1:6379> hmset hash name lisi age 25 city zhengzhou
OK
127.0.0.1:6379> hgetall hash
1) "name"
2) "lisi"
3) "age"
4) "25"
5) "city"
6) "zhengzhou"
获取所有field的value
127.0.0.1:6379> hvals hash
1) "lisi"
2) "25"
3) "zhengzhou"
删除hash
127.0.0.1:6379> del hash
(integer) 1
127.0.0.1:6379> hgetall hash
(empty array)
消息队列
生产者消费者模式
生产者发布消息
lpust listname value1 value2 #从左追加数据
127.0.0.1:6379> lpush channel1 msg1
(integer) 1
127.0.0.1:6379> lpush channel1 msg2
(integer) 2
127.0.0.1:6379> lpush channel1 msg3
(integer) 3
127.0.0.1:6379> lpush channel1 msg4
(integer) 4
127.0.0.1:6379> lpush channel1 msg5
(integer) 5
127.0.0.1:6379> lrange channel1 0 -1
1) "msg5"
2) "msg4"
3) "msg3"
4) "msg2"
5) "msg1"
消费者消费消息
rpop listname #从右取出数据
127.0.0.1:6379> rpop channel1
"msg1"
127.0.0.1:6379> rpop channel1
"msg2"
127.0.0.1:6379> lrange channel1 0 -1
1) "msg5"
2) "msg4"
3) "msg3"
发布者订阅模式
在发布者订阅者模式下,发布者将消息发布到指定的channel里面,凡是监听该channel的消费者都会收到同样的一份消息,
订阅者订阅频道
127.0.0.1:6379> subscribe channel1 #主持多个,通配符
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "channel1"
3) (integer) 1
1) "message"
2) "channel1"
3) "value1"
1) "message"
2) "channel1"
3) "value2"
发布者发布信息
127.0.0.1:6379> publish channel1 value1
(integer) 1
127.0.0.1:6379> publish channel1 value2
(integer) 1
取消订阅
127.0.0.1:6379> unsubscribe channel1
1) "unsubscribe"
2) "channel1"
3) (integer) 0
简述redis特点及其应用场景
特性:
速度快: 10W QPS,基于内存,C语言实现
单线程
持久化
支持多种数据结构
支持多种编程语言
功能丰富: 支持Lua脚本,发布订阅,事务,pipeline等功能
简单: 代码短小精悍(单机核心代码只有23000行左右),单线程开发容易,不依赖外部库,使用简单
主从复制
支持高可用和分布式
应用场景:Redis 在高并发、低延迟环境要求比较高的环境使用量非常广泛
缓存,排行榜,打卡点赞,计数器等
对比redis的RDB、AOF模式的优缺点
RDB优缺点
优点:
可以通过命令bgsave(非阻塞)或save(阻塞)自定义时间备份,较完整保存数据。
主进程fork出子进程进行数据保存工作,最大化redis性能
大量数据保存优于AOF
缺点:
无法实时保存数据
数据量过大时,父进程fork子进程进行保存至RDB文件时需要一点时间,消耗CPU性能
AOF优缺点
优点
数据安全性较高,fsync策略默认每秒一次,线程后台执行性能较好
append模式记录日志文件,redis出现问题时不会破坏日志文件已存在内容,redis下次重启时会通过 redis-check-aof 工具来解决数据一致性的问题
Redis可以在 AOF文件体积变得过大时,自动地在后台对AOF进行重写,重写后的新AOF文件包含了恢复当前数据集所需的最小命令集合。整个重写操作是绝对安全的,因为Redis在创建新 AOF文件的过程中,append模式不断的将修改数据追加到现有的 AOF文件里面,即使重写过程中发生停机,现有的 AOF文件也不会丢失。而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新AOF文件,并开始对新AOF文件进行追加操作。
AOF包含一个格式清晰、易于理解的日志文件用于记录所有的修改操作。事实上,也可以通过该文件完成数据的重建
缺点
即使有些操作是重复的也会全部记录,AOF 的文件大小要大于 RDB 格式的文件
AOF 在恢复大数据集时的速度比 RDB 的恢复速度要慢
根据fsync策略不同,AOF速度可能会慢于RDB
bug 出现的可能性更多
实现redis哨兵,模拟master故障场景
修改配置文件
[root@localhost ~]# vim /etc/redis.conf #修改以下内容
bind 0.0.0.0
logfile "/apps/redis/log/redis.log"
save 30 1
save 300 100
save 6000 10000
dir /data/rdb
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
masterauth "123456"
requirepass "123456"
appendonly yes
appendfilename "appendonly.aof"
slave节点修改指定master参数
replicaof 10.0.0.18 6379
redis-sentinel.conf文件主从相同
[root@localhost ~]# grep -Ev "^#|^$" /etc/redis-sentinel.conf
port 26379
daemonize no
pidfile /var/run/redis-sentinel.pid
logfile "/var/log/redis-sentinel.log"
dir /tmp
sentinel monitor mymaster 10.0.0.18 6379 2
sentinel auth-pass mymaster 123456
sentinel down-after-milliseconds mymaster 3000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
logfile /var/log/redis/sentinel.log
开启服务
[root@localhost ~]# systemctl start redis redis-sentinel.service
测试:
[root@localhost ~]# tail -f /var/log/redis/sentinel.log
1764:X 03 Oct 2022 06:34:34.143 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1764:X 03 Oct 2022 06:34:34.143 # Redis version=5.0.3, bits=64, commit=00000000, modified=0, pid=1764, just started
1764:X 03 Oct 2022 06:34:34.143 # Configuration loaded
1764:X 03 Oct 2022 06:34:34.143 * supervised by systemd, will signal readiness
1764:X 03 Oct 2022 06:34:34.144 * Running mode=sentinel, port=26379.
1764:X 03 Oct 2022 06:34:34.144 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
1764:X 03 Oct 2022 06:34:34.152 # Sentinel ID is 991e766d2a2196b4ed2d6457c99c4535f2361182
1764:X 03 Oct 2022 06:34:34.152 # +monitor master mymaster 10.0.0.18 6379 quorum 2
1764:X 03 Oct 2022 06:34:36.170 * +sentinel sentinel 12001eaedbb47f69d98fd60257b1c9eadbaa3035 10.0.0.38 26379 @ mymaster 10.0.0.18 6379
1764:X 03 Oct 2022 06:34:36.207 * +sentinel sentinel 5f0e23a6dad29efc2d4a15c232ba6121166129d4 10.0.0.28 26379 @ mymaster 10.0.0.18 6379
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=10.0.0.28,port=6379,state=online,offset=0,lag=0
slave1:ip=10.0.0.38,port=6379,state=online,offset=0,lag=0
master_replid:8fa7b49863b4fc961a5e4adcf363132dc70fa709
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:0
模拟master故障
[root@localhost ~]# redis-cli -a 123456
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
127.0.0.1:6379> shutdown
[root@localhost ~]# tail -f /var/log/redis/sentinel.log
1229:X 03 Oct 2022 07:04:40.529 # +odown master mymaster 10.0.0.18 6379 #quorum 3/2
1229:X 03 Oct 2022 07:04:40.529 # Next failover delay: I will not start a failover before Mon Oct 3 07:10:39 2022
1229:X 03 Oct 2022 07:04:40.628 # +config-update-from sentinel 5f0e23a6dad29efc2d4a15c232ba6121166129d4 10.0.0.28 26379 @ mymaster 10.0.0.18 6379
1229:X 03 Oct 2022 07:04:40.628 # +switch-master mymaster 10.0.0.18 6379 10.0.0.38 6379
1229:X 03 Oct 2022 07:04:40.629 * +slave slave 10.0.0.28:6379 10.0.0.28 6379 @ mymaster 10.0.0.38 6379
1229:X 03 Oct 2022 07:04:40.629 * +slave slave 10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.38 6379
1229:X 03 Oct 2022 07:04:43.643 # +sdown slave 10.0.0.18:6379 10.0.0.18 6379 @ mymaster 10.0.0.38 6379
查看新master节点
[root@localhost ~]# redis-cli -h 10.0.0.38 -p 6379 -a 123456 info replication
Warning: Using a password with '-a' or '-u' option on the command line interface may not be safe.
# Replication
role:master
connected_slaves:1
slave0:ip=10.0.0.28,port=6379,state=online,offset=422,lag=0
master_replid:e9835caa7f8fe01efc44510b520dc681e87c9bed
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:422
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:422
标签:AOF,127.0,6379,--,Redis,redis,0.1,关系数据库,root
From: https://www.cnblogs.com/N62030/p/17296626.html