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如何进行统计处理

redis 源码阅读杂记

REDIS05_HyperLogLog的概述基本命令UVPVDAUMAU首页UV如何进行统计处理

REDIS05_HyperLogLog的概述基本命令UVPVDAUMAU首页UV如何进行统计处理

微服务 Spring Boot 整合 Redis BitMap 实现 签到与统计