Redis

Redis(Remote dictionary server)简介

  • 基于内存的数据存储系统,可用于数据库缓存和消息队列等场景
  • 传统Mysql,访问数量大,由于磁盘IO的读写操作速度导致性能受限
  • 所支持的数据类型
    • 字符串String
    • 列表 List
    • 集合 Set
    • 有序集合 SortedSet
    • 哈希 Hash
    • 消息队列 Stream
    • 地理空间 Geospatial
    • Hyperloglog
    • 位图 Bitmap
    • 位域 Bitfield
  • 使用方式
    • CLI(Command Line Interface)命令行界面
    • API(Application Programming Interface)应用程序接口
    • GUI(Graphical User Interface)图形用户界面 Redisinsight
  • 特点
    • 性能极高
    • 数据类型丰富,单键值对最大支持512M大小的数据
    • 简单易用,支持所有主流编程语言
    • 支持数据持久化、主从复制、哨兵模式等高可用特性

安装配置

  • WSL
  • Docker
  • windows安装文件(老版本)

  • linux或mac打开终端,输入redis-server
  • windows,打开powerShell或命令行终端窗口,执行redis-server.exe命令就可以了。
  • 手动停止服务:Ctrl+C或者直接关闭终端。
  • 启动redis客户端的命令是redis-cli,由此进行操作。

Redis命令学习

字符串-String
redis-cli
SET name geekhour    #设置键值对
GET name             #根据键获取值
DEL name             #删除
EXISTS name          #判断是否存在
KEYS *               #查看数据库中都有哪些键(*表示所有)
KEYS *me             #表示查找所有以me结尾的键
FLUSHALL             #删除所有键
SET chinese 中文
GET chinese          #显示出来是十六进制的数据
如果想要正常显示,先把这个redis停掉,用quit,然后重新登陆
redis-cli --raw      #--raw表示以原始的形式显示内容
clear                #清空屏幕
#设置带有过期时间的键值对
EXPIRE name 10       #设置name的过期时间为10s
TTL name             #查看name还有多久过期,-1表示没有设置过期时间,-2表示已过期
SETEX name 5 cc      #SETEX 键 过期时间 值
SETNX key value      #键不存在才设置键值对,键已经存在的话不做任何操作
  • redis中的键是区分大小写的。
  • redis中默认使用字符串来存储数据,而且是二进制安全的。
列表 List
  • 用于存储和操作一组有顺序的数据。
  • 可以使用LPUSH或者RPUSH命令来将元素添加到列表的头部或者尾部。
  • 如果想要获取列表内容,使用LRANGE命令
    • LRANGE 列表名称 起始位置 终止位置,起始位置第一个为0,终止位置如果为-1表示到列表的最后一个。
  • 可以使用LPOP和RPOP命令从列表的头部和尾部删除元素。
LPUSH letter a
LRANGE letter 0 -1  #"a"
LPUSH letter b c d  #一次性添加多个元素
RPUSH letter f       #列表得到顺序 d c b a f
RPOP letter         #"f"
LPOP letter 2       #"d" "c" 删除多个元素
LLEN letter         #获取列表的长度
LTRIM letter 1 3    #修剪范围以外的元素,比如原来为e d c b a,修建后为d c b
集合 Set
  • 一种无序集合,它和列表的区别在于列表中的元素都是可以重复的,而SET中的元素是不能重复的。
  • SADD命令用于向SET中添加一个元素。
SADD course Redis   #返回1表示添加成功了
SMEMBERS course     #查看集合中所有元素。"Redis"
SADD course Redis   #返回0表示添加失败,因为不能重复
SISMEMBER course Redis #判断元素是不是在集合中
SREM course Redis   #删除元素
SINTER
SUNION
SDIFF
有序集合 SortedSet
  • 和集合的区别是,有序集合的每个元素都会关联一个浮点类型的分数,然后按照这个分数来对集合中的元素进行从小到大的排序。有序集合的元素是唯一的,但是分数是可以重复的。
ZADD result 680 清华 660 北大 650 复旦 640 浙大  # 4
ZRANGE result 0 -1   # 浙大 复旦 北大 清华
ZRANGE result 0 -1 WITHSCORES # 浙大 640。。。带着分数一起查看有序集合
ZSCORE result 清华             # 680  查看分数
ZRANK result 清华              # 3    查看排名
ZREVRANK result 清华           # 0    查看排名(反转,从大到小排序)
ZREM result 清华
哈希 Hash
  • 字符类型的字段和值的映射表,键值对的集合
