Redis6课程笔记

1准备工作

启动进入到:/usr/local/bin

开启服务(指定配置文件启动):redis-server /etc/redis.conf

开启客户端:redis-cil

退出客户端:redis-cli shutdown(先退出操作界面:exit)

查看进程:ps -ef|grep redis

特点:单线程+多路IO复用

在这里插入图片描述

2命令

命令 说明
set key value 设置键值
setnx key value 只有在key不存在的时候才设置值
mset key value key value … 设置多个key value值
msetnx key value key value … 设置多个key value值,一个存在,则全部set失败
setrange key 位置 值 给指定位置插入值
setex key 过期时间 value 加入过期时间的set值
getset key value 以新换旧,设置新值的同时获得旧值
get key 获得对应key 的 value
getrange key 起始位置 结束位置 起始0,或者value的范围值
mget key key 获得多个value值
append key value 追加指定的value 到 key 末尾
keys 查询库中所以的key
exists key 存在key?存在1 不存在0
type key key 的 类型
setnx key value 获得值得长度
del key 删除指定的key数据
unlink key 非阻塞删除,后台进行异步删除
expire key 10 10s后过期
ttl key 查看还有多少s过期,-1永不过期,-2已过
incr key 让该key对应得数字值value+1
decr key 让该key对应得数字值value+1
incrby/decrby key 步长 让该key应得数字值value增减指定的步长
select 0-15 选择0-15的一个库
dbsize 查看当前库的key数量
flushdb 清空当前库
flushall 通杀全部库

String 类型是二进制安全的意味着Redis的string可以包含任何数据,比如jpg图片,或者序列化的对象,最多可以是512M

List列表

lpush/rpush key value value 从左边/右边插入一个或多个值
**lpop/rpop key ** 从左边/右边吐出一个值.值在键在,值光键亡
rpoplpush key1 key2 k1列表右边吐出一个值放到k2列表的左边
lrange key start stop 按照索引下标获得元素(左到右)0 -1表示获取所有
lindex key index 获得指定索引的value(左到右)
llen key 获得列表长度
linsert key before value newvalue 在value的后面插入新的value值
lrem key n value 从左边删除n个value(左到右)
lset key index value 将指定索引的值替换成value

set集合

Set 数据结构是dict字典,字典是用hash表实现的.通过hash表快速查询

sadd key value1 value2 … 添加值(已经存在的member元素会被忽略)
smembers key 取出集合中的所有值
sismember key value 判断集合key中是否含有该value值
scard key 返回该集合元素个数
srem key value1 value2 … 删除集合中的某个元素
spop key 随机从集合中吐出一个值
srandmember key n 随机从该集合中取出n个值
smove key1 key2 value 把key1集合中的一个值从一个集合移动到key2集合
sinter key1 key2 返回俩个集合的交集
sunion key1 key2 返回俩个集合的并集
sdiff key1 key2 返回俩个集合的差集元素(key1中的,不包含key2中的)

hash集合

hset key field value 给key集合的field 赋值value
hmset key field1 value1 field2 value2 … 给key集合赋多个值
hget key field 在key集合中取出指定field的值
hexists key field 判断存在
hkeys key 列出该hash集合的所有field
hvals key 列出该hash集合的所有fvalue
hincrby key field increment 为hash表key中的域field的值加上增量1 -1
hsetnx key field value 将hash表key中的域field的值设置为value,当且仅当域field不存在

Zset有序集合

没有重复元素,集合的成员是唯一的,但是评分是可以重复的

zadd key score1 value1 score2 value2 添加值,给定评分
zrange key start stop [withscores] 查看指定范围[带评分显示]
zrangebyscore key min max [withscores] [limit offset count] 查看min<=score<=max的value
zrevrangebyscore key min max 同上,从大到小排序
zincrby key increment value 为元素的score加上增亮
zrem key value 删除该集合下,指定值的元素
zcount key min max 统计该集合,分数区间内的元素个数
zrank key value 返回该值在集合中的排名,从0开始

3redis6新增数据类型

3.1HyperLogLog

面对基数问题,如:求集合不重复元素个数,独立访客数等,相比set等集合,节省了非常非常非常多的空间

pfadd key value1 value2 添加操作
pfcount key 查看数量
pfmerge newkey oldkey1 oldkey2 将一个或多个HLL合并后的结果存储在另一个HLL中

3.2GEO

GEO,Geographic,地理信息的缩写,元素的2维坐标,在地图上就是经纬度,有效经度在-180到180,有效纬度在-85.05112878到85.05112878,超出报错,

已经添加的数据无法再次添加

