Redis基本内容
Posted 尚墨1111
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Redis基本内容相关的知识,希望对你有一定的参考价值。
文章目录
redis
1 基本概念
linux系统部署:https://www.cnblogs.com/hunanzp/p/12304622.html
https://segmentfault.com/a/1190000023364209
redis-cli
redis-server
启动 Redis
redis-server
查看 redis 是否启动?
redis-cli
以上命令将打开以下终端:
redis 127.0.0.1:6379>
127.0.0.1 是本机 IP ,6379 是 redis 服务端口。现在我们输入 PING 命令。
redis 127.0.0.1:6379> ping
PONG
关闭redis服务
shutdown # 关闭redis
exit # 退出
2 数据类型
2.1 基本数据结构
String字符串
List列表:在redis里面,我们可以把list玩成 ,栈、队列、阻塞队列
-
相当于链表,消息排队、消息队列 (Lpush Rpop), 栈( Lpush Lpop)
-
命令以l开头,lpush、lrange、lindex
Set集合:无序不重复
- 命令以s开头,sadd、scard、sismember、smembers
- 交叉并集合,sdiff、sinter、sunion
Hash哈希:map集合key-value
- h开头,hset、hget、hgetall、hdel、hmset、hlen、hexists、hkeys、hvals
Zset有序集合
- z开头,zadd、zcount、zcard、zrange、zrangebyscore、zrem
2.2 特殊数据结构
geospatial 地理位置,底层是一个zset
- geo开头命令,geoadd、geodist、geohash、geopost、georadius、georadiusbymember
hyperloglog 不重复数字(基数)统计法
bitmap,二进制记录
- setbit、getbit、bitcount
3 事务
命令的集合,把所有命令组合成一个队列进行序列化,依次执行
multi(开启事务) set get add 等操作 exec(执行事务)
# discard 取消事务
# 中途编译型异常,队列中所有命令都不会执行,运行时异常,其他命令正常运行,出错的命令执行出错
监视器:watch
watch money
multi
# 执行各种对money的操作
# 如果中途有其他线程对money进行了修改,此时事务执行出错
exec
unwatch money # 需要先解除监视
watch money # 再获取最新的值,再执行事务
4 持久化(重点)
Redis 是内存数据库,如果不将内存中的数据库状态保存到磁盘,那么一旦服务器进程退出,服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能
- RDB:快照写入文档的持久化文档,保存到dump.rdb,rdb文件放在redis启动目录后启动时会自动检查dump.rdb并恢复其中的数据
- AOF,以日志的形式记录每一个写操作, 保存在appendonly.aof 文件,更靠谱,但是效率更低
比较:
RDB,建议只在Slave上持久化RDB文件。AOF用在主服务器数据备份
5 发布订阅
发布:publish channelName "message"
订阅:subscribe channelName
6 主从复制
主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点 (master/leader),后者称为从节点(slave/follower);数据的复制是单向的,只能由主节点到从节点。 Master以写为主,Slave 以读为主。
主从复制的作用主要包括:
1、数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。
2、故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务 的冗余。
3、负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务 (即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;在写 少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。
4、高可用(集群)基石:除了上述作用以外,主从复制还是哨兵和集群能够实施的基础,因此说主从复 制是Redis高可用的基础。
6.1 搭建主从结构
参考:https://segmentfault.com/a/1190000039242024
本文示例采用docker compose搭建一主两从的主从结构。
- 新建
docker-compose.yml
添加以下配置信息。
version: "3"
services:
redis-master:
image: redis:6.0
ports:
- "6379:6379"
container_name: "redis-master"
command: redis-server
networks:
- redis-master-slave
redis-slave-1:
image: redis:6.0
ports:
- "6380:6379"
container_name: "redis-slave-1"
command: redis-server --slaveof redis-master 6379
depends_on:
- redis-master
networks:
- redis-master-slave
redis-slave-2:
image: redis:6.0
ports:
- "6381:6379"
container_name: "redis-slave-2"
command: redis-server --slaveof redis-master 6379
depends_on:
- redis-master
networks:
- redis-master-slave
networks:
redis-master-slave:
- cd到当前目录,执行指令
docker-compose up
启动docker,效果如下:
打开新的窗口,redis-cli
连接redis服务,info replication
查看主从关系
6.2 测试数据同步
主机可以写,从机不能写只能读!主机中的所有信息和数据,都会自动被从机保存
redis-cli -p 6379 # 连接主机redis端口
redis-cli -p 6380 # 连接从机redis 端口
redis-cli -p 6381 # 连接从机redis 端口
主机可以正常的写和读
从机1号,不能写,但是主机上的更新马上会同步到从机上
从机2号,同样
界面显示
6.3 复制原理
源码分析可参考:https://segmentfault.com/a/1190000039242024
Slave 启动成功连接到 master 后会发送一个sync同步命令 Master 接到命令,启动后台的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行 完毕之后,master将传送整个数据文件到slave,并完成一次完全同步。
- 全量复制:而slave服务在接收到数据库文件数据后,将其存盘并加载到内存中。
- 增量复制:Master 继续将新的所有收集到的修改命令依次传给slave,完成同步 但是只要是重新连接master,一次完全同步(全量复制)将被自动执行! 我们的数据一定可以在从机中 看到!
6.4 哨兵模式
主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工 干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑 哨兵模式。
哨兵模式:后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
哨兵:独立的进程,监控redis服务的运行情况
- 通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
- 当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服 务器,修改配置文件,让它们切换主机。
单哨兵——多哨兵,单个哨兵检测到主机下线被称为“主观下线”,当一定数量的哨兵都认为主机下线时,进行一次投票,此时的主从切换称为“客观下线”
7 缓存穿透和雪崩
- 缓存穿透:缓存没有命中,都去查数据库了
- 缓存击穿:热点数据缓存过期,瞬间所有压力跑到数据库中
- 缓存雪崩:缓存集体失效(写入的缓存失效,或者缓存的服务器宕机),形成的压力波峰
解决方案:
- redis高可用,多增设几台redis,这样一台挂掉之后其他的还可以继续 工作,其实就是搭建的集群。
- 限流降级,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对 某个key只允许一个线程查询数据和写缓存,其他线程等待。
- 数据预热 ,数据加热的含义就是在正式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数 据就会加载到缓存中。在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让 缓存失效的时间点尽量均匀。
8 问题:
redis绑定的端口被占用,杀死进程
netstat -tulp|grep redis
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 11845/redis-server
tcp6 0 0 [::]:6379 [::]:* LISTEN 11845/redis-server
$ kill -9 11845
非root用户没有写入磁盘的权限,将写入操作关闭之后运行
# 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.
以上是关于Redis基本内容的主要内容,如果未能解决你的问题,请参考以下文章
REDIS09_HyperLogLog的概述基本命令UVPVDAUMAU首页UV如何进行统计处理
REDIS09_HyperLogLog的概述基本命令UVPVDAUMAU首页UV如何进行统计处理
REDIS05_HyperLogLog的概述基本命令UVPVDAUMAU首页UV如何进行统计处理