redis
启动:
两种:
后台启动
cd /usr/local/soft/redis/bin :存放redis的地址。进入bin目录
nohup redis-server redis.conf & : 将日志放在bin目录下的nohup目录下
:注意不存放就直接将日志打印在控制台上
连接redis
redis-cli
redis-cli --help
rediscli -n 2
插入一条数据
set key1 value1
mset k1 v1 k2 v2 :代表可以多次存储
注意:如果存储同样的k 则会把新的value覆盖着旧的value上
查询数据
get key1
mget key1 key2 :代表可以多次取
keys pattern
pattern * 任意长度
? 任意一个字符
[]字符集合,表示可以是集合中的任意一个
例如:all1 1
all2 2
alt 3
keys * :就是查询所有
keys all*:就是查询all1,all2
keys all?:后面匹配一个
keys all[1,2]:查询all1,all2
查询所有
keys *
设置过期时间
set k value [选项]
选项
EX:代表秒
PX:代表毫秒
例如:set k v EX 5: 代表这条数据五秒后会被删除
查询当前redis占用端口号
ps -aux | grep redis
查询剩余时间
TLL Key
PTTL Key
key存在但没有设置TTL,返回 -1
key存在,但还在生存期内,返回剩余的秒或者毫秒
key曾经存在,但已经消亡,返回-2(2.8版本之前返回-1)
删除
del key
删除当前库中数据
fulshdb
删除所有库中数据
flushall
查询value长度
strlen key
追加
append k abc:表示在k后面追加abc
如果k是空,则追加就是添加abc,也就是创建abc
如果键存在就追加,如果不存在就创建
获取子字符串
getrange key start end
索引值从0开始,负数表示从字符串右边向左数起,-1表示最后一个字体
覆盖字符串
setrange key offset value
自增
incr key:自增一
decr key:自减一
字符串会报错
自定义自增
incrby key decrement
decrby key decrement
decrement代表改变的单位大小
位图bitmap
位图不是真正的数据类型,它是定义在字符串类型中
一个字符串类型的值最多能存储512字节的内容
位上限:2^(9+10+10+3)=2^32b
获取某一位上的值
getbit keuy offset
设置某一位上得值
setbit key offset value
offset偏移量,从0开始
value不写,,默认是0
例如:key a a的二进制(0110 0001)
设置setbit key 7 0
setbit key 6 1
则取key的直接就会变成b b的二进制(0110 0010)
返回指定值0或者1在指定区间上第一次出现的位置
bitpos key bit【start】【end】
位操作
对一个或多个保存二进制的字符串key进行位元操作,并将结果保存到dteskey上
bitop and destkey key【key ...】与 :对一个或多个key求逻辑并,将结果保存到destkey上
bitop or destkey key 【key...】或:
bitop xor destkey 【key...】 异或:
bitop not destkey key 【key ...】
除了not,其他都可以多个操作
当bitop处理不同长度的字符串是,较短的那个字符串所缺少的部分会被看作0
空的key也被看作是包含0的字符串序列
统计指定位区间上值为1的个数
bitcount key 【start】【end】
从左向右从0开始,从右向左从-1开始,注意官方start丶end
bitcount testkey 0 0表示从索引为0个字节,注意也就是八位为一字节
bitcount testkey 0 -1 等同于bitcount testkey
list列表
基于linked list实现
元素字符串类型
列表头尾增删快,中间增删慢,增删元素是常态
元素可以重复出现
最多报刊2^32-1元素
索引
从左至右,从0开始
从右至左,-1开始
存入数据
lpush key value 【value ...】 :从左往右压
lpushx key value
rpush key value 【value ... 】:从右往左压
rpush key value
左右或者头尾弹出元素
lpop key
rpop key
阻塞
如果弹出列表不存在或者为空,就会阻塞
超时时间设置为0,就是永久阻塞,直到有数据可以弹出
例如
blpop key【key...】timeout
brpop key 【key ...】timeout
例如:blpop k 5 就是等待五秒弹出,如果没有k中没有数据,就会阻塞
从一个列表尾部弹出元素压入另一个列表头部
rpoplpush source destination
从一个列表尾部阻塞弹出元素压入另一个列表头部
brpoplpush source detination timeout
返回列表中指定范围,也就是查询
lrange key start stop
lrange key 0 -1 表示返回所有元素
获取指定位置的元素
lindex key index
设置指定元素数据
lset key index value
列表长度,元素个数
llen key
从列表头部开始删除值等于value的元素count次
lrem key count value
count>0:从表头开始向表尾搜索,移除与value相等的元素,数量为count
count<0:从表尾开始向表头搜索,移除与value相等的元素,数量为count
例如:
lrem listkey 2 java ;从左开始删除value=java,两次
Hash存
hset key [属性] value
例如:hset student:1 id 123
hset student:1 name 张三
存储多个
hmset key 【属性】 value 【属性】 value ...
例如:
hmset student:1 ID 123 name 张三 sex 李四
hash取:
hget key [属性] value
例如:hget student:1 id
取多个:
hmget key 【属性】 value 【属性】 value ...
例如:
hmset student:1 ID name sex
set存取
sadd key member【member ...】
如果元素已存在,则自动忽略
例如
sadd friends peter
sadd friends java redis
移除一个或多个
srem key member 【member...】
srem friend peter
srem friend java redis
返回几个包含的所有元素
smembers key
例如:
smembers friend
如果集合元素过多,例如百万个,需要遍历,会造成阻塞
检查给定元素是否存在于集合中
sismember key member
例如:
sismembe friend java
随机返回集合中指定个数的
srandmember key count
count为正数,且小于集合基数,那么命令返回一个包含count个元素的数组,
数组中的元素各不相同。如果count大于等于集合基数,那么返回整个集合
count为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度
为count的绝对值
count=0 返回空
count不指定,随机返回一个元素
例如:
srandmember friend 3
srandmember friend -5
出栈
spop
set集合操作
差集
sdiff key1 [key...]
例如: a 1 2 3
b 1 4 5 那么sdiff a b = 2 3
sdiffstore destination key [key..] 将差集保存到destination中
交集
sinter key 【key...】
sinterstore destination key [key..] 将交集保存到destination中
例如: a 1 2 3
b 1 2 4 5 那么sdiff a b = 12
有序集合
增加一个或多个元素
zadd key score member 【score member...】
如果元素已存在,则使用新的score
zadd key 1 java 2Hadoop 3 python
移除一个或者多个元素
zrem key member【member...】
元素不存在,自动忽略
显示分值
zscore key member
举例 zcore key java
增加或者减少分值
zincrby key increment【member】
increment为负数就是减少
例如:
zincrby key 2 java
zincrby key -1 python
返回元素的排名(索引)
zrank key member
例如:
zrank key java
返回元素的逆序排名
zrevrank key member
返回指定索引区间元素
zrange key start stop 【withscores】
如果score相同,则按照字段序lexicographical order 排序
默认按照score从小到大,如果需要score从大到小排列,使用zrevrange
例如:
zrange key 0 2
返回指定分值区间元素(从小到大)
zrangebyscore key min max 【withscores】【limit offset count】
返回score默认属于【min,max】之间,元素按照score 升序排列,
limit中offset代表跳过多少个元素,count是返回几个。类似mysql
使用小括号,修改区间为开区间。例如(5,(10,5))
-inf和+inf表示负无穷和正无穷
例如:
zrangebyscore key 4 7
zrangebyscore key -inf +inf
返回指定分值区间元素(从大到小)
zrevrangebyscore key min max 【withscores】【limit offset count】
返回score默认属于【min,max】之间,元素按照score 升序排列,
limit中offset代表跳过多少个元素,count是返回几个。类似mysql
使用小括号,修改区间为开区间。例如(5,(10,5))
-inf和+inf表示负无穷和正无穷
例如:
zrevrangebyscore key 7 4
zrangebyscore key +inf -inf
移除指定排名范围的元素
zremrangebyrank key start stop
例如:
zremrangebyrank key 0 2
查询数据
zrange key start drop
什么是持久化
将数据从容易丢失的内存放到能够永久存储的设备上
Redis为什么需要持久化
Redis持久化方式
RDB(Redis DB)
AOF(AppendOnlyFile)
RDB
在默认情况下,Redis将数据库快照保存在名字为dump.rdb的二进制文件中
策略
自动:按照配置文件中的条件满足就执行BGSAVE
save 60 10000,Redis要满足在60秒内至少有10000个间被改动,会自动保存一次
手动:客户端发起SAVE,BGSAVE命令
SAVE命令
redis>save
阻塞Redis服务,无法响应客户端请求
创建新的dump.rdb替代旧文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YJUYqsoA-1639573471567)(E:\Type大数据笔记\图片\redis-save命令.jpg)]
BGSAVE命令
redis>bgsave
非阻塞,redis服务正常接收处理客户端请求
Redis会folk()一个新的子进程来创建RDB文件,子进程处理完后会向父进程发送一个信号,
通知它处理完毕
父进程用新的dump.rdb替代旧文件
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hNOthc9t-1639573471569)(E:\Type大数据笔记\图片\redis-bgsava命令.jpg)]
SAVE和BGSAVE命令
save不用创建新的进程,速度略快
bgsave需要创建子进程,消耗额外的内存
save适合停机维护,服务低谷时段
bgsava适合线上执行
Redis持久化-RDB
自动执行
本质上就是bgsave
默认配置
save 900 1
save 300 10
save 60 10000
dbfilename dump.rdb
dir/vas/lib/6379
只要三个条件满足一个,就自动备份(900 1 代表(改动一个文件,900秒后备份,备份后清零))
创建rdb文件之后,时间计数器和次数计算器会清零
redis持久化-RDB
优点
完全备份,不同时间的数据集备份可以做到多版本恢复
紧凑的单一文件,方便网络传输,适合灾难恢复
恢复大数据集速度较AOF快
缺点
会丢失最近写入,修改的而未能持久化的数据
folk过程非常耗时,会造成毫秒级不能响应客户端请求
Redis持久化-AOF
AOF
append only file ,采用追加的方式保存
默认文件appendonly.aof
记录所有的写操作命令,在服务启动的时候使用这些命令就可以还原数据库
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k5Kfx8uo-1639573471569)(E:\Type大数据笔记\图片\redis-aof.jpg)]
调整AOF持久化策略,可以在服务出现故障时,不丢失任何数据,也可以丢失一秒的数据
,相对RDB损失小得多
AOF写入机制
AOF方式不能保证绝对不丢失
目前常见的操作系统中,执行系统调用write函数,将一些内容写入到某个文件里面时,为了提高效率,
系统通常不会直接将内容写入硬盘里面,而是先将内容放入一个内存缓冲区(buffer)里面,等到缓冲区被填 满,
或者用户执行fsync调用fdatasync调用时才能将储存在缓冲区里的内容真正的写入到硬盘里,未写入磁盘之前,数据 可能会丢失
写入磁盘的策略
appendfsync选项,这个选项的值可以是always,everysec或者no
alway:服务器每写入一个命令,就调用一次fdatasync,将缓冲区里面的命令写入到硬盘,这种模式下服务器出现故障,也不会丢失任何成功执行的命令数据
everysec(默认):服务器每一秒重调用一次fdatasync,将缓冲区里面的命令写入到硬盘,这种模式下,
服务器出现故障,最多只丢失一秒的执行的命令数据
no:服务器不主动调用fdatasync,由操作系统决定何时将缓冲区里面的命令写入到硬盘,这种模式下,服务器遭遇意外停机时,丢失的命令数量时不确定的
运行速度:always的速度慢,everysec和no都很快
AOF重写机制
AOF文件过大
合并重复的操作,AOF会使用尽可能少的命令来记录
重写过程
folk一个子进程负责重写AOF文件
子进程会开辟一个内存缓冲区接收新的写命令
子进程重写完成后,父进程会获得一个信号,将父进程接收到新的写操作由子进程写入到临时文件中
新文件替代旧文件
注:如果写入操作的时候出现故障导致命令写半截。可以使用redis-check-aof工具修复
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q4cH2CrK-1639573471570)(E:\Type大数据笔记\图片\redis-aof-重写机制.jpg)]
AOF重写触发
手动:客户端向服务器发送bgwriteaof命令
自动:配置文件中的选项,自动执行bgewriteaof命令
auto-aof-rewrite-min-size<size>,触发AOF重写所需的最小体积:只要在AOF文件的体积大于 等于size时,才会考虑是否需要进行AOF重写,这个选项用于避免对体积过小的AOF文件进行重写
auto-aof-rewrite-percentage<percent>,指定触发重写所需的AOF文件体积百分比:当AOF文件的体积大于auto-aof-rewrite-min-size指定的体积,并且超过上一次重写之后的AOF文件体积的percent%时,就会触发AOF重写。(如果服务器刚启动不久,还没有进行过AOF重写,那么使用服务器启动时载入的AOF文件的体积来作为基准值)。将这个值设置为0表示关闭自动AOF重写
AOF重写配置举例
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
当AOF文件大于64mb时候,可以考虑重写aof文件
appendonly yes
默认关闭,请开启
优点
写入机制,默认fysnc每秒执行,性能很好不阻塞服务,最多丢失一秒的数据
重写机制,优化AOF文件
如果误操作了(flushall等),只要AOF未被重写,停止服务移除AOF文件尾部
flushall命令,重启redis,可以将数据恢复到flushall执行之前的状态
缺点
相同数据集,aof文件体积较rdb大了很多
恢复数据库速度叫rdb慢
REDIS集群
集群分类
主从复制 Replication
集群 cluster
主从复制Replication
一个redis服务可以有多个该服务的复制品,这个redis服务称为master,其他复制品称为slaves
只要网络连接正常,master会一直将自己的数据更新同步给slaves,保持主从同步
只有master可以执行写命令,slaves只能执行读命令
在已启动成功之后也可以将主改成从
slaveof master 6379
从改成主 --数据不会删除
slaveof no one
启动六台redis集群(这是我自己虚拟机配置的)
1.在master中执行
cd /usr/local/soft/redis-cluster/7000/bin ./redis-server redis.conf
cd /usr/local/soft/redis-cluster/7001/bin ./redis-server redis.conf
2.在node1中执行
cd /usr/local/soft/redis-cluster/7002/bin ./redis-server redis.conf
cd /usr/local/soft/redis-cluster/7003/bin ./redis-server redis.conf
3.在node2中执行
cd /usr/local/soft/redis-cluster/7004/bin ./redis-server redis.conf
cd /usr/local/soft/redis-cluster/7005/bin ./redis-server redis.conf
redis-trib create --replicas 1 192.168.186.130:7000 192.168.186.130:7001 192.1
68.186.131:7002 192.168.186.131:7003 192.168.186.132:7004 192.168.186.132:7005
客户端访问redis集群
-p 端口号 -h 节点ip -c 自动重定向
redis-cli -p 7000 -h 192.168.186.130 -c
查看集群信息
cluster info
查看节点信息
cluster nodes
Redis集群分片
集群将整个数据库分为16384个槽位slot中的一个,key的槽位计算公式为slot_number=crc16(key)%16384,其中crc16位的循环冗余校验和函数
集群中的每个主节点都可以处理0个至16383个槽,当16383个槽都有某个节点在负责处理时,集群进入上线状态,并开始处理客户端发送的数据命令请求
举例
三个主节点7000,7001,7002平均分片16383个slot槽位
节点7000指派的槽位为0到5460
节点7001指派的槽位为5461到10922
节点7002指派的槽位为10923到16383
Redis集群总结
redis集群是一个由多个节点组成的分布式集群,它具有复制丶高可用丶和分片特性
redis的集群没有中心节点,并且带有复制和故障转移特性,这可用避免单个节点成为性能瓶颈,
或者因为某个节点下线而导致整个集群下线
集群中的主节点负责处理槽(存储数据),从而节点则是主节点的复制品
redis集群将整个数据库分为16384个槽,数据库中的每个键都属于16384个槽中的其中一个
集群中的每个主节点都可以负责0个至16384个槽,当16384个槽都有节点在负责时,集群进入上线状态
,可以执行客户端发送的数据命令
主节点只会执行和自己负责的槽有关的命令,当节点接收到不属于自己处理的槽命令时,它将会处理指定槽
的节点的地址返回给客户端,而客户端会向正确的节点重新发送