HSET person name laoyang
HSET person age 100
HGET person name
HGETALL person     # 得到所有键值对
HDEL person age    # 删除
HEXISTS person name  # 查看person集合中键name是否存在,存在为1,不存在为0
HKEYS person       # 获取哈希中所有的键
HLEN person        # 获取哈希的长度
发布订阅模式
  • Publish:发布 Subscribe:订阅
  • 消息无法持久化,无法记录历史消息
publish 频道名 发布的消息
subscribe 频道名
消息队列 Stream
# *表示自动生成一个消息的ID,添加消息的内容就是课程是Redis
XADD geekhour * course redis
XADD geekhour * course git
XADD geekhour * course docker
XLEN geekhour   # 用来查看消息的数量,一共3条
XRANGE geekhour - +   # 用来查看消息的详细内容,开始和结束用-和+表示所有的消息
XDEL geekhour 消息的ID # 删除消息
XTRIM geekhour MAXLEN 0 # 删除消息,MAXLEN 0表示删除所有的消息。
XADD geekhour 1-0 course redis  # ID的格式是一个整数加上一个短横线,再加上一个整数,第一个整数表示一个时间戳,第二个整数表示一个序列号。
XREAD COUNT 2 BLOCK 1000 STREAMS geekhour 0  
  • 消息创建之后利用XREAD命令读取消息来消费,COUNT 2表示一次读取两条消息,BLOCK 1000表示如果没有消息的话就阻塞1秒,STREAMS后面加上消息的名称,0表示从头开始读取。
  • 如果想要获取从现在开始以后最新的消息,就可以把0改成$
XGROUP CREATE geekhour group1 0   # 创建消费者组,0是ID
XINFO GROUPS geekhour             # 查看消费者组
XGROUP CREATECONSUMER geekhour group1 consumer1  # 添加消费者
XREADGROUP GROUP group1 consumer1 COUNT 2 BLOCK 3000 STREAMS geekhour >
  • >表示从这个消息中读取最新的消息
地理空间 Geospatial
# 添加一个地理位置(地理位置名字 经度 纬度 城市名字),也可一次性添加多个地理位置信息
GEOADD city 116.405285 39.904989 beijing 
# 获取北京的经纬度
GEOPOS  city beijing 
# 计算两个地方的距离,默认单位为m
GEODIST city beijing shanghai
GEODIST city beijing shanghai KM
# 范围以上海为中心,距离其为300KM以内的城市
GEOSEARCH city FROMMEMBER shanghai BYRADIUS 300 KM
HyperLogLog
  • 是一种用来做基数统计的算法。
  • 如果集合中的每个元素都是唯一且不重复的,那么这个集合的基数就是集合中元素的个数。
  • HyperLogLog使用随机算法来计算,通过牺牲一定的精确度来换取更小的内存消耗。所以占用内存小,但存在误差,适合对精确度要求不高,且数据量大的统计工作。
PFADD course git docker redis
PFCOUNT course  # 3
PFADD course2 python
# 合并course和course2,然后将结果放在result中
PFMERGE result course course2 
位图 Bitmap
  • 位图是字符串类型的扩展,可以使用一个String类型来模拟一个Bit数组,数组的下标就是偏移量,只有0和1。
SETBIT dianzan 0 1
SETBIT dianzan 1 0
GETBIT dianzan 0  # 1
SET dianzan "\xF0" 11110000
GETBIT dianzan 0 # 1
GETBIT dianzan 1 # 1
GETBIT dianzan 2 # 1
GETBIT dianzan 3 # 1
GETBIT dianzan 4 # 0
GETBIT dianzan 5 # 0
BITCOUNT dianzan # 4个bit为1
# 获取第一个出现0或1的位置
BITPOS dianzan 0 # 4
BITPOS dianzan 0 开始 结束
位域 Bitfield
  • 位域能够将很多小的整数存储到一个较大的位图中,以此高效使用内存。