例如
geoadd key 经度 纬度 name 添加 geoadd china:city 121.47 31.23 shanghai
geopos key name 获得 geopos china:city shanghai
geodist key1 name1 name2 单位 获得俩个地方的直线距离 geodist china:city shanghai beijing km
georadius key 经度 纬度 距离 获得指定以指定经纬度为中心,获得指定范围内的城市 georadius china:city 110 30 1000km

4事务

命令队列,串联命令

1.从输入multi命令开始,输入的命令都会依次进入命令队列中,但不会执行,知道输入Exec后,Redis会将之前的命令队列中的命令依次执行

2(区别mysql).在组队阶段出现语法错误,执行exec命令后整个事务报错

在执行阶段出现的错误,只会影响对应命令的执行,其他命令正常执行

在这里插入图片描述

3.乐观锁实现事务!使用版本号机制,对数据绑定版本,修改数据后对应修改版本,在用户操作数据时会确认用户取到的key值版本与当前数据库key值版本是否一致,一致则事务执行成功,反之!

multi 开启事务队列
exec 执行事务队列
discard 取消事务队列
watch key1 key2 监视key:在执行multi之前,先执行watch key,可以监视指定的key,如果事务执行之前,这个key被其他命令所改动,那么事务被打断(乐观锁)
unwatch 取消监视

4.1事务三特性

1.单独的隔离操作:事务中的所有命令都会序列化,按顺序的执行.事务在执行的过程中,不会被其他客户端发来的命令请求所打断.

2.没有隔离级别的概念:队列中的命令没有提交之前都不会被实际执行,因为事务提交前任何指令都不会被实际执行

3.不保证原子性:事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚.


5主从复制

一台主机,多台从机

主机可以进行读写操作

从机只能进行读操作

若主机宕机,重启之后主机依然是关联之前的从机,数据信息恢复

若从机宕机,重启之后所以信息清空,失去主从关系,需要重新确立主从关系,并且复制主机的数据

薪火相传:从机可以成为其他从机的从机,也就是master->slave->slave->…

而不止是master一下拥有一堆slave,这样可以减轻主机的管理压力,但是相应的,如果其中一台slave宕机,则会影响后面slave的数据.

命令 说明
info replication 打印主从复制的相关信息
slaveof ip port 成为某个实例的从服务器
slaveof no one 将该从机变为主机(反客为主)

5.1哨兵模式

反客为主的自动版,能够后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库.

如何启用?

1

新建sentinel.conf 文件,内容为:

sentinel monitor mymaster 127.0.0.1 6379 1

其中mymaster为监控对象起的服务器名称(别名), 1 为至少有多少个哨兵同意迁移的数量(至少有1个哨兵响应了,就可以执行反客为主).

2

/usr/local/bin
redis做压测可以用自带的redis-benchmark工具
执行redis-sentinel sentinel.conf
在这里插入图片描述

怎么确定哪台从机反客成主机master?

1.先根据优先级别,启动服务的配置文件中优先级的:replica-priority 100

值越小优先级越高

2.偏移量:指获得原主机数据最全的.

3.runid:每个实例启动后都会随机生成一个40位的runid

集群

什么是集群?

集合群体,即用多个redis节点分摊单个节点的压力,

我们启动N个节点组成集群,那么我们数据就会分布存储在这N个节点中,每个节点存储1/N的数据量.

redis的每个节点都分布着均分的插槽(slot)数量,当我们存入数据时(set等操作),会生成插槽值,根据该插槽值将数据存放到对应的节点!


如何创建集群?

配置文件修改指定参数

daemonize yes 开启守护进程

cluster-enabled yes 打开集群模式

cluster-config-file nodes.conf 设定节点配置文件名

cluster-node-timeout 15000 设定节点失联时间(毫秒),节点自动进行主从切换

进入 /opt/redis-x.x.x/src 目录,输入命令

redis-cli --cluster create --cluster-replicas 1 IP:端口 IP:prot  IP:prot  IP:prot IP:prot  IP:prot

1,代表的是一台主机对应一台从机


命令

redis-cli -c -p 6379 -c采用集群策略连接
cluster nodes 查看集群信息
cluster getkeysinslot 返回count个solt槽中的键

不在一个solt下的键值,是不能使用mget,mset等多建操作的.

在这里插入图片描述

可以通过{}来定义组的概念,从而使key中{}内相同内容的键值对放到一个slot中去

在这里插入图片描述

说明

如果某一段插槽的主从都挂掉,而配置文件中的

cluster-require-full-coverage为yes,那么整个集群都会挂掉,反之.

也遵循反客为主,对于相同插槽的主从机!

猜你喜欢

转载自blog.csdn.net/CSDN13822805069/article/details/123283618