赞
踩
是一个高性能的 key-value数据库。
存在内存中
与其他 key-value 缓存产品有以下三个特点:
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
高性能
丰富的数据类型
原子性
丰富的特性
与传统数据库MySQL关系:
Redis是key-value数据库(NoSQL)的一种,MySQL是关系型数据库
Redis数据操作主要在内存,而MySQL主要存储在磁盘
Redis在某一场景使用中要明显优于MySQL,比如计数器,排行榜方面
Redis通常用于一些特定场景,需要与MySQL一起配合使用
注意:两者并不是相互替代和竞争关系,而是共用和配合
Linux环境安装redis必须先具备gcc编译环境
什么是gcc:是Linux下的一个编译程序,是c程序的编译工具。
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake yum -y install wget httpd-tools vim
在window上下载了redis后,使用xfile将其放到linux的 /opt 目录下
进入到 /opt 目录使用
tar-zxvf 你的redis压缩包
cd 到 解压后的 redis 目录
使用
make && make install
安装
会默认安装到
usr/local/bin
修改 redis7.conf 文件
让 redis 在后台启动
daemonize no 改为 daemonize yes
protected-mode yes 改为 protected-mode no
允许其他机器访问
注释 bind 127.0.0.1 -::1
设置redis访问密码
打开注释
requirepass 你的密码
运行redis服务器
redis-server /myredis/redis7.conf
出现如下报错:
67147:C 28 Oct 2023 20:46:34.584 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://githu
解决方法:
进入到 /etc/sysctl.conf 文件
添加
vm.overcommit_memory=1
使用命令:
vm.overcommit_memory=1
使配置文件生效
检查端口6379是否被占用:
ps -ef|grep redis|grep -v grep
启用redis
redis-cli -a 123456
测试
redis服务器关闭方法:
直接在端口号处 SHUTDOWN, 然后quit
远程关闭:
单实例:
redis-cli -a 123456 shutdown
多实例:
redis-cli -a 123456 -p 希望关闭的端口号 shutdown
同时设置/获取多个键值
mset
mget
msetnx(可以理解为事务整体,成功则全成功,失败一个则全部失败)
获取指定区间范围内的值
getrange
setrange
数值增减(一定要是数字)
递增数字:INCR key
增加指定的整数:INCRBY Key increment(比如:INCRBY key1 5)
递减数值 DECR key
减少指定的整数 DECR key decrement
获取字符串长度和内容追加:
STRLEN key
APPEND key value
分布式锁
setnx key value
setex(set with expire)键秒值/setnx(set if not exist)
getset(先get再set)
是一个双端链表的结构容量是2的32次方-1大概40多个亿,主要功能有pop/push等,一般用在栈,消息队列等
lpush/rpush/lrange
lpop/rpop
按照索引下标获得元素(从上到下); lindex
获取列表中元素个数; llen
删除N个值等于v1的元素; lrem key 数字N给定值v1
截取指定范围的值后再赋值给key ;ltrim key 开始index 结束1index
rpoploush 源列表 目的列表 (将源列表的末尾值pop,然后将该值添加到目的列表的头)
lset key index value
linsert key before/after 已有值 插入的新值
KV模式不变,但是v是一个新的键值对 Map<String, Map<String, object>>
hset/hget/hmset/hmget/hgetall/hdel
hlen 获取某个key内的全部数量
hexists key 在key里面某个值的key
hkeys/hvals
hincrby/hincrbyfloat
hsetnx
无序无重复
底层是哈希表实现
单值多value,且无重复
SADD key member[member ...] 添加元素
SMEMBERS key 遍历集合中所有元素
SISMEMBER key member 判断元素是否在集合中
SREM key member[member ...] 删除元素
scard 获取集合里面的元素
SRANDMEMBER key [数字] 从集合中随机展现设置的数字个数元素,元素不删除
SPOP key[数字] 弹出栈
SMOVE key1 key2 在key1已存在的某个值 将key1里已存在某个值付给key2
集合运算
差集 A-B:属于A但不属于B的元素构成的集合 SDIFF keyA [keyB]
集合的并集运算 A ∪ B:属于 A或者属于B的元素构成的集合:SUNION keyA keyB
集合的交集运算 A ∩ B:A,B共有部分
SINTER key[key ...]
SINTERCARD numkeys key[key ...] [LIMIT limit] (不返回结果集,而只返回结果的基数。返回由所有给定集合的交集产生的集合的基数)
在set基础上,每个value值前加一个score分数值
添加元素:ZADD key score member [score member ...]
按照元素分数从小到大的顺序返回索引从start到stop之间所有元素:ZRANGE key start stop[WITHSCORES]
按照元素分数从大到小的顺序返回索引从start到stop之间所有元素:ZRERANGE key start stop[WITHSCORES]
获取指定分数范围的元素:ZRANGEBYSCORES key min max [WITHSCORES] [LIMIT offset count]
withscores
( 表示不包含
limit 作用是返回限制
ZSCORE key member 获取元素的分数
ZCARD key 获取集合中元素的数量
zrem key 某score下对应的value值,作用是删除元素
ZINCRBY key increment member 增加讴歌元素的分数,increment为增加分数值
ZCOUNT key min max 获得指定分数范围内的元素个数
ZMPOP 从键名列表中的第一个非空集排序集中弹出一个或者多个元素,他们是成员分数对
ZRANK key values值,获取下标
zrerank key values值, 逆序获得下标值
GEOADD 多个 经度、纬度、位置名称添加到指定的key中
出现中文乱码需要quit 在登录界面追加 --raw
redis-cli -a 123456 --raw
GEOPOS 从键里面返回所有给定位置元素的位置(经度和纬度)
GEOHASH 返回坐标的geohash表示
GEODIST 两个位置间的距离
GEORADIUS 以半径为中心查询xxx
GEORADIUSBYMEMBER
统计某个某个网站UV(UV:Unique Visitor,独立访客,一般理解为客户端ip => 进行去重考虑)
去重复统计功能的基数估计算法-HyperLogLog
PFADD key element[element ...] 添加指定元素
PFCOUNT key[key ...] 返回给定 HyperLogLog的基数估算值
PFMERGE destkey sourcekey [sourcekey ...] 合并多个HyperLogLog
是由0和1状态表现的二进制位的bit数组
用String 类型作为底层数据结构实现的一种统计二值状态的数据类型,位图本质是数组
setbit key offset value: 解释 setbit 键 偏移位 只能0 或1 btmap偏移量是从0开始的
getbit key
strlen 统计字节数占用多少(1bit 扩容)
bitcount 全部索引里面1占多少
bitop
将redis字符串看作是 一个由二进制位组成的数组 并且能对变长位宽和任意没有字节对齐的指定整型位域进行寻址和修改。
作用:
位域修改
溢出控制
基本命令:
BITFIELD key [GET type offset]
BITFIELD key [SET type offset value]
BITFIELD key [INCRBY type offset increment]
溢出控制 OVERFLOW [WRAR|SAT|FAI
就是redis版本的mq消息中间件
四个特殊符号:
- +: 最小和最大可能出现的id
$:表示只消费新的消息,当前流中最大的id,可用于将要来到的消息
>:用于 XREADGROUP命令,表示迄今还没有发送给组中使用者的信息,会更新消费组的最后ID
*:用于XADD命令中,让系统自动生成id
相关指令:
XADD:添加消息到队列末尾
消息id必须大于上个id
默认使用星号表示自动生成规矩
* 用于XADD命令中,让系统自动生成id
XRANGE:用于获取消息列表(可以指定范围),忽略删除的消息
start 表示开始值,-代表最小值
end 表示结束值,+代表最大值
count 表示最多获取多少个值
XREVRANGE
XDEL
XLEN 用于获取Stream队列的消息长度
XTRIM
用于对stream的长度进行截取,如超长会进行截取
MAXLEN 允许最大长度,对流进行修剪,限制长度
MINID 允许的最小id,从某个id值开始比该id值小将会被抛弃
XREAD
用于获取消息(阻塞/非阻塞),只会返回大于指定id的消息
非阻塞
阻塞
XGROUP CREATE 用于创建消费者组
XREADGROUP GROUP
">" 表示从第一条尚未被消费的消息开始读取
消费组groupA内的消费组consumer1从mystream消息队列中读取所有消息
但是,不同消费组的消费者可以消费同一条消息
XPENDING 查询每个消费组内所有消费者[已读取,但尚未确认] 的消息
XACK 像消息队列确认消息已经处理完成
keys *:查看当前库所有的key
exists key:判断某个key是否存在
type key:查看你的key是什么类型
del key:删除指定的key数据
注意:
命令不区分大小写,而是key区分大小写
帮助命令 help @类型
flushdb:清除当前数据库
flushall:通杀全部数据库
注意:
命令不区分大小写,而是key区分大小写
帮助命令 help @类型
持化双雄:
RDB (Redis DataBase)
如何恢复:
将备份文件(dump.rdb)移动到 redis 安装目录并启动服务即可
备份成功后故意用flushdb清空redis 看看是否可以恢复数据 => 结论:执行flushshell/flushdb命令也会产生dump.rdb文件,但里面是空的,无意义
物理恢复,一定服务和备份分机隔离
手动:Redis提供了两个命令来生产RDB文件,分别是save和bgsave
save:在主程序中执行会阻塞当前redis服务器,知道持久化工作完成执行save命令期间,Redis不能处理其他命令,线上禁止使用。
rdb修复文件,
redis-check-rdb
如何禁用快照:
动态所有停止RDB保存规则的方法:
redis-cli config set save ""
配置文件修改
总结:
AOF(Append Only File)
aof是什么:
默认情况下,redis是没有开启AOF的,开启AOF功能需要设置配置: appendonly yes
aof保存文件是appendonly.aof
工作流程:
三种写回策略:
Always:同步写回,每个命令执行完立刻同步地将日志写回磁盘
everysec:每秒写回,每个命令执行完,只是先把日志写到AOF文件的内存缓冲区,每隔一秒把缓冲区内容写入磁盘
no:操作系统控制的写回,每个写回命令执行完,只是先把日志写回到AOF文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘
纯缓存模式:
同时关闭RDB和AOF
save"" 禁用rdb,我们仍然可以使用命令 save,bgsave生成rdb文件
appendonly no 禁用aof,我们仍然可以使用命令 bgrewiteaof 生成aof文件
是什么
可以1次执行多个命令,本质是一组命令集合,一个事务中的所有命令都会序列化,按顺序的串行化执行而不会被其他命令插入,不允许加塞
能干嘛
一个队列中,一次性、顺序性、排他性的执行一系列命令
和传统数据库比较:
使用:
常用命令:
正常执行:(MULTI, EXEC)
放弃事务:(MULTI, DISCARD)
全体连坐
冤有头债有主(类似于runtime error, redis不是完全的事务一致性,而且redis没有回滚)
watch监控 :
Redis使用Watch来提供乐观锁定,类似于CAS(check and set)
悲观锁
乐观锁
watch:
总结:
开启:以MULTI开启一个事务
入队:将多个命令入队到事务中,接到这些命令并不会立即执行,而是放到等待执行的事务队列里
执行:由EXEC命令触发事务
是什么:批处理命令变种优化措施,类似于Redis的原生批命令(mget和mset)
小总结:
Pipeline与原生批量命令对比:
原生批量命令是原子性(mset等),pipeline是非原子性
原生批量命令一次只能执行一种命令,pipeline支持批量执行不同命令
原生批命令是服务端实现,而pipeline需要服务端和客户端共同完成
Pipeline与事务对比
是什么:
主从复制,master以写为主,Slave以读为主
当master数据发生变化的时候,自动将更新的数据异步同步到其他slave数据库
能干嘛
读写分离
容灾恢复
数据备份
水平扩容,支撑高并发
哨兵的作用
监控redis运行状态,包括master和slave
当master宕机后,自动将slave切换成新的master
能干嘛:
主从监控:监控主从redis库运行是否正常
消息通知:哨兵可以将故障转移的结果发送给客户端
故障转移:如果Master异常,则会进行主从切换,将其中一个Slave作为新的Master
配置中心:客户端通过连接哨兵来获取当前Redis服务的主节点地址
哨兵一般是集群存在,多数判断master宕机才进行选举
怎么使用:
配从库不配主库
权限细节:
master如果配置了 requirepass参数,需要密码登录
slave 就要配置 masterauth 来设置校验密码,否则的话master会拒绝slave的访问请求
基本操作命令
info replication 可以查看复制节点的主从关系和配置信息
replicaof 主库IP 主库端口
一般写入到redis.conf配置文件内
slaveof 主库IP 主库端口
slaveof no one
使当前数据库停止与其他数据库的同步,转成主数据库
缺点:
复制延时,信号衰减
master挂了,从机会等待
ODown客观下线
当主节点被判断为客观下线后,集群选出一个哨兵领导来做故障迁移
由领导哨兵开始推动故障切换流程并选出一个新master:
新主登基:
某个Slave被选为新master
群臣俯首:
旧主拜服
定义:由于数据量过大,单个master复制集团难以承担,因此需要对多个复制集进行集群,形成水平扩展每个复制集只负责存储整个数据集的一部分,这就是Redis的集群,其作用是提供在多个Redis节点间共享数据的程序集。
集群可以支持多个Master
总体概述:jedis-lettuce-RedisTemplate三者的联系
集成Jedis:
是什么:
步骤:
建module
改POM
写YML
主启动
业务类
集成lettuce
能干嘛:
Redis集群支持多个Master,每个Master又可以挂载多个Slave
读写分离
支持数据的高可用
支持海量数据的读写存储操作
由于Cluster自带Sentinel的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能
客户端与Redis的节点链接,不再需要连接集群中所有节点,只需要任意连接集群中的一个可用节点即可
槽位slot负责分配到各个物理服务节点,由对应的集群来负责维护节点、插槽和数据之间的关系
集群算法-分片-槽位slot
redis集群的槽位slot
redis集群的分片
优势:
方便扩容、缩容和数据查找
slot槽位映射,一般业界有三种解决方案:
哈希取余分区
优点
缺点
一致性哈希算法分区
是什么:分布式缓存数据 变动和映射问题,某个机器宕机了,分母数量改变了,自然取余数不ok了
能干嘛:提出一致性Hash解决方案。目的是当服务器个数发生变化时,尽量减少影响客户端到服务器的映射关系
三大步骤:
算法构建一致性哈希环
服务器IP节点映射
key落到服务器的落键规则
一致性哈希算法容错性
一致性哈算算法的扩展性
缺点:Hash环的数据倾斜问题
哈希槽分区
为什么redis集群的最大槽数是16384个
Redis集群 不保证强一致性,这意味着在特定条件下,Redis集群可能会丢掉一些被系统收到的写入请求命令
集群环境案例步骤
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。