# u8表示一个8位无符号整数,表示等级。#0表示第一个位置,
BITFIELD player:1 set u8 #0 1
GET player:1
BITFIELD player:1 get u8 #0  # 1
BITFIELD player:1 set u32 #1 100 # 100转化成字符型存储就是d 'd'的ASC码就是100
GET player:1
BITFIELD player:1 incrby u32 #1 100 #增加100金币
Redis 事务
MULTI # 开启事务

SET
LPUSH
SADD # 全都放到队列中

EXEC/DISCARD # 执行所有命令

在Redis中,事务并不能保证所有的命令执行成功,它的执行结果取决于事务中的命令。Redis事务保证以下三点:1、在发送EXEC命令之前,所有的命令都会被放入到一个队列中缓存起来,不会立即执行。2、在收到EXEC命令之后,事务开始执行,事务中的任何一个命令执行失败,其他命令依然会被执行。3、在事务执行过程中,其他客户端提交的命令请求并不会插入到事务的执行命令序列中。

Redis持久化
  • Redis基于内存,如果没有持久化,一旦服务器重启或断电,之前所有的数据就会丢失。
  • 两种方式
  • RDB(Redis Database):在指定时间间隔内,将内存中的数据快照写入磁盘,它是某一个时间点上数据的完整副本,可以通过配置文件中的save参数来配置,后面的参数是时间和修改次数的组合,第一个参数表示秒数,第二个参数表示修改次数。
    • save 3600 1
    • 上面表示3600秒内只要有1次修改就进行一次快照。
    • 除了使用配置文件来触发快照之外,还可以使用save命令来手工触发快照,直接在命令行输入save。
    • 内存中数据同步到硬盘这个过程持续时间长,这段时间内Redis都是处于一个阻塞的状态,不能接受任何请求,因此Redis又提供了一个叫做bgsave的命令,这个命令会单独创建一个子进程,来负责将内存中的数据写入到硬盘里,这样的话主进程就可以继续处理请求了,但是这个过程中还会有一定的性能损耗。

  • AOF(Append Only File)
  • 追加文件
  • 在执行写命令时,不仅会将命令写入到内存中,还会将命令写入到一个追加的文件中(AOF)。它会以日志的形式来记录每一个写操作,当Redis重启时,就会通过重新执行AOF文件中的命令来在内存中重建整个数据库的内容。
  • 只需要在配置文件中将appendonly这个参数的值改成yes。
主从复制
  • 是指将一台Redis服务器里的数据复制到其他Redis服务器,也叫主节点和从节点。

  • 一个主节点可以有多个从节点,而每一个从节点只能有一个主节点。

  • 主到从复制,一般来说,主节点负责写操作,从节点负责读操作。

  • 修改从节点的配置

  • 在这里插入图片描述

  • Redis的配置文件是redis.conf这个文件,一般在redis的安装目录下,将配置文件复制到根目录一份

    • 修改端口号为6380
    • 将pidfile /var/run/redis_6379.pid修改为pidfile /var/run/redis_6380.pid
    • 将dbfilename dump.rdb修改为dbfilename dump-6380.rdb
    • 添加 replicaof 127.0.0.1 6379 表示现在配置的节点为6379的从节点。
    • 启动从节点服务器 redis-server redis-6380.conf
    • 启动客户端 redis-cli -p 6380
    • 通过info replication可以查看该节点的信息。
哨兵模式 Sentinel
  • 哨兵会以一个独立的进程运行在Redis集群中,用来监控Redis集群中的各个节点是否运行正常,它主要用来执行下面几个功能
    • 第一个是监控,通过不断地发送命令来检查Redis节点是否正常。
    • 第二个就是通知,如果发现某个节点出了问题,那么哨兵就会通过发布订阅模式来通知其他节点。
    • 第三个就是自动故障转移,当主节点不能正常工作的时候,哨兵会开始一个自动故障转移的操作,它会将一个从节点升级为新的主节点,然后再将其他从节点指向新的主节点。
  • 配置哨兵模式
  • 首先在Redis集群中添加一个哨兵节点。
  • 添加一个配置文件sentinel.conf
    • sentinel monitor master 127.0.0.1 6379 1
    • 主节点的名称 IP 端口号 1表示只需要一个哨兵节点同意,就可以进行故障转移了。
  • 启动哨兵节点:redis-sentinel sentinel.conf
